OpenGL中模型缩放影响位置问题求助
缩放操作导致模型位置偏移的问题
我按照S-R-T(缩放-旋转-平移)顺序对模型进行变换,但缩放操作会改变模型的位置,蓝色平面的原点为(0,0,0)。
模型矩阵计算代码(C++)
// set model matrix glm::mat4 model = glm::mat4( 1.0f ); // scale model = glm::scale( model, _entity.Scale ); // rotate model = glm::rotate( model, glm::radians( _entity.Rotation.x ), glm::vec3( 1.0f, 0.0f, 0.0f ) ); model = glm::rotate( model, glm::radians( _entity.Rotation.y ), glm::vec3( 0.0f, 1.0f, 0.0f ) ); model = glm::rotate( model, glm::radians( _entity.Rotation.z ), glm::vec3( 0.0f, 0.0f, 1.0f ) ); // translate model = glm::translate( model, _entity.Position ); Shader::setMat4( _shader, "model", model );
顶点着色器代码
vs_out.FragPos = vec3(model * vec4(aPos, 1.0)); vs_out.Normal = mat3(transpose(inverse(model))) * aNormal; vs_out.TexCoord = aTexCoord; gl_Position = projection * view * vec4(vs_out.FragPos, 1.0);
效果对比
- 缩放比例1.0时的效果:

- 缩放比例10.0时的效果:

问题原因与解决办法
原因
问题出在模型的局部原点不在自身几何中心。当前S-R-T顺序下,缩放会先作用于模型顶点,模型几何中心相对于局部原点的偏移量会被缩放倍数放大,之后的平移操作无法抵消这个放大后的偏移,最终导致模型世界位置偏移。
解决办法
- 修改模型原点:建模时将模型的原点设置在几何中心,这样缩放会围绕自身中心进行,不会改变模型的世界位置,保持现有S-R-T顺序即可正常工作。
- 代码中修正变换逻辑:如果无法修改模型,先计算模型的几何中心(比如通过遍历顶点计算AABB的中心),然后调整变换矩阵:
// 假设已获取模型几何中心 localCenter glm::mat4 model = glm::mat4(1.0f); // 先缩放、旋转 model = glm::scale(model, _entity.Scale); model = glm::rotate(model, glm::radians(_entity.Rotation.x), glm::vec3(1.0f, 0.0f, 0.0f)); model = glm::rotate(model, glm::radians(_entity.Rotation.y), glm::vec3(0.0f, 1.0f, 0.0f)); model = glm::rotate(model, glm::radians(_entity.Rotation.z), glm::vec3(0.0f, 0.0f, 1.0f)); // 计算偏移:目标位置减去缩放旋转后的模型中心 glm::vec3 offset = _entity.Position - glm::vec3(model * glm::vec4(localCenter, 1.0f)); // 平移到修正后的位置 model = glm::translate(model, offset); Shader::setMat4(_shader, "model", model);
这段代码先完成缩放和旋转,再通过偏移计算将模型几何中心对齐到目标世界位置,避免缩放导致的偏移。
内容的提问来源于stack exchange,提问作者user13310405
相关产品推荐
相关产品推荐

