我正在尝试编写一个控件,允许用户旋转对象,使用左/右箭头围绕X轴旋转,上/下箭头围绕Y轴旋转。 (据我所知,一旦开始旋转,物体内部坐标系将与世界坐标系不匹配。)
我可以围绕Y轴旋转对象,如下所示:
var axis = new THREE.Vector3(0,1,0);
aMatrix.makeRotationAxis( axis.normalize(), incr );
obj.rotation.setFromRotationMatrix( aMatrix );
其中incr是要旋转的数量。
我可以按如下方式围绕X轴旋转对象:
var axis = new THREE.Vector3(1,0,0);
aMatrix.makeRotationAxis( axis.normalize(), incr );
obj.rotation.setFromRotationMatrix( aMatrix );
两者都很好。但是,当我从一个转到另一个(旋转X,然后旋转Y)时,另一个轴会快速回到零位置。因此,如果我绕X转45度,然后开始围绕Y旋转,我的X旋转会回到零。
我正在设置:
obj.useQuaternion = true;
在所有情况下。
我做错了什么?
R69
答案 0 :(得分:0)
使用Matrix.makeRotationAxis创建的旋转矩阵仅存储围绕该轴的旋转。要围绕两个轴旋转,您需要创建两个矩阵(每个轴一个)并将它们相乘。
这样:
matrixXY = new THREE.Matrix4();
matrixX.makeRotationAxis(axisX, angleX);
matrixY.makeRotationAxis(axisY, angleY);
matrixXY.multiplyMatrices(matrixX, matrixY);
obj.rotation.setFromRotationMatrix(matrixXY);
使用旋转时有很多选项,因此您的用例可能更简单。