繁体   English   中英

通过 OpenGL/GLFW 中的用户输入旋转 2D 三角形

[英]Rotate an 2D triangle via User Input in OpenGL/GLFW

我创建了一个带有纹理的 2D 三角形。 我希望它通过用户输入旋转:是否按下了左键,它应该围绕自身旋转,直到不再按下该键。 与右键相同。

Renderer renderer;
    /* Loop until the user closes the window */
    while (!glfwWindowShouldClose(window))
    {

        /* Render here */
        renderer.Clear();

        shader.Bind(); //bind shader

        renderer.Draw(va, ib, shader);

        if (glfwGetKey(window, GLFW_KEY_LEFT) == GLFW_PRESS)
        {
          **code here**
        }//...

这是我的三角形。 它的位置有两个浮点数,纹理位置有两个浮点数:

float positions[] = {
  -0.015f, -0.015f, 0.0f, 0.0f,
  0.015f, -0.015f, 1.0f, 0.0f, 
  0.0f, 0.06f, 0.5f, 1.0f
  };

这是 Renderer Draw 方法:

void Renderer::Draw(const VertexArray& va, const IndexBuffer& ib, const Shader& shader) const {

    shader.Bind();
    va.Bind();
    ib.Bind();
    glDrawElements(GL_TRIANGLES, ib.GetCount(), GL_UNSIGNED_INT, nullptr);
}

在用于三角形的顶点着色器中,您需要有一个模型矩阵,用于乘以顶点坐标。 这将需要是统一的,以便您可以从 C++ 代码中设置它。 在顶点着色器中看起来像这样:

#version ...

layout (location = 0) aPos;
layout (location = 1) aTexCoords;    

out vec2 texCoords;

uniform mat4 model;

void main()
{
    gl_Position = model * vec4(aPos, 0.0f, 1.0f);
    texCoords = aTexCoords;
}

在您的 C++ 代码中,您需要创建一个模型矩阵来定义您想要执行的转换,然后在顶点着色器中进行设置。 使用围绕 z 轴旋转 90 度的 glm 的示例如下所示:

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

要在用户按下左右键时进行旋转,您可以在渲染循环之外定义一个变量来设置旋转的起始角度。 例如:

float rotationAngle = 0.0f;

然后在渲染循环中,在检查每个按下的键的 if 语句中,如果按下右键,则需要将角度增加一定量,如果按下左键,则需要将角度减少相同的量。 这看起来像这样:

if (glfwGetKey(window, GLFW_KEY_LEFT) == GLFW_PRESS)
{
    rotationAngle -= 0.1f; // use a suitable value here
}

if (glfwGetKey(window, GLFW_KEY_RIGHT) == GLFW_PRESS)
{
    rotationAngle += 0.1f; // use a suitable value here
}

在检查按下的箭头键并相应调整角度的代码之后,您将添加创建模型矩阵的代码。 渲染循环如下所示:

Renderer renderer;

float rotationAngle = 0.0f;

while (!glfwWindowShouldClose(window))
{

    /* Render here */
    renderer.Clear();

    shader.Bind(); //bind shader

    renderer.Draw(va, ib, shader);

    if (glfwGetKey(window, GLFW_KEY_LEFT) == GLFW_PRESS)
    {
        rotationAngle -= 0.1f; // use a suitable value here
    }

    if (glfwGetKey(window, GLFW_KEY_RIGHT) == GLFW_PRESS)
    {
        rotationAngle += 0.1f; // use a suitable value here
    }

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

    // Set the model uniform in your shader (use whatever your
    // shader ID is or set the uniform your way if the shader 
    // class you are using has a method for doing this).
    shader.Bind();
    glUniformMatrix4fv(glGetUniformLocation(shaderID, "model".c_str()), 1, GL_FALSE, glm::value_ptr(model));

    // Draw the triangle
    // ....
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM