OpenGL渲染立方体出现X轴三倍压缩问题求助
问题排查与解决方案
核心原因分析
1. 模型变换矩阵顺序颠倒
GLM采用列主序矩阵,变换的应用逻辑是从右到左执行。你当前在Transformation::M()中使用的顺序是positionMatrix * rotationMatrix * scaleMatrix,这会导致平移先被旋转和缩放作用,缩放会直接影响平移向量的轴向比例,最终造成X轴方向的异常压缩。正确的变换顺序应该是缩放→旋转→平移,这样缩放只作用于模型本身,不会干扰平移操作。
2. 世界变换矩阵组合顺序错误
在GameObject::draw()中,你将自身变换放在父变换之前相乘(transform.M() * parentTransform),这会导致自身变换先于父变换执行,打破了“父变换先作用于子对象”的层级逻辑,可能引入额外的缩放干扰。正确的顺序应该是父变换在前,自身变换在后。
3. 投影矩阵宽高比可能异常(额外排查点)
如果投影矩阵的宽高比参数设置错误(比如将窗口高度/宽度当成宽高比),也会导致某个轴向的拉伸或压缩。比如窗口宽800、高600时,宽高比应为800/600≈1.333,若搞反会直接造成X轴压缩。
具体修复方案
修复模型变换矩阵顺序
修改Transformation::M()方法的矩阵乘法顺序:
glm::mat4x4 Transformation::M() { return scaleMatrix * glm::toMat4(rotationQuat) * positionMatrix; }
修复世界变换矩阵组合顺序
调整GameObject::draw()中的世界变换计算:
glm::mat4x4 worldTransform = parentTransform * transform.M();
验证投影矩阵宽高比
检查投影矩阵的创建代码,确保宽高比参数正确:
// 示例:基于窗口尺寸计算正确宽高比 float windowWidth = 800.0f; float windowHeight = 600.0f; float aspectRatio = windowWidth / windowHeight; glm::mat4 projectionMatrix = glm::perspective(glm::radians(45.0f), aspectRatio, 0.1f, 100.0f);
内容的提问来源于stack exchange,提问作者Marko Taht
相关产品推荐
相关产品推荐

