Java调用Matrix4f静态方法构建变换矩阵不生效问题求助
问题核心原因
你现有代码的问题主要有两个:
- 你调用的
translate、rotate、scale都是静态方法,执行后会返回新生成的独立变换矩阵,但你既没有接收这些返回值,也没有将这些变换矩阵和你初始化的matrix做乘法合并,最终返回的还是最开始的空单位矩阵,完全没有生效。 - 角度单位重复转换:你在调用
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
相关产品推荐
相关产品推荐

