所以基本上我有一个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函数什么也没做,什么也没做。
为什么呢?如果需要真正的代码示例,我将提供它们。但上面应该代表我非常准确地使用的应用程序域和语法。
答案 0 :(得分:7)
在three.js中,最好只调用object.position.set( x, y, z )
,object.rotation.set( ... )
和object.scale.set( ... )
,而不是混淆object.matrix
或object.matrixWorld
直接,除非你真的知道你在做什么。
幕后发生的事情是:
object.matrixAutoUpdate
的默认值为true
。
因此,在render()
函数中,object.matrixWorld
正在按object.postion
的当前值更新,您没有更改。所以,对你而言,似乎什么也没发生。
答案 1 :(得分:0)
此answer可能有助于此案例。从父母移除孩子,改变正常位置,然后再次附上。