【问题标题】:How to Rotate a Quad如何旋转四边形
【发布时间】:2022-01-18 21:35:33
【问题描述】:

我正在尝试让四边形围绕其中心旋转。我正在使用glm::rotate() 并将四边形设置为在 z 轴上旋转。但是,当我这样做时,它会产生这种奇怪的效果。四边形伸展和弯曲。它看起来几乎是 3d,但由于我围绕 z 轴旋转它,这不应该发生对吗?

这里是上下文的相关代码:

    float rotation = 0.0f;
    double prevTime = glfwGetTime();

    while (!glfwWindowShouldClose(window)) 
    {
        GLCall(glClearColor(0.0f, 0.0f, 0.0f, 1.0f));

        GLCall(glClear(GL_COLOR_BUFFER_BIT));

        updateInput(window);

        shader.Use();
        glUniform1f(xMov, x);
        glUniform1f(yMov, y);
        test.Bind();

        double crntTime = glfwGetTime();
        if (crntTime - prevTime >= 1 / 60) 
        {
            rotation += 0.5f;
            prevTime = crntTime;
        }

        glm::mat4 model = glm::mat4(1.0f);

        model = glm::rotate(model, glm::radians(rotation), glm::vec3(0.0f, 0.0f, 1.0f));

        int modelLoc = glGetUniformLocation(shader.id, "model");
        glUniformMatrix4fv(modelLoc, 1, GL_FALSE, glm::value_ptr(model));

        vao.Bind();
        vBuffer1.Bind();
        iBuffer1.Bind();

        GLCall(glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0));

        glfwSwapBuffers(window);

        glfwPollEvents();
    }

着色器:

#version 440 core

layout(location = 0) in vec3 aPos;
layout(location = 1) in vec3 aColor;
layout(location = 2) in vec2 aTex;

out vec3 color;
out vec2 texCoord;

uniform float xMove;
uniform float yMove;
uniform mat4 model;

void main()
{
    gl_Position = model * vec4(aPos.x + xMove, aPos.y + yMove, aPos.z, 1.0);
    color = aColor;
    texCoord = aTex;
}

【问题讨论】:

  • 如果您尝试绕其他 2 个轴旋转会发生什么情况?
  • 它看起来与您期望的 2d 平面在 3d 空间中旋转的完全一样。我不明白为什么它在 x 和 y 轴上看起来不错,但对 z 轴不起作用。
  • 您的目标是哪个 OpenGL 版本/配置文件?请将着色器添加到您的问题中。 test.Bind(); 是什么?
  • 我的目标是 gl4,test.Bind(); 是纹理文件。
  • IIRC glm::rotate 执行轴角旋转,而不是欧拉角旋转。如果我从图形编程的早期阶段学到了什么,那就是你永远不能相信你理解实际发生的事情,这也与每个轴实际代表的内容有关。

标签: c++ opengl glsl glfw glm-math


【解决方案1】:

如果不显示图形输出就很难说。

您的第一个问题是,您不是围绕中心旋转,要按中心旋转,您必须偏移四边形,使其中心位于 0,0。然后旋转,然后偏移回原来的位置,但是你有这条线:

gl_Position = model * vec4(aPos.x + xMove, aPos.y + yMove, aPos.z, 1.0);

假设四边形在你开始的原点围绕点(-xMove,-yMove)旋转。

【讨论】:

  • 我认为这与我的窗口分辨率有关。最初我将其设置为与显示器的分辨率相匹配。但我只是尝试将它设置为方形,现在它可以工作了。我如何解释不是方形的分辨率?
  • 您需要一个视图转换来取消 OGL 窗口引入的剪切。 Ogl 将 (-1, -1)-(1,1) 正方形映射到您的窗口,如果窗口不是正方形,那么您将正方形映射到矩形,这显然是变形的。我建议您查看实际的正交相机,但现在您可以乘以纵横比(宽度/高度或高度/宽度,不记得哪个 atm)
  • 我可以使用纵横比将正方形绘制到屏幕上。但是,当我尝试应用旋转变换时,它会变得完全扭曲。我怎样才能消除这种影响?
  • 您在旋转后应用变形取消,这应该是最后一步。
  • 也许也喜欢那个答案:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-23
  • 2019-10-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多