【发布时间】:2017-06-30 21:53:36
【问题描述】:
我使用轴组来旋转我的平面几何,而不是单独旋转每个。旋转轴组对象后,我想找到每个子/平面几何网格的新位置,以对应于相对于实际世界位置的位置。
我该怎么做?
【问题讨论】:
标签: three.js
我使用轴组来旋转我的平面几何,而不是单独旋转每个。旋转轴组对象后,我想找到每个子/平面几何网格的新位置,以对应于相对于实际世界位置的位置。
我该怎么做?
【问题讨论】:
标签: three.js
简单的方法
就像 Craig 提到的,getWorldPosition 是 Object3D(场景中几乎所有东西的基类)上的一个函数,它返回对象世界位置的新 Vector3。
var childPlaneWorldPosition = childPlane.getWorldPosition();
更难的方法:
有两种方法可以在本地和世界位置之间进行转换:localToWorld 和 worldToLocal。
这些也是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);
}
【讨论】:
使用plane_mesh.getWorldPosition()
【讨论】: