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

Math 为什么平移Z轴上的矩阵与改变Z轴上相同数量的位置不同?,math,matrix,3d,three.js,Math,Matrix,3d,Three.js,我有一个底部有原点的网格。我想在Z轴上移动-132。如果我更改网格的位置,它将位于正确的位置。但是如果我在Z轴上平移-132,网格将偏移20。为什么我没有得到同样的结果 我翻译矩阵的方式: matrix = new THREE.Matrix4().makeTranslation( 0, 0, -132 ) mesh.geometry.applyMatrix( matrix ); "matrix": [0.8660253882408142,0,0.5,0,0,1,0,0,-0.5,0,0.866

我有一个底部有原点的网格。我想在Z轴上移动-132。如果我更改网格的位置,它将位于正确的位置。但是如果我在Z轴上平移-132,网格将偏移20。为什么我没有得到同样的结果

我翻译矩阵的方式:

matrix = new THREE.Matrix4().makeTranslation( 0, 0, -132 )
mesh.geometry.applyMatrix( matrix );
"matrix": [0.8660253882408142,0,0.5,0,0,1,0,0,-0.5,0,0.8660253882408142,0,419,-830,500,1]
以下是网格的图像:

这是132翻译后的图像。到20点了。

更多信息: 网格的位置位于: 419,-830500

轮换是: 0,-0.52,0

所以Z坐标是500;但是我必须把它向下移动-132。如果它通过向下移动位置132来移动它,则它处于正确位置。但是我想转换矩阵,使原点向下132。 以下是矩阵:

matrix = new THREE.Matrix4().makeTranslation( 0, 0, -132 )
mesh.geometry.applyMatrix( matrix );
"matrix": [0.8660253882408142,0,0.5,0,0,1,0,0,-0.5,0,0.8660253882408142,0,419,-830,500,1]

进一步澄清和聊天后更新

整体观点是3D转换素是可交换的。这意味着先平移再旋转与先旋转再平移(将产生不同的结果)是不同的。在某些特殊情况下,它们可以重合(例如原点位于
0,0,0
等处),但一般来说,它们的结果不同

此外,还存在相对坐标和将三维对象嵌套在其他三维对象中的问题。对象的最终(世界)变换将受到影响,无论它是否位于其他对象内部

最后,实际相对于顶点的位置在网格(和几何体)最终投影到2D的方式中起作用,因此投影角度会发生变化(见上文)

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

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

您可以选择检查创建自定义枢轴作为原点/轴(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

相关答案

是否要将
z
坐标设置为
-132
,或将此值添加到网格的现有
z
坐标?设置
mesh.position.z=-132执行第一种情况,使用平移矩阵执行第二种情况case@NikosM. 我想将网格的几何体移动-132-因此我正在翻译它,但我没有得到正确的结果。最好在设置网格位置的地方添加rest代码等…@NikosM。我补充了一些更多的信息。你还需要什么吗?你应该在所有这些发生的地方发布相关代码,同时尝试控制台。在应用转换矩阵后记录网格
z
coord。我尝试过这一点,但这将矩阵原点移动到了与预期完全不同的位置。我要做的就是在Z轴上平移矩阵132,得到与移动网格位置132相同的结果。您的代码正在将所有轴上的原点移动到其他位置。好的,更新答案,显然
x
y
轴上的网格位置也会被更改,因为它不是零,请给我一分钟确定,更新,请随时检查并返回。当您发布代码和用例时,它会有所帮助,因为各种因素都会影响输出,比如指令/更新的顺序等等。Cheesnikos,有没有可能得到你的Skype以便我们讨论这个问题?嗯,没有,现在不行,反正你还有问题吗?您可能希望使用新输出更新您的问题。