Three.JS,改变儿童3D对象的世界位置

sba*_*ams 5 javascript graphics webgl three.js

所以基本上我有一个Object3D组的子object3D,而子对象的[x,y,z]坐标是相对于父对象的对象空间显示的,我想改变3D空间中子对象的位置.所以首先我得到子对象相对于世界空间的位置.

var wrld_pos = childobject.matrixWorld.multiplyVector3(new THREE.Vector3);
Run Code Online (Sandbox Code Playgroud)

这将返回子项在世界空间中的位置的三元素向量.现在我希望将自己定位.所以我创建了一个三元素向量.

var new_pos = THREE.Vector3();
new_pos.x = 1;
new_pos.y = 2;
new_pos.z = 3;

childobject.matrixWorld.setPosition(new_pos);
Run Code Online (Sandbox Code Playgroud)

提供了setPosition的函数定义,它基本上将对象的世界矩阵的最后三个元素设置为作为参数传递的向量的值,从而改变对象在世界空间中的位置.为了确保在这些更改后矩阵更新,我调用以下函数.

childobject.matrixWorldNeedsUpdate = true;
childobject.updateMatrixWorld();
Run Code Online (Sandbox Code Playgroud)

现在在检查对象的新世界矩阵时,我注意到setPosition函数什么也没做,什么也没做.

为什么?如果需要真正的代码示例,我将提供它们.但上面应该代表我非常准确地使用的应用程序域和语法.

Wes*_*ley 7

在three.js所,最好是刚打电话object.position.set( x, y, z ),object.rotation.set( ... )object.scale.set( ... ),而不是乱用object.matrixobject.matrixWorld直接,除非你真的知道自己在做什么.

幕后发生的是这样的:

默认值object.matrixAutoUpdatetrue.

因此,在render()函数中,object.matrixWorld正在更新当前值object.postion,您没有更改.所以,对你而言,似乎什么也没发生.

  • 这不是一个答案。 (5认同)
  • 这就解释了为什么没有存储新的位置值.但它没有帮助,问题是改变对象的世界空间位置. (2认同)