矩阵变换

Verge3D使用矩阵编码3D变换 – 位移(位置),旋转和缩放。Object3D的每个实例都有一个矩阵,用于存储该对象的位置,旋转和缩放。本页介绍如何更新对象的转换。

便利性和matrixAutoUpdate

有两种方法可以更新对象的变换:

1.修改对象的位置,四元数和缩放属性,让Verge3D从这些属性中重新计算物体的矩阵:

  1. object.position.copy(start_position);
  2. object.quaternion.copy(quaternion);

默认情况下,matrixAutoUpdate属性设置为true,并且将自动重新计算矩阵。如果对象是静态的,或者您希望在重新计算时手动控制,则可以通过将属性设置为false来获得更好的性能:

  1. object.matrixAutoUpdate = false;

更改任何属性后,手动更新矩阵:

  1. object.updateMatrix();

2.直接修改对象的矩阵。Matrix4类有各种修改矩阵的方法:

  1. object.matrix.setRotationFromQuaternion(quaternion);
  2. object.matrix.setPosition(start_position);
  3. object.matrixAutoUpdate = false;

请注意,在这种情况下,matrixAutoUpdate必须设置为false,并且应确保不要调用updateMatrix。调用updateMatrix将破坏对矩阵所做的手动更改,从位置,比例等重新计算矩阵。

物体和世界矩阵

对象的matrix存储对象相对于对象parent的转换;要在世界坐标中获取对象的变换,您必须访问对象的Object3D.matrixWorld

当父对象或子对象的转换发生更改时,您可以通过调用 updateMatrixWorld() 来请求更新子对象的matrixWorld

旋转和四元数

Verge3D提供了两种表示3D旋转的方法:欧拉角和四元数,以及两者之间的转换方法。欧拉角受到称为“万向节锁定”的问题,其中某些配置可能失去一定程度的自由度(防止物体绕一个轴旋转)。因此,对象旋转始终存储在对象的四元数中。

该库的早期版本包含一个useQuaternion属性,当设置为false时,将导致从Euler角度计算对象的矩阵。这种做法已被弃用 – 相反,您应该使用 setRotationFromEuler 方法,该方法将更新四元数。