所以基本上我有一个组object3D的子对象3D,而子对象的[x,y,z]坐标是相对于父对象的对象空间显示的,我想更改子对象在3D空间中的位置。因此,首先我得到了子对象相对于世界空间的位置。
var wrld_pos = childobject.matrixWorld.multiplyVector3(new THREE.Vector3);
这将返回孩子在世界空间中的位置的三元素向量。现在我想为自己定位。所以我创建了一个三元素向量。
var new_pos = THREE.Vector3();
new_pos.x = 1;
new_pos.y = 2;
new_pos.z = 3;
childobject.matrixWorld.setPosition(new_pos);
提供了setPosition的函数定义,本质上它将对象世界矩阵的最后三个元素设置为作为参数传递的向量的值,从而更改对象在世界空间中的位置。为了确保矩阵在这些更改后更新,我调用了以下函数。
childobject.matrixWorldNeedsUpdate = true;
childobject.updateMatrixWorld();
现在,在检查对象的新世界矩阵时,我注意到setPosition函数什么也没做,什么都没做。
为什么?如果需要真实的代码示例,我将提供它们。但以上内容应该非常准确地代表了我使用的应用程序域和语法。
您想要更改子对象的世界位置。
假设场景没有应用变换,一种方法是使用以下模式:
scene.attach( child ); // detach from parent and add to scene
child.position.set( x, y, z );
parent.attach( child ); // reattach to original parent
Object3D.attach( child )
方法添加子对象,同时保持子对象的世界变换。
three.js r.132
这个答案可能有助于解决这个问题。从父对象移除子对象,更改正常位置,然后再次附加。
如果使用attach
在动画循环中设置移动对象的位置,则可以使对象抖动。
对我来说,最好的解决方案是:
let newPosition = new THREE.Vector3(1,2,3);
let parentPosition = new THREE.Vector3();
childobject.parent.getWorldPosition(parentPosition);
childobject.position.set(
newPosition.x-parentPosition.x,
newPosition.y-parentPosition.y,
newPosition.z-parentPosition.z
);
如果你需要位置和旋转attach
是唯一的方法。