JavaScript 数学工具类
此处不再赘述 JavaScript 标准库中的数学工具。而是介绍 NTE 中进行模型渲染变换等所提供的一组工具类。
Vector3f
三维矢量,也就是一个 (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 同理。 |
Matrix4f
三维变换矩阵。代表了把一个点对应到另一个点的一种变换关系。例如,我可以说 “我要把这个模型先绕 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
在渲染时会有 “恢复上一步时候的变换状态” 的需要。例如,我会加一个向下的平移变换来渲染转向架,但渲染完之后我要回到平移之前的变换状态来渲染车内其他的部件。
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 |
将当前状态重设为单位矩阵。 |