You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java调用Matrix4f静态方法构建变换矩阵不生效问题求助

问题核心原因

你现有代码的问题主要有两个:

  1. 你调用的translate、rotate、scale都是静态方法,执行后会返回新生成的独立变换矩阵,但你既没有接收这些返回值,也没有将这些变换矩阵和你初始化的matrix做乘法合并,最终返回的还是最开始的空单位矩阵,完全没有生效。
  2. 角度单位重复转换:你在调用rotate方法时用Math.toDegrees把弧度转成了角度,但rotate方法内部已经做了Math.toRadians(angle)的弧度转换操作,两次转换会导致旋转角度完全不符合预期。

修复方案

首先确认你使用的SilverTiger的Matrix4f实现中,矩阵乘法方法的形式:如果是实例方法mul会修改当前矩阵本身,修复后的代码如下:

public static Matrix4f createTransformationMatrix(Vector3f translation, float rx, float ry, float rz, float scale) {
    Matrix4f matrix = new Matrix4f();
    // 矩阵乘法顺序对应变换逻辑:先缩放、再旋转、最后平移,列向量模式下按此顺序相乘即可
    matrix.mul(Matrix4f.scale(scale, scale, scale));
    matrix.mul(Matrix4f.rotate(rx, 1, 0, 0));
    matrix.mul(Matrix4f.rotate(ry, 0, 1, 0));
    matrix.mul(Matrix4f.rotate(rz, 0, 0, 1));
    matrix.mul(Matrix4f.translate(translation.x, translation.y, translation.z));
    return matrix;
}

如果你的mul方法是返回新矩阵而不修改原矩阵,调整写法即可:

public static Matrix4f createTransformationMatrix(Vector3f translation, float rx, float ry, float rz, float scale) {
    Matrix4f matrix = new Matrix4f();
    matrix = matrix.mul(Matrix4f.scale(scale, scale, scale));
    matrix = matrix.mul(Matrix4f.rotate(rx, 1, 0, 0));
    matrix = matrix.mul(Matrix4f.rotate(ry, 0, 1, 0));
    matrix = matrix.mul(Matrix4f.rotate(rz, 0, 0, 1));
    matrix = matrix.mul(Matrix4f.translate(translation.x, translation.y, translation.z));
    return matrix;
}

如果运行后发现变换顺序不符合预期,调整矩阵相乘的顺序即可。

内容的提问来源于stack exchange,提问作者Xenon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 00:48:04