我有一个CSS 3D立方体,我想让它直接向左/右/上/下旋转,就像用户看到的那样。如果我使用CSS rotation
函数,则会旋转坐标轴而不是立方体本身。
网络上有很多关于X、Y、Z矩阵旋转计算的文章,但我花了几天时间尝试设置这个东西,但是这些信息都没有真正帮助到我。
解决我的问题的方法是使用WebKitCSSMatrix
对象,它具有自己的旋转函数,可以像魔术一样工作。Fiddle上的示例:http://jsfiddle.net/joecritch/tZBDW/。但是,这仅依赖于Webkit,我需要在跨浏览器方面进行兼容。
现在,成功需要经历三个步骤:
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魔方上。但问题是,它没有按照预期旋转。目前我正在使用 Sylvester
插件进行所有矩阵计算。
请帮助我如何使用新向量来正确地进行矩阵旋转。