【问题标题】:shape distortion when rotating model matrix旋转模型矩阵时的形状变形
【发布时间】:2020-10-31 18:47:48
【问题描述】:

我正在尝试将 glm 库与 openGL 结合使用来旋转形状。不幸的是,当我尝试使用 glm::rotate() 旋转形状时,我的形状尺寸会被拉伸。除此之外,形状围绕一个看似随机的点旋转。一切都是二维的。

顶点着色器代码:

#version 330 core

layout(location = 0) in vec2 pos;
uniform mat4 model;
uniform mat4 projection;
uniform mat4 view;

void main()
{
    gl_Position = projection * view * model * vec4(pos.x, pos.y, 1.0f, 1.0f);
}

模型矩阵代码:

m_angle = angle;
m_modelMatrix = glm::rotate(glm::mat4(1.0f), glm::radians((float)m_angle), glm::vec3(0, 0, 1));

投影和查看矩阵代码:

glm::mat4 proj = glm::mat4(1.0f);
glm::mat4 view = glm::mat4(1.0f);
proj = glm::perspective(glm::radians(53.f), 1.f, 0.1f, 100.f);
view = glm::translate(view, glm::vec3(0.0f, 0.0f, -3.0f));    

【问题讨论】:

    标签: c++ opengl matrix glm-math


    【解决方案1】:

    这个问题是因为投影矩阵没有考虑视口的纵横比。在您的代码中,aspect 参数是 1.0:

    proj = glm::perspective(glm::radians(53.f), 1.f, 0.1f, 100.f);
    

    aspect 参数必须是 viewprot 窗口的宽高比:

    float aspect = (float)window_width/(float)window_height;
    proj = glm::perspective(glm::radians(53.f), aspect, 0.1f, 100.f);
    

    【讨论】:

    • 我一直在搞乱这个参数。当我将其设置为 1.f 时,所有形状都具有适当的尺寸并且没有拉伸,并且旋转不起作用。但是当它只是 1.f 时,除了旋转的形状之外,形状不会被拉伸。
    • @cummiesinmytummy 可能您通过视图或模型矩阵来补偿矩形视口。那是错的。如果你想画一个正方形,那么边的长度必须相等,并且视图和模型矩阵不缩放或在所有方向上均匀缩放。矩形视口必须通过投影矩阵进行补偿。没有其他解决方案。阅读Camera
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多