为什么在Z轴上平移矩阵与将Z轴上的位置改变相同的数字不同?

时间:2015-05-31 15:27:14

标签: math matrix 3d three.js

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

我翻译矩阵的方式:

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

这是网格的图像: enter image description here

这是132翻译后的图像。它在20点之前关闭。 enter image description here

更多信息: 网格的位置是: 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]

1 个答案:

答案 0 :(得分:0)

进一步澄清和聊天后更新

整个问题是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