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

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

以上是关于如何获取子对象的全局/世界位置?的主要内容,如果未能解决你的问题,请参考以下文章

求问 unity里面如何获取一个物体自身的坐标系?

unity UGUI如何获取鼠标指针所在位置的UI对象

统一3d。如何获取ui元素的屏幕或世界位置

在flex中,如何获取组件的全局坐标位置?

小程序中如何获取地理位置

C ++如何在获取其索引位置后获取子字符串