矩阵变换
Verge3D使用 matrics 来编码3D变换:移动(位置)、旋转和缩放。Object3D的每个实例都有一个matrix,它用于存储对象的位置、旋转和缩放。本页描述如何更新对象的转换。
方便属性与矩阵自动更新(matrixAutoUpdate)
有两种方法可以更新对象的转换:
-
修改对象的位置(position),四元数(quaternion)和缩放(scale)属性,
并让Verge3D根据这些属性重新计算对象的矩阵:
object.position.copy(start_position); object.quaternion.copy(quaternion);
默认情况下,matrixAutoUpdate 属性被设置为true,矩阵将被自动重新计算。 如果对象是静态的,或者希望手动控制何时发生重新计算,则可以通过设置属性false来获得更好的性能:object.matrixAutoUpdate = false;
并在改变任何属性后,手动更新矩阵:object.updateMatrix();
-
直接修改对象的矩阵。Matrix4 类有各种修改矩阵的方法:
object.matrix.setRotationFromQuaternion(quaternion); object.matrix.setPosition(start_position); object.matrixAutoUpdate = false;
注意,在这种情况下,matrixAutoUpdate 必须 被设置为 false ,而且你应该确保 不 调用 updateMatrix 。调用 updateMatrix 将删除对矩阵所做的手动更改,从position, scale等方面重新计算矩阵,以此类推。
对象和世界矩阵
一个对象的matrix存储了该对象 相对于 该对象[page:object3d.parent 父节点]的变换;要获取对象在 世界 坐标中的变换,则必须访问该对象的 Object3d.MatrixWorld。
当父对象或子对象的转换更改时,您可以通过调用 updateMatrixWorld() 请求更新子对象的 matrixWorld 。
旋转与四元数
Verge3D提供了两种表示3D旋转的方法:Euler angles(欧拉角) 和 Quaternions(四元数),以及在两者之间转换的方法。欧拉角受到一个叫做“万向锁”的问题的影响,在这种情况下,某些构型可能会失去一个自由度(阻止对象绕一个轴旋转)。因此,对象旋转是 始终 存储在对象的 quaternion 中。
该库的早期版本中包含一个 useQuaternion 属性,当设置为false时,将导致对象的 matrix 从欧拉角度计算出来。这种方法已经启用——作为替代,您应该使用 setRotationFromEuler 方法,该方法将更新四元数。