【问题标题】:Update position of mesh after rotation of THREE.Group()旋转 THREE.Group() 后更新网格的位置
【发布时间】:2017-06-30 21:53:36
【问题描述】:

我使用轴组来旋转我的平面几何,而不是单独旋转每个。旋转轴组对象后,我想找到每个子/平面几何网格的新位置,以对应于相对于实际世界位置的位置。

我该怎么做?

【问题讨论】:

    标签: three.js


    【解决方案1】:

    简单的方法

    就像 Craig 提到的,getWorldPositionObject3D(场景中几乎所有东西的基类)上的一个函数,它返回对象世界位置的新 Vector3

    var childPlaneWorldPosition = childPlane.getWorldPosition();
    

    更难的方法:

    有两种方法可以在本地和世界位置之间进行转换:localToWorldworldToLocal

    这些也是Object3D 上的函数,并采用Vector3。然后将矢量(破坏性地)转换为所需的坐标系。只知道它不够聪明,无法知道你给它的向量是否已经在正确的坐标系中——你需要跟踪它。

    因此,要将子平面的位置从本地坐标转换为世界坐标,您可以这样做:

    // clone because localToWorld changes the vector passed to it
    var childPlanePosition = childPlane.position.clone();
    childPlane.parent.localToWorld(childPlanePosition);
    

    请注意,localToWorld 是在 childPlane 的父级上调用的。这是因为childPlane 是其父级的本地,因此它的位置是其父级坐标系的本地。

    很难(更容易理解)的方式:

    每个childPlane 不仅存储其局部变换矩阵(childPlane.matrix),还存储其世界变换矩阵(childPlane.matrixWorld)。当然,您可以一步直接从matrixWorld 属性中获取世界位置。

    var childWorldPosition = new THREE.Vector3(
      childPlane.matrixWorld.elements[12],
      childPlane.matrixWorld.elements[13],
      childPlane.matrixWorld.elements[14]
    );
    

    编辑以回答一些问题

    "如果我理解正确,我能在 pivot-group children-array 中找到网格的“真实”位置吗?"

    是的。如果你打电话:

    pivotGroup.add(childPlane);
    

    然后childPlane 将列在pivotGroup.children 数组中,您可以使用它来迭代所有childPlane 对象

    并将这些克隆到每个网格的位置对象?

    如果您希望平面位于世界坐标中(在场景中),但您使用上面的代码将它们添加到组中,那么它们不再是场景的直接子级。您需要将它们重新添加到场景中:

    scene.add(childPlane);
    

    然后应用他们计算出来的世界位置。也就是说,为什么不把他们留在小组中?

    (你没有问这个)“你如何让平面作为场景的直接子级,但将它们作为一个组旋转?

    嗯,你不会的。但是three.js 通过将矩阵相乘以得出每个平面的最终世界矩阵来进行此组旋转。因此,您可以手动执行相同的操作,方法是创建一个旋转矩阵,并将其应用于所有平面。

    var rotMat = new THREE.Matrix4().makeRotationMatrix(x, y, z);
    for(var i = 0; i < planesArray.length; ++i){ // I guess this would loop over your 3D array
      planesArray.applyMatrix(rotMat);
    }
    

    【讨论】:

    • 所以在我的例子中,我有一个 3D 阵列中的所有网格。我用它来检查玩家和每个网格之间的碰撞。这样,我只使用枢轴组来旋转所有这些。如果我理解正确,我可以在枢轴组子数组中找到网格的“真实”位置吗?并将这些克隆到每个网格的位置对象?
    • 我已经编辑了我的帖子来回答你的一些问题。
    • 谢谢!周末回家后我会试试这个。
    • 您帮助我的代码独立于使用数据透视组,这实际上让我感到困惑。谢谢! :D
    【解决方案2】:

    使用plane_mesh.getWorldPosition()

    【讨论】:

      猜你喜欢
      • 2019-10-25
      • 2015-08-23
      • 1970-01-01
      • 2011-09-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-11
      • 1970-01-01
      相关资源
      最近更新 更多