[英]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.