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

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时的效果:
    缩放比例1.0
  • 缩放比例10.0时的效果:
    缩放比例10.0

问题原因与解决办法

原因

问题出在模型的局部原点不在自身几何中心。当前S-R-T顺序下,缩放会先作用于模型顶点,模型几何中心相对于局部原点的偏移量会被缩放倍数放大,之后的平移操作无法抵消这个放大后的偏移,最终导致模型世界位置偏移。

解决办法

  1. 修改模型原点:建模时将模型的原点设置在几何中心,这样缩放会围绕自身中心进行,不会改变模型的世界位置,保持现有S-R-T顺序即可正常工作。
  2. 代码中修正变换逻辑:如果无法修改模型,先计算模型的几何中心(比如通过遍历顶点计算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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 07:57:13