BufferGeometry
Object3D
Raycaster
Camera
CubeCamera
PerspectiveCamera
OrthographicCamera
StereoCamera
Clock
Curve
CurvePath
Path
Shape
ShapePath
ArrowHelper
AxesHelper
BoxHelper
Box3Helper
CameraHelper
DirectionalLightHelper
GridHelper
PolarGridHelper
HemisphereLightHelper
PlaneHelper
PointLightHelper
SkeletonHelper
SpotLightHelper
Light
PointLight
RectAreaLight
SpotLight
DirectionalLight
HemisphereLight
LightShadow
PointLightShadow
AnimationLoader
AudioLoader
BufferGeometryLoader
CompressedTextureLoader
CubeTextureLoader
DataTextureLoader
FileLoader
ImageBitmapLoader
ImageLoader
Loader
LoaderUtils
MaterialLoader
ObjectLoader
TextureLoader
LoadingManager
Material
Box2
Box3
Color
Cylindrical
Euler
Frustum
Interpolant
Line3
MathUtils
Matrix3
Matrix4
Plane
Quaternion
AnimationAction
AnimationClip
AnimationMixer
AnimationObjectGroup
AnimationUtils
keyframeTrack
PropertyBinding
PropertyMixer
BooleanKeyframeTrack
QuaternionKeyframeTrack
StringKeyframeTrack
Audio
AudioAnalyser
AudioContext
AudioListener
PositionalAudio

Matrix3.premultiply()

该方法会将当前 Matrix3 实例缩放、旋转或平移矩阵与传入参数的矩阵进行乘法运算,并将结果更新到当前 Matrix3 实例中。该方法的语法为:

Matrix3.premultiply(matrix: Matrix3): Matrix3

参数 matrix 是一个 Matrix3 实例,它将与当前实例的矩阵进行乘法。该方法会返回更新后的当前 Matrix3 实例。

在 three.js 库中使用 Matrix3.premultiply() 方法,常常会被用作将子物体相对于父物体的矩阵与父物体的矩阵进行乘法,以获取子物体所处于全局坐标系中的位置、旋转、缩放等属性。

示例

import { Matrix3 } from 'three';

const parentMatrix = new Matrix3();
// 设置父物体的位移矩阵
parentMatrix.set(
  1, 0, 10,
  0, 1, 20,
  0, 0, 1
);

const childMatrix = new Matrix3();
// 设置子物体相对于父物体的位移矩阵
childMatrix.set(
  1, 0, 5,
  0, 1, 10,
  0, 0, 1
);

childMatrix.premultiply(parentMatrix);

console.log(childMatrix.elements); // [1, 0, 15, 0, 1, 30, 0, 0, 1]

在上面的示例中,我们首先创建了父物体的位移矩阵 parentMatrix,它表示父物体在全局坐标系中的位置。然后,我们创建了子物体相对于父物体的位移矩阵 childMatrix,它表示子物体在父物体坐标系中的位置。最后,我们使用 Matrix3.premultiply() 方法将 parentMatrixchildMatrix 进行乘法运算,并将结果更新到 childMatrix 中。

运行上面的代码,控制台会输出 [1, 0, 15, 0, 1, 30, 0, 0, 1],表示子物体在全局坐标系中的位置为 (x: 15, y: 30),与预期结果一致。

注意事项

  • Matrix3.premultiply() 方法会将原有的矩阵对象进行修改,并不会创建新的对象。因此,在使用该方法时需要注意保护原有数据。
  • 该方法不会修改传入参数 matrix,而是将结果更新到当前 Matrix3 实例中。如果需要得到更新后的结果,需要从调用该方法的对象中进行获取。