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

Javascript THREE.js将子网格与独立的世界网格对齐,javascript,three.js,Javascript,Three.js,网格对象“childCone_B”是网格对象“worldBox”的子对象,其方向连续随机变化 我希望保持“childCone_B”的xyz轴与独立网格对象“worldCone”的xyz轴对齐,后者的方向会定期更改 在THREE.js Rev82中,以下代码可以正常工作 worldBox.add(childCone_B); //... done once in initiation //... done repeatedly in animation loop childCone_B.look

网格对象“childCone_B”是网格对象“worldBox”的子对象,其方向连续随机变化

我希望保持“childCone_B”的xyz轴与独立网格对象“worldCone”的xyz轴对齐,后者的方向会定期更改

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

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 );
在最新的THREE.js Rev85中,我不得不将lookAt参数更改为Vector3对象

childCone_B.lookAt( new THREE.Vector3(1,0,0) );
但现在,childConeB对象不再将其xyz轴与worldCone对象xyz轴对齐。相反,路线不断变化,但没有明显的目标


如何恢复所需的行为?

正如/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;
    };
}(),

childCone_B.注视(1,0,0)在任何three.js版本中都不正确。另外,
Object3D.lookAt()
不支持具有旋转和/或平移父对象的对象。3.js r.85谢谢。它一定是在R82的偶然事故下工作的!现在,我们已经找到了如何实现所需的行为-通过在动画循环的每一个过程中重新设置和规范化childCone\u B quarternion。(1)您可以避免调用
normalize()
。(2) 阅读
getWorldQuaternion()
的源代码。你每秒实例化多少个四元数?(1)我想知道,但从文档中复制了它,为了安全起见留在了文档中(2)附加了源代码来回答,不确定有什么意义?(3) 我只是在初始化时创建一次childCone_B,然后在每个动画过程中“设置”它的四元数,如代码所示……哦,也许你的意思是getWorldQuaternion()当前正在为每个调用创建一个新的四元数,因此我应该向它传递一个可重用的虚拟四元数,我在初始化时已经创建了(一次)?是的,这就是我所指的。是的,我认为一旦你理解了数学,你就能实现更有效的东西。