THREE.js将子网格与独立的世界网格对齐

时间:2017-05-27 17:52:51

标签: javascript three.js

网格对象" childCone_B"是网格对象的一个​​孩子" worldBox"其方向随机变化。

我希望保持" childCone_B"的xyz轴。与独立网格对象的xyz轴对齐" worldCone"其定位会定期发生变化。

在THREE.js Rev82中,以下代码可以正常工作。

   AmmanQueue = new QueueImplementation();
            for(int i =0; i<MainActivity.Amman.getLength(); i++)
            {
                AmmanQueue.enqueue(MainActivity.Amman.getEntry(i));
            }

在最新的THREE.js Rev85中,我不得不将lookAt参数更改为Vector3对象。

worldBox.add(childCone_B); //... done once in initiation

//... done repeatedly in animation loop

childCone_B.lookAt(1,0,0);
childCone_B.quaternion.multiply( worldBox.getWorldQuaternion().inverse()  ); 
childCone_B.quaternion.multiply( worldCone.quaternion );

但现在,childConeB对象不再将其xyz轴与worldCone对象xyz轴对齐。相反,对齐方式不断变化,但没有明显的目标。

如何恢复所需的行为?

1 个答案:

答案 0 :(得分:0)

as / u / WestLangley表示,(i)lookAt(1,0,0)的原始用法不正确,(ii)Object3D.lookAt()不支持旋转和/或翻译父对象的对象(iii)object3D.getWorldQuaternion()在每次调用时创建一个新的四元数,除非提供现有的四元数作为参数。

以下代码完成了这项工作。

//... one-off initiation
QQ = new THREE.Quaternion();

//... in the Animation loop

childCone_B.quaternion.set( 0, 0, 0, 1 );// .normalize() is not required.
childCone_B.quaternion.multiply( worldBox.getWorldQuaternion(QQ).inverse()  ); 
childCone_B.quaternion.multiply( worldCone.quaternion );

修改

这里注意object3D.getWorldQuaternion的源代码。它表明,如果我们不将现有的四元数作为参数传递,那么它将在每次调用时创建一个新的四元数,这会降低性能。

getWorldQuaternion: function () 
{
    var position = new Vector3();
    var scale = new Vector3();
    return function getWorldQuaternion( optionalTarget ) 
    {
        var result = optionalTarget || new Quaternion();
        this.updateMatrixWorld( true );
        this.matrixWorld.decompose( position, result, scale );
        return result;
    };
}(),