【问题标题】:Why translating matrix on Z axis is not the same as changing position on the Z axis by same number?为什么在 Z 轴上平移矩阵与将 Z 轴上的位置改变相同的数字不同?
【发布时间】:2015-06-01 03:30:24
【问题描述】:

我有一个底部有原点的网格。我想在 Z 轴上将它移动 -132。如果我改变网格的位置,它就在正确的位置。但是如果我在 Z 轴上将它平移 -132,网格就会关闭 20。为什么我没有得到相同的结果?

我翻译矩阵的方式:

matrix = new THREE.Matrix4().makeTranslation( 0, 0, -132 )
mesh.geometry.applyMatrix( matrix );

这是网格的图像:

这是翻译 132 后的图像。它在 20 时关闭。

更多信息: 网格的位置在: 419, -830, 500

和旋转是: 0, -0.52, 0

所以Z坐标在500;但是我必须将它向下移动-132。如果它通过将位置向下移动 132 来移动它,则它位于正确的位置。但我想翻译矩阵以使原点下降 132。 这里也是矩阵:

"matrix": [0.8660253882408142,0,0.5,0,0,1,0,0,-0.5,0,0.8660253882408142,0,419,-830,500,1]

【问题讨论】:

  • 您想将z 坐标设置为-132 还是将此值添加到网格的现有z 坐标中?设置mesh.position.z = -132 是第一种情况,使用平移矩阵是第二种情况
  • @NikosM。我想将网格的几何形状移动 -132 - 所以我正在翻译它,但我没有得到正确的结果。
  • 最好在设置网格位置等的地方添加其余代码。
  • @NikosM。我添加了更多信息。你还需要什么吗?
  • 你应该在所有这些发生的地方发布相关代码,也可以在应用翻译矩阵后尝试控制台记录网格z坐标

标签: math matrix 3d three.js


【解决方案1】:

在进一步澄清和聊天后更新

整个问题是 3D 转换是可交换的。这意味着平移然后旋转与旋转然后平移不同(会产生不同的结果)。在某些特殊情况下,它们可能会重合(例如,来源位于 0,0,0 等等..),但通常它们具有不同的结果。

此外,相对坐标和将 3D 对象嵌套在其他 3D 对象中存在问题。对象的最终(世界)变换是否在其他对象内部都会受到影响。

最后,mesh position (local transform) 与顶点的实际位置在网格(和几何体)将(最终)投影到 2D 上的方式中发挥作用,因此投影角度会发生变化(见上文)。

如前所述,问题在于以移动原点的方式移动网格,因此可以针对这个移动的原点进行进一步的变换(例如旋转)。在 3D 编程中,实现这种行为的标准方法是在网格周围包含枢轴或包裹器,并将网格相对于包裹器定位在内部。然后在包装器本身上应用任何进一步的转换(例如旋转)。这给出了网格相对于另一个轴(而不是中心)旋转的效果。

这种情况发生的方式是包装器确实围绕其自己的原点旋转(即在0,0,0),但内部的网格发生了移动,因此它看起来像相对于另一个轴旋转。一个常见的例子是为 3D 汽车车轮建模,它可以围绕自己的轴旋转(即旋转),但也可以与汽车的其余部分一起平移。因此,一个人在车轮周围添加了一个包装器,其中包装器确实与汽车的其余部分一起平移,但是车轮在包装器内旋转,就好像没有平移一样(与您在这里需要的情况相反,但相同的区别)。

您可能需要检查MOD3 pivot modifier,它创建自定义枢轴作为原点/轴(ps 我是端口的作者)。 MOD3 中还包含一个轮子修改器,它解决了上述 3D 中的轮子问题。

要在代码中使用包装 3D 对象,请执行以下操作:

// create the pivot wrapper
var pivot = new THREE.Object3D();
pivot.name = "PIVOT";
pivot.add( mesh );
scene.add( pivot );

// shift the mesh inside pivot
mesh.position.set(0,0,-132);
// position wrapper in the scene, 
// position in the place where mesh would be
pivot.position.set(419, -830, 500);
pivot.rotation.set(0, -0.52, 0);
// now mesh appears rotated around the z = -132 axis instead of the center
// because the wrapper is actually rotated around its center,
// but its center coincides with the shifted mesh by z = -132

相关回答here

【讨论】:

  • 我已经尝试过了,但这已将矩阵原点移动到与预期完全不同的位置。我要做的就是在 Z 轴上将矩阵平移 132 并获得与将网格位置移动 132 相同的结果。您的代码正在将所有轴上的原点移动到其他地方。
  • 好的,正在更新答案,显然xy 轴上的网格位置也会被平移,因为它不为零,请稍等
  • 好的,已更新,请随时查看并返回。当您发布代码和用例时,它会有所帮助,因为各种因素都会影响输出,例如指令/更新的顺序等。欢呼
  • Nikos,是否可以获取您的 Skype 以便我们讨论这个问题?
  • 嗯,不,暂时没有,反正你还有问题吗?你可能想用新的输出来更新你的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-26
  • 1970-01-01
相关资源
最近更新 更多