矩阵变换
Verge3D使用矩阵编码3D变换 – 位移(位置),旋转和缩放。Object3D的每个实例都有一个矩阵,用于存储该对象的位置,旋转和缩放。本页介绍如何更新对象的转换。
便利性和matrixAutoUpdate
有两种方法可以更新对象的变换:
1.修改对象的位置,四元数和缩放属性,让Verge3D从这些属性中重新计算物体的矩阵:
object.position.copy(start_position);
object.quaternion.copy(quaternion);
默认情况下,matrixAutoUpdate属性设置为true,并且将自动重新计算矩阵。如果对象是静态的,或者您希望在重新计算时手动控制,则可以通过将属性设置为false来获得更好的性能:
object.matrixAutoUpdate = false;
更改任何属性后,手动更新矩阵:
object.updateMatrix();
2.直接修改对象的矩阵。Matrix4类有各种修改矩阵的方法:
object.matrix.setRotationFromQuaternion(quaternion);
object.matrix.setPosition(start_position);
object.matrixAutoUpdate = false;
请注意,在这种情况下,matrixAutoUpdate必须设置为false,并且应确保不要调用updateMatrix。调用updateMatrix将破坏对矩阵所做的手动更改,从位置,比例等重新计算矩阵。
物体和世界矩阵
对象的matrix存储对象相对于对象parent的转换;要在世界坐标中获取对象的变换,您必须访问对象的Object3D.matrixWorld 。
当父对象或子对象的转换发生更改时,您可以通过调用 updateMatrixWorld() 来请求更新子对象的matrixWorld 。
旋转和四元数
Verge3D提供了两种表示3D旋转的方法:欧拉角和四元数,以及两者之间的转换方法。欧拉角受到称为“万向节锁定”的问题,其中某些配置可能失去一定程度的自由度(防止物体绕一个轴旋转)。因此,对象旋转始终存储在对象的四元数中。
该库的早期版本包含一个useQuaternion属性,当设置为false时,将导致从Euler角度计算对象的矩阵。这种做法已被弃用 – 相反,您应该使用 setRotationFromEuler 方法,该方法将更新四元数。