OpenGL 使用模型矩阵缩放三角形异常 显示结果不符合预期求助
问题原因
你遇到的问题由两个核心错误导致:
- 矩阵变换没有叠加,每次赋值都直接覆盖了之前的变换结果
- 不了解GLM矩阵的运算顺序规则
1. 变换覆盖问题
你两次写法中,每次构造新变换时都传入了glm::mat4(1.0f)(单位矩阵)作为构造的基础矩阵,并且直接赋值给mModel,这会直接抹掉上一步的变换结果,相当于只有最后一行的变换生效:
- 第一段代码最后一行是平移变换,缩放直接被覆盖,自然没有缩放效果
- 第二段代码最后一行是缩放变换,平移被覆盖,三角形只会在原点位置缩放,所以显示位置异常
2. GLM矩阵运算顺序规则
GLM默认使用列主序矩阵,遵循右乘规则,变换的执行顺序和你代码的书写顺序是反过来的:越晚写的变换,越先作用到顶点上。
如果你的预期是「先把三角形本身放大2倍,再移动到mLocation指定的位置」,那么变换的执行顺序为 缩放 -> 平移,对应代码书写顺序为 平移 -> 缩放。
正确写法
void Triangle::UpdateTransform() { mView = glm::translate(glm::mat4(1.0f), glm::vec3(0.0f)); // 先初始化模型矩阵为单位矩阵 mModel = glm::mat4(1.0f); // 先写平移(后执行) mModel = glm::translate(mModel, mLocation); // 再写缩放(先执行) mModel = glm::scale(mModel, glm::vec3(2.f)); // 你当前的MVP顺序是对的,对应投影 * 视图 * 模型 * 顶点 mMVP = mProj * mView * mModel; }
另外你的顶点着色器写法没有问题,不需要修改。
内容的提问来源于stack exchange,提问作者Uytab
相关产品推荐
相关产品推荐

