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()
将旋转组件设置为您想要的标识。