我有一个 CSS 3D 立方体,我正在尝试向用户显示它向左/向右/向上/向下直线旋转。如果我使用 cssrotation
函数,那么我会旋转轴,而不是立方体。
网上有很多关于 X、Y、Z 矩阵旋转计算的文章,但我现在花了几天时间尝试设置这个东西,但这些信息都没有真正帮助我。
解决我的问题的方法是一个WebKitCSSMatrix
对象,它有自己的旋转功能,就像魔法一样。小提琴上的一个例子:http: //jsfiddle.net/joecritch/tZBDW/。但同样,这仅依赖于 Webkit,但我需要在这里浏览。
现在,成功之路有3个步骤:
1)我需要获取当前矩阵,设置方向向量(上/下为 1,0,0,左/右旋转为 0,1,0)并设置角度。完毕。
2)我需要根据当前矩阵计算新的旋转向量。完毕。
3)我需要用新的向量和角度实际旋转我的当前矩阵。问题。
var newMArray = deMatrix(".cube");//getting current matrix from CSS
var v = [vecX, vecY, vecZ, 0];//current vector (1,0,0) or (0,1,0)
var newV = newMVector(newMArray, v);//calculating new vector for current matrix
//getting the angle for each axis based on new vector
angleX = newV[0]*angle;
angleY = newV[1]*angle;
angleZ = newV[2]*angle;
this.rotateX -= angleX;
this.rotateY -= angleY;
this.rotateZ -= angleZ;
//calculating the rotation matrix
var rotationXMatrix, rotationYMatrix, rotationZMatrix, s, transformationMatrix;
rotationXMatrix = $M([[1, 0, 0, 0], [0, Math.cos(this.rotateX * deg2rad), Math.sin(-this.rotateX * deg2rad), 0], [0, Math.sin(this.rotateX * deg2rad), Math.cos(this.rotateX * deg2rad), 0], [0, 0, 0, 1]]);
rotationYMatrix = $M([[Math.cos(this.rotateY * deg2rad), 0, Math.sin(this.rotateY * deg2rad), 0], [0, 1, 0, 0], [Math.sin(-this.rotateY * deg2rad), 0, Math.cos(this.rotateY * deg2rad), 0], [0, 0, 0, 1]]);
rotationZMatrix = $M([[Math.cos(this.rotateZ * deg2rad), Math.sin(-this.rotateZ * deg2rad), 0, 0], [Math.sin(this.rotateZ * deg2rad), Math.cos(this.rotateZ * deg2rad), 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]);
transformationMatrix = rotationXMatrix.x(rotationYMatrix).x(rotationZMatrix);//getting all axis rotation into one matrix
比我为我的 CSS Cube 设置新的转换矩阵。问题是 - 它没有按应有的方式旋转。现在我正在使用Sylvester
插件来进行所有矩阵计算。
所以,请帮助我如何使用我的新向量进行正确的矩阵旋转。