Javascript 在世界空间中保持局部旋转不变
我有一个网格,它是Javascript 在世界空间中保持局部旋转不变,javascript,three.js,Javascript,Three.js,我有一个网格,它是Object3D的子对象,它是场景的子对象 Object3D是旋转的,比如说沿X轴旋转90度 子对象未应用旋转,并在其局部空间中保持Y向上和Z向上方向 作为一个noob to THREE.js API,我的问题是:在计算方面,让孩子的旋转与世界的Y轴对齐的最有效的方法是什么 也就是说,如果其父对象已沿X轴旋转90度,则应更新其子对象的局部旋转,以便其上方向向量仍指向全局Y轴 我可以得到对象的世界四元数以获得局部和全局旋转之间的差异,然后进行局部调整吗 我发现的最简单的技巧是反转
Object3D
的子对象,它是场景的子对象
Object3D
是旋转的,比如说沿X轴旋转90度
子对象未应用旋转,并在其局部空间中保持Y向上和Z向上方向
作为一个noob to THREE.js API,我的问题是:在计算方面,让孩子的旋转与世界的Y轴对齐的最有效的方法是什么
也就是说,如果其父对象已沿X轴旋转90度,则应更新其子对象的局部旋转,以便其上方向向量仍指向全局Y轴
我可以得到对象的世界四元数以获得局部和全局旋转之间的差异,然后进行局部调整吗
我发现的最简单的技巧是反转父对象的四元数并将其应用于子对象,以便其局部旋转在世界空间中保持不变:
var inv = mesh.parent.quaternion.clone();
inv.conjugate();
mesh.quaternion.copy(inv);
您希望子网格保持右侧向上并与坐标轴对齐,即使网格的父网格旋转 有几种方法可以做到这一点。什么是最好的,取决于您的用例或个人偏好 您提出的解决方案可以在不进行克隆的情况下实施,如下所示:
mesh.quaternion.copy( mesh.parent.quaternion ).conjugate();
另一种方法是定义修改网格世界矩阵的onBeforeRender()
方法:
var func = function() {
var v = new THREE.Vector3();
return function func() {
v.setFromMatrixPosition( this.matrixWorld );
this.matrixWorld.makeTranslation( v.x, v.y, v.z );
// or you could do this, instead
//this.quaternion.copy( this.parent.quaternion ).conjugate();
//this.updateMatrixWorld();
};
}();
mesh.onBeforeRender = func;
three.js r.94到目前为止,您尝试过什么?结果如何?我们提供您已经淘汰的解决方案毫无意义。@JIM01查看我的更新。这是一种在恢复平移的同时删除旋转组件的聪明方法(尽管如果这很重要的话,您也会失去比例)。很抱歉,可能API命名很混乱,但平移如何保持其旋转不变?除非您不想将子对象作为旋转对象的父对象?
makeTranslation()
将旋转组件设置为您想要的标识。