代码之家  ›  专栏  ›  技术社区  ›  Michael IV

在世界空间中保持局部旋转不变

  •  0
  • Michael IV  · 技术社区  · 6 年前

    我有一个网,它是一个 Object3D 是现场的一个孩子。

    这个 对象3D 是旋转的,假设沿着X轴旋转90度。

    子对象没有应用旋转,并且在其局部空间中保持Y向上和Z向前进。

    作为3.js API的一个noob,我的问题是:什么是最有效的方法(在计算方面)来保持孩子的旋转与世界的y一致?

    也就是说,如果它的父对象沿着X轴旋转了90度,那么它的子对象的局部旋转应该被更新,以便它的上方向向量仍然指向全局Y轴?

    我可以得到物体的世界四元数来得到局部和全局旋转之间的区别,然后在局部进行调整吗?

    好吧,我发现的最简单的技巧是反转父元素的四元数并将其应用于子元素,这样它的局部旋转在世界空间中保持不变:

            var inv = mesh.parent.quaternion.clone(); 
            inv.conjugate();
            mesh.quaternion.copy(inv);
    
    1 回复  |  直到 6 年前
        1
  •  1
  •   WestLangley    6 年前

    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;