我的网格底部有一个原点。我想在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]
答案 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