【发布时间】: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