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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 16:23:19