矩阵变换 (Matrix transformations)

Three.js 使用 matrix 编码 3D 变换 —— 平移(位置)、旋转和缩放。
Object3D 的每个实例都有一个 matrix,用于存储该对象的位置、旋转和比例。本页介绍如何更新对象的变换。

便利的属性和 matrixAutoUpdate (Convenience properties and matrixAutoUpdate)

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

  1. 修改对象的 positionquaternionscale 属性,让 three.js 重新计算来自这些属性的对象矩阵:
  1. object.position.copy( start_position );
  2. object.quaternion.copy( quaternion );

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

  1. object.matrixAutoUpdate = false;

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

  1. object.updateMatrix();
  1. 直接修改对象的矩阵。 Matrix4 类有各种修改矩阵的方法:
  1. object.matrix.setRotationFromQuaternion( quaternion );
  2. object.matrix.setPosition( start_position );
  3. object.matrixAutoUpdate = false;

请注意,在这种情况下,matrixAutoUpdate 必须 设置为 false,并且您应该确保 调用 updateMatrix
调用 updateMatrix 将破坏对矩阵所做的手动更改,从 positionscale 重新计算矩阵,依此类推。

对象和世界矩阵 (Object and world matrices)

一个对象的 matrix 存储了该对象 相对于parent(父节点)的变换。
要在 世界 坐标系中获取对象的转换,您必须访问该对象的 matrixWorld

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

旋转和四元数 (Rotation and Quaternion)

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

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