mtr-nte:js-math

JavaScript 数学工具类

此处不再赘述 JavaScript 标准库中的数学工具。而是介绍 NTE 中进行模型渲染变换等所提供的一组工具类。

三维矢量,也就是一个 (x, y, z) 的坐标。

成员 说明
new Vector3f(x: float, y: float, z: float) 创建一个 Vector3f。
Vector3f.x(): float 获取它的 X 坐标。Y/Z 同理。
Vector3f.copy(): Vector3f 复制一个 Vector3f,以便独立地进行一些修改。
Vector3f.normalize(): void 标准化为一个单位矢量,即保持它的方向,但让它的长度变为 1。
Vector3f.add(x: float, y: float, z: float): void 加上另一个矢量。
Vector3f.add(other: Vector3f): void 加上另一个矢量。
Vector3f.sub(other: Vector3f): void 减去另一个矢量。
Vector3f.mul(x: float, y: float, z: float): void 分别让三个分量与三个数相乘。
Vector3f.mul(n: float): void 数乘,让三个分量分别与同一个数相乘。
Vector3f.rot(axis: Vector3f, rad: float): void 在原点绕一个方向旋转这个矢量。角度采用弧度制,正值为逆时针,axis 需要是单位矢量。
Vector3f.rotDeg(axis: Vector3f, deg: float): void 同上,但是采用角度制。
Vector3f.rotX(rad: float): void 按照 X 轴旋转,角度采取弧度制。Y/Z 同理。
Vector3f.cross(other: Vector3f): void 与另一个矢量计算叉积,然后让自己成为结果。结果会与两个均垂直。
Vector3f.distance(other: Vector3f): float 到另一个矢量所代表的坐标的距离。
Vector3f.distanceSq(other: Vector3f): float 到另一个矢量所代表的坐标的平方。比上一个算起来稍微快一点。
Vector3f.toBlockPos(): BlockPos 取整转换成 Minecraft 原版的 BlockPos。
static Vector3f.ZERO: Vector3f 一个零矢量。不要对他做操作。
static Vector3f.XP: Vector3f (1, 0, 0)。Y/Z 同理。

三维变换矩阵。代表了把一个点对应到另一个点的一种变换关系。例如,我可以说 “我要把这个模型先绕 Y 轴旋转 90 度,再沿 X 轴移动 10 米……”,而这样的一组变换操作就可以用一个矩阵来表示。

需要注意的是,如果按照 “我要把这个模型先绕 Y 轴旋转 90 度,再沿 X 轴移动 10 米……” 的这种思路去想的话,那么会 “先发生” 的变换实际上是更靠后调用的函数。您可以理解成更靠后调用的函数离原始模型更近,而更靠前调用的函数离最终结果更近,所以如果从模型的原始位置出发来想的话是会更早那样变换。

不提供缩放变换。

成员 说明
new Matrix4f() 创建一个 Matrix4f。初始的是一个单位矩阵,它不做任何变换。
Matrix4f.copy(): Matrix4f 复制一个 Matrix4f,以便独立地进行一些修改。
Matrix4f.translate(x: float, y: float, z: float): void 增加一个平移 (x,y,z) 的变换。
Matrix4f.rotate(axis: Vector3f, rad: float): void 增加一个在原点绕某个方向旋转的变换。角度采用弧度制,正值为逆时针,axis 需要是单位矢量。
Matrix4f.rotateX(rad: float): void 按照 X 轴旋转,角度采取弧度制。Y/Z 同理。
Matrix4f.multiply(other: Vector3f): void 右乘另一个变换矩阵,即把那个矩阵的变换接在这个的后面。
Matrix4f.transform(vec: Vector3f): Vector3f 计算一个坐标按照这个变换进行之后会到哪一个坐标。会返回一个新的 Vector3f,不会动输入值。
Matrix4f.transform3(vec: Vector3f): Vector3f 同上,但只计入旋转不计入平移。
Matrix4f.getTranslationPart(): Vector3f (0,0,0) 按照这个变换进行之后会到哪一个坐标。
Matrix4f.asMoj(): ? 转换成 Minecraft 原版所使用的矩阵类型。
static Matrix4f.translation(x: float, y: float, z: float): Matrix4f 获取一个平移变换矩阵。

在渲染时会有 “恢复上一步时候的变换状态” 的需要。例如,我会加一个向下的平移变换来渲染转向架,但渲染完之后我要回到平移之前的变换状态来渲染车内其他的部件。

Matrices 实现一个堆栈,可以存储多个变换状态。push 和 pop 是要成对进行的。

成员 说明
new Matrices() 创建一个 Matrices。初始的只有一项单位矩阵。
Matrices.translate(x: float, y: float, z: float): void 为当前状态增加一个平移 (x,y,z) 的变换。
Matrices.rotate(axis: Vector3f, rad: float): void 为当前状态增加一个在原点绕某个方向旋转的变换。角度采用弧度制,正值为逆时针,axis 需要是单位矢量。
Matrices.rotateX(rad: float): void 按照 X 轴旋转,角度采取弧度制。Y/Z 同理。
Matrices.last(): Matrix4f 获取当前状态。
Matrices.pushPose(): void 将当前状态复制一份压入堆栈。就是把当前状态复制了一份保存起来。
Matrices.popPose(): void 弹出堆栈的最后一项。即,把当前状态丢掉,然后恢复出来上一个保存的状态设为当前状态。
Matrices.popPushPose(): void 先恢复再保存。
Matrices.clear(): boolean 现在是否只有一项。
Matrices.setIdentity(): void 将当前状态重设为单位矩阵。
  • mtr-nte/js-math.txt
  • 最后更改: 2025/04/20 21:39
  • 127.0.0.1