矩阵转换

Three.js使用矩阵来编码transform, 包括位移(translate), 旋转(rotate)和缩放(scale).

每一个Object3D的实例都有一个保存其transform(位移, 旋转, 缩放)的矩阵.这一节介绍如何更新一个物体的变换属性.

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

有两种方法可以更新一个物体的变换属性:

1, 修改物体的transform(位置, 四元数, 以及缩放属性), 然后让three.js从这些属性中重新计算物体的矩阵:

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

默认情况, matrixAutoUpdate属性是true, 矩阵会自动重新计算. 如果物体是静态的, 为了提升性能, 你就需要手动控制是否重新计算.

object.matrixAutoUpdate = false;

在修改任何属性只会, 手动更新矩阵:

object.updateMatrix();

2, 直接修改物体的矩阵. Matrix4 这个类有不同的方法可以修改矩阵:

object.matrix.setRotationFromQuaternion(quaternion);

object.matrix.setPosition(start_position);
object.matrixAutoUpdate = false;

注意此时matrixAutoUpdate必须设置为false, 并且不能再调用 updateMatrix. 如果调用了updateMatrix会再次计算transform.

物体和世界坐标矩阵

一个物体的矩阵保存了相对于其父物体的transform. 要获得物体相对于世界坐标的transform, 则需要调用 Object3D.matrixWord

当父物体或子物体的transform改变之后, 你可以通过调用updateMatrixWord() 来更新字符体的matrixWord

旋转和四元数(Quaternion)

Three.js提供两种方法来表示3D旋转: 欧拉角和四元数, 欧拉角易受到"万向锁"的影响, 这会导致配置中的角度可能无法自由控制. 基于这点, 物体旋转通常保存在四元数对象中.

之前的three.js版本中包含一个useQuaternion的属性, 如果是false, 将会从欧拉角中计算物体的矩阵. 现在此方法被弃用了, 可以使用setRotationFromEuler方法来更新四元数.

results matching ""

    No results matching ""