矩阵变换

Verge3D使用 matrics 来编码3D变换:移动(位置)、旋转和缩放。Object3D的每个实例都有一个[page:Object3d.matrix matrix],它用于存储对象的位置、旋转和缩放。本页描述如何更新对象的转换。

方便属性与矩阵自动更新(matrixAutoUpdate)

有两种方法可以更新对象的转换:
  1. 修改对象的位置(position)四元数(quaternion)缩放(scale)属性,并让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 将删除对矩阵所做的手动更改,从position, scale等方面重新计算矩阵,以此类推。

对象和世界矩阵

一个对象的matrix存储了该对象 相对于 该对象[page:object3d.parent 父节点]的变换;要获取对象在 世界 坐标中的变换,则必须访问该对象的 Object3d.MatrixWorld

当父对象或子对象的转换更改时,您可以通过调用 updateMatrixWorld() 请求更新子对象的 [page:Object3D.matrixWorld matrixWorld] 。

旋转与四元数

Verge3D提供了两种表示3D旋转的方法:Euler angles(欧拉角) 和 [page:Quaternion Quaternions](四元数),以及在两者之间转换的方法。欧拉角受到一个叫做“万向锁”的问题的影响,在这种情况下,某些构型可能会失去一个自由度(阻止对象绕一个轴旋转)。因此,对象旋转是 始终 存储在对象的 quaternion 中。

该库的早期版本中包含一个 useQuaternion 属性,当设置为false时,将导致对象的 matrix 从欧拉角度计算出来。这种方法已经启用——作为替代,您应该使用 setRotationFromEuler 方法,该方法将更新四元数。