如何获取对象的世界位置(Three.js)

3
我想将已经放置的对象放到新位置,但它是根据局部位置移动而不是全局位置。
this._scene.updateMatrixWorld();
this._scene.add(mesh);
var v1 = new THREE.Vector3();    
v1.setFromMatrixPosition( mesh.matrixWorld );  
mesh.position.set(v1.x +2, v1.y + 2, v1.z + 2);
2个回答

7

我用以下方法解决了我的问题:

每个网格都有一个几何属性,这就是你可以调用mesh.geometry的原因。从这一点出发,我围绕我的网格创建了一个BoundingSphere。

mesh.geometry.computeBoundingSphere();

现在可以获取我的边界球的世界位置,同时也是我的网格的世界位置。

var vector = mesh.geometry.boundingSphere.center;

恭喜!'vector' 在你的网格中得到了中心世界位置(x,y,z)。
只是为了澄清,'mesh' 是一个THREE.Mesh对象。

0

你不只是通过增量移动对象本身吗?我不确定为什么需要涉及矩阵?

mesh.position.set(mesh.position.x +2, mesh.position.y + 2, mesh.position.z + 2);

如果你需要使用矩阵,你需要设置matrixWorld。查看http://threejs.org/docs/#Reference/Core/Object3D.matrixWorld,但是使用position setter会为你完成大部分工作。


不对,因为THREE.js将从本地坐标计算。 - user2982195
1
我想我现在明白了。您在父级相对位置上有一个子网格。您将其或克隆直接放置在场景中,但现在位置不再正确,因为其位置是参考另一个父级的。也许您需要在原始对象上调用.localToWorld(vector)。localToWorld是object3d的属性。这将是您的新起始位置。 - Radio
父级是场景。必须将网格替换为新坐标,但这样做时,网格仅从其位置移动到本地坐标。 - user2982195
如果场景是父级,则您的本地和世界矩阵相同。 - Radio
我不会在本地矩阵和全局矩阵相同时提出问题。例如: 我将object1移动到(1,1,1)。 现在我将object2移动到(1,1,1)。它们不在同一位置。两者都是场景的子对象。 - user2982195
好的,抱歉,随着我陈述或提问事项,您的问题变得更加清晰。在这种情况下,我建议一个网格具有其原点偏移量,需要计算以将其网格的计算中心点与您想要移动到的位置对齐。网格的实际质心不一定是object3d的矩阵原点。您可以计算质心并转换网格,或将质心的反向设置为世界位置。我建议这个答案可能会有所帮助:https://dev59.com/tm3Xa4cB1Zd3GeqPgZiK - Radio

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接