【问题标题】:Changing parents of a 3D model while keeping the same position在保持相同位置的同时更改 3D 模型的父级
【发布时间】:2020-08-04 04:08:07
【问题描述】:

我正在使用 three.js 库来处理 3d 模型(主要是 .glb,但没关系)

这个想法是导入一个包含组和网格的 3d 模型。我希望能够在模型中已存在的组之间移动网格,而无需更改模型的视觉表示。 我的一段代码如下。移动内部是

movedMesh.matrixWorldNeedsUpdate = true; // not sure if it's needed
let meshPosition = new THREE.Vector3();
movedMesh.getWorldPosition(meshPosition);

oldParent.remove(movedMesh);
newParent.add(movedMesh);

movedMesh.worldToLocal(meshPosition);
movedMesh.position.set(meshPosition.x, meshPosition.y, meshPosition.z);

这是行不通的。 Mesh 改变了它的全局位置,因为新父级的位置与以前的父级位置不同,但我希望它保持在原来的位置,但考虑到新父级的位置改变它的本地位置。

我做错了什么?

【问题讨论】:

    标签: three.js 3d positioning


    【解决方案1】:

    我认为你需要更新movedMesh 的世界矩阵你改变它的父母。当你.remove() 然后.add() 时,它并不知道它的父级已经更新(Three.js 通常在你渲染时会这样做,但这是在下一帧渲染之前发生的)。

    let meshPosition = new THREE.Vector3();
    movedMesh.getWorldPosition(meshPosition);
    
    oldParent.remove(movedMesh);
    newParent.add(movedMesh);
    
    // Here it needs to re-learn its new coordinates
    movedMesh.updateMatrixWorld(true);
    
    movedMesh.worldToLocal(meshPosition);
    movedMesh.position.set(meshPosition.x, meshPosition.y, meshPosition.z);
    

    【讨论】:

    • 我的第一个答案是错误的,我只是用我认为的问题进行了更新。
    • 酷!非常感谢:) 它几乎可以工作。我想我还需要重新设置它的方向有什么技巧吗?
    • 这完全是一个不同的问题。试试.getWorldDirection().lookAt(),看看你能走多远。如果您遇到困难,请随时提出另一个问题!
    • 抱歉,我的意思是mesh.rotation 中的方向,比如,是否可以使用.getWorldQuaternion 获取它,然后将其从世界转换为新的本地(也许通过使用.applyQuaternion)?跨度>
    • @annwhoorma 试试看!我很确定这是可能的。
    猜你喜欢
    • 2016-09-12
    • 1970-01-01
    • 1970-01-01
    • 2014-12-21
    • 2016-11-13
    • 2013-05-13
    • 2012-09-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多