编程语言
首页 > 编程语言> > Javascript:CSS变换透视图的矩阵运算

Javascript:CSS变换透视图的矩阵运算

作者:互联网

我正在使用声称实现the spec中所述的matrix3d操作的this script,但是该脚本缺少矩阵透视图操作,因此我“煮熟了”我不确定是正确还是正确的东西.

// the perspective matrix to multiply with
CSSMatrix.Perspective = function(x, y, z){
  var m = new CSSMatrix();
  m.m13 = x;
  m.m23 = y;
  m.m33 = z;
  return m;
};

以及使用此矩阵的方法

// myMatrix.perspective(x,y,z); to apply a perspective matrix
CSSMatrix.prototype.perspective = function(x, y, z){
  if (y == null) y = 0;
  if (z == null) z = 0;
  return CSSMatrix.multiply(this, CSSMatrix.Perspective(x, y, z));
};

我的问题是,如果y和z未定义,应使用什么值?就像在上面的代码中x用于所有其他轴的情况下旋转还是在上面的代码中为0(零)?

我也不确定CSSMatrix.Perspective矩阵是否按照规范中的描述正确编写并实现到CSSMatrix原型中.

更新:
我发现了透视图函数的另一种实现方式(请参见下文),并创建了fiddle以证明它不能正常工作.

CSSMatrix.prototype.perspective = function(d){
  return CSSMatrix.multiply(this, CSSMatrix.Perspective(d));
};
CSSMatrix.Perspective = function(d){
  var m = new CSSMatrix(); 
  m.m43 = -1/d; 
  return m;
};

为什么两个值不同?

感谢您的答复.

解决方法:

这里的问题似乎是3d矩阵在spec / docs中的表示方式(例如Mozilla CDN docs)与在CSSMatrix polyfill的code中的表示方式.代码使用了文档中表示的矩阵的转置版本.该代码可以正常工作,但是如果我们考虑使用spec / docs中使用的maxtrix,则该代码所指的矩阵位置[3,4]实际上是位置[4,3].

关于用于计算透视图的公式:根据MDN docs here,应使用/乘以以下矩阵来应用透视图(d为透视图值):

a1 a2 a3 a4    1 0  0   0
b1 b2 b3 b4 =  0 1  0   0
c1 c2 c3 c4    0 0  1   0
d1 d2 d3 d4    0 0 −1/d 1 

这样您就走了正确的道路,但是由于polyfill的代码在内部引用矩阵的方式而使您错误地构造了透视矩阵.代替m.m43 = -1 / d ;,使用m.m34 = -1 / d;

我已经用固定代码here更新了小提琴.

标签:matrix,css-transforms,javascript
来源: https://codeday.me/bug/20191119/2032605.html