网格对象" 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轴对齐。相反,对齐方式不断变化,但没有明显的目标。
如何恢复所需的行为?
答案 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;
};
}(),