如何获取子对象的全局/世界位置?
Posted
技术标签:
【中文标题】如何获取子对象的全局/世界位置?【英文标题】:How to get the global/world position of a child object? 【发布时间】:2013-02-12 10:57:31 【问题描述】:如何获取一个 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)。
【问题讨论】:
【参考方案1】:你可以像这样提取世界位置:
var target = new THREE.Vector3(); // create once an reuse it
child.getWorldPosition( target );
target
将包含结果。
编辑:更新到 three.js r.120
【讨论】:
谢谢 WestLangley,按照您的建议,我这样做了:console.log(parent.position.getPositionFromMatrix(child.matrixWorld)) 但是,由于实时代码实际上是在里面一个移动物体的循环,这导致了一些奇怪的伪影,父对象的速度会急剧增加(这只是控制台。记录孩子的位置)!由于我不完全了解发生了什么(会继续阅读),我最终做了:console.log(parent.position.clone().getPositionFromMatrix(child.matrixWorld)) 再次感谢。 不,不!在渲染循环外创建一个单独的向量,并为其分配渲染循环内的位置值。 感谢:scene.updateMatrixWorld()。我的向量总是 (0,0,0),因为场景没有更新矩阵。我使用了更新方法,现在可以正常工作了! :) 另外,getPositionFromMatrix 现在是 setFromMatrixPosition (three.js r65) 完美,这正是我所缺少和寻找的。非常感谢! 啊,太棒了,我需要更新父矩阵世界的子对象。完美的。谢谢。【参考方案2】:在threejs r89中你可以通过Object3D.getWorldPosition
获得世界位置。不知道什么时候加的。
【讨论】:
这可行,但根据其他答案,请确保事先致电parent.updateMatrixWorld()
或scene.updateMatrixWorld
。以上是关于如何获取子对象的全局/世界位置?的主要内容,如果未能解决你的问题,请参考以下文章