为什么使用JOML库时3D立方体多轴旋转过程中会出现异常畸变?
问题解决方案
问题根源
调用Matrix4f.rotate()方法时传入的旋转轴向量没有做归一化处理,JOML的旋转矩阵计算逻辑默认输入的旋转轴为单位向量,非单位长度的轴会导致计算出的模型矩阵附带非预期的缩放分量,旋转到特定角度时就会出现明显的拉伸/畸变效果。
修复方案
在传入旋转轴之前对向量做归一化处理即可,可直接使用JOML自带的向量归一化方法操作。
修复后的代码示例
模型矩阵部分
// 这是带纹理立方体旋转所用的模型矩阵 Matrix4f model = new Matrix4f(); model.identity(); // 先对旋转轴做归一化处理 Vector3f rotateAxis = new Vector3f(0.5f, 1.0f, 0.0f).normalize(); model.rotate((float)(glfwGetTime() * Math.toRadians(50.0f)), rotateAxis, model);
坐标系矩阵部分(无需改动)
// 坐标系相关的其他矩阵代码 Matrix4f view = new Matrix4f(); view.identity(); view.translate(new Vector3f(0.0f, 0.0f, -3.0f), view); Matrix4f projection = new Matrix4f(); projection.identity(); projection.perspective((float)Math.toRadians(45.0f), 800.0f / 600.0f, 0.1f, 100.0f); // 视场角为45度
补充说明
后续所有旋转变换操作,都需要保证传入的旋转轴是单位向量,避免引入异常缩放分量。
内容的提问来源于stack exchange,提问作者BerserkGoat8
相关产品推荐
相关产品推荐

