8

所以基本上我有一个组 Object3D 的子 object3D,而子对象的 [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 函数什么也没做,什么都没有。

为什么?如果需要真实的代码示例,我会提供。但是上面应该非常准确地代表了我使用的应用程序域和语法。

4

2 回答 2

8

编辑:答案已更新。


您想要更改子对象的世界位置。

假设场景没有应用变换,一种方法是使用以下模式:

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 )方法添加子对象,同时保持子对象的世界变换。

三.js r.132

于 2012-09-22T21:42:27.067 回答
1

这个答案可能对案件有所帮助。从父级移除子级,更改正常位置,然后再次附加。

于 2018-06-19T10:42:53.483 回答