如何获取子对象的全局/世界位置?

IT技术 javascript three.js
2021-02-15 12:43:51

如何在另一个 Object3D 中获取 Object3D 的全局位置?

设置:

var parent = new THREE.Object3D();
parent.position.set(100, 100, 100);

var child = new THREE.Object3D();
child.position.set(100, 100, 100);
parent.add(child);

scene.add(parent);

笔记:

我认为这将是这样做的方法:

console.log(child.localToWorld(parent.position));

...但它给了我(100, 100, 100),而不是(200, 200, 200)

2个回答

您可以像这样提取世界位置:

var target = new THREE.Vector3(); // create once an reuse it

child.getWorldPosition( target );

target 将包含结果。

编辑:更新为three.js r.120

不,不!在渲染循环外创建一个单独的向量,并在渲染循环内为其分配位置值。
2021-04-18 12:43:51
啊,太棒了我需要更新父矩阵世界的子对象。完美的。谢谢你。
2021-05-10 12:43:51
谢谢:scene.updateMatrixWorld()。我的向量总是 (0,0,0),因为场景没有更新矩阵。我使用了更新方法,现在工作正常!:) 另外,getPositionFromMatrix 现在是 setFromMatrixPosition(three.js r65)
2021-05-11 12:43:51
谢谢 WestLangley,按照你的建议我做了这个:console.log(parent.position.getPositionFromMatrix(child.matrixWorld))但是,由于实时代码实际上是在一个循环内移动事物,这导致了一些奇怪的工件,其中父对象的速度会急剧增加(这只是控制台。记录孩子的位置)!由于我不明白到底发生了什么(将阅读它tho),我最终做了:console.log(parent.position.clone().getPositionFromMatrix(child.matrixWorld)) 再次感谢。
2021-05-15 12:43:51
完美,这正是我所缺少和寻找的。多谢!
2021-05-16 12:43:51

在 Threejs r89 中,您可以通过Object3D.getWorldPosition. 不知道什么时候加的。

这是有效的,但根据其他答案,请确保事先致电parent.updateMatrixWorld()致电scene.updateMatrixWorld
2021-05-16 12:43:51