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 | 将当前状态重设为单位矩阵。 |