OpenGL - 对 3D 多边形应用变换 space
OpenGL - Apply transformation to polygon in 3D space
我正在尝试在 3D 中旋转四边形 space。以下代码显示了用于绘制四边形的顶点着色器:
#version 330 core
layout (location = 0) in vec3 aPos;
layout (location = 1) in vec3 aColor;
out vec3 ourColor;
uniform mat4 transform;
uniform mat4 model;
uniform mat4 view;
uniform mat4 projection;
void main()
{
gl_Position = transform*(projection*view*model*vec4(aPos, 1.0f));
ourColor = aColor;
}
transform
不乘以projection*view*model*vec4(aPos,1.0f)
时显示四边形,如上乘时不显示。
转换代码:
trans=glm::rotate(trans,(float)(glfwGetTime()),glm::vec3(0.0,0.0,1.0));
float scaleAmount = sin(j*0.3);j=j+0.035;
trans=glm::scale(trans,glm::vec3(scaleAmount,scaleAmount,scaleAmount));
unsigned int transformLoc = glGetUniformLocation(shaderProgram, "transform");
glUniformMatrix4fv(transformLoc, 1, GL_FALSE, glm::value_ptr(trans));
glBindVertexArray(VAO);
glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);
我在vertex shader中也设置了uniform。
为什么它不旋转和缩放,甚至在我乘transform
和[=时出现16=] ?
编辑: 我发现问题在于缩放,因为代码仅适用于旋转。该代码不适用于仅缩放。
让我们只考虑二维。
四边形在 "world" 坐标中定义。要将它 围绕某个点 旋转,请将四边形移动到该点,然后旋转并缩放它,然后将其移回。
对矩阵的处理与 transform * model
相同,其中 transform
类似于
transform = moveback * scale * rotate * movetopoint
如果scaleAmount == 0.0
:
glm::mat4 trans( 1.0f );
float scaleAmount = 0.0f;
trans=glm::scale(trans,glm::vec3(scaleAmount,scaleAmount,scaleAmount));
那么这会导致 trans
是
{{0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 1}}
因为 sin(0.0) == 0.0
必须确保在 sin(j*0.3);
的情况下 j
不等于 0.0.
我正在尝试在 3D 中旋转四边形 space。以下代码显示了用于绘制四边形的顶点着色器:
#version 330 core
layout (location = 0) in vec3 aPos;
layout (location = 1) in vec3 aColor;
out vec3 ourColor;
uniform mat4 transform;
uniform mat4 model;
uniform mat4 view;
uniform mat4 projection;
void main()
{
gl_Position = transform*(projection*view*model*vec4(aPos, 1.0f));
ourColor = aColor;
}
transform
不乘以projection*view*model*vec4(aPos,1.0f)
时显示四边形,如上乘时不显示。
转换代码:
trans=glm::rotate(trans,(float)(glfwGetTime()),glm::vec3(0.0,0.0,1.0));
float scaleAmount = sin(j*0.3);j=j+0.035;
trans=glm::scale(trans,glm::vec3(scaleAmount,scaleAmount,scaleAmount));
unsigned int transformLoc = glGetUniformLocation(shaderProgram, "transform");
glUniformMatrix4fv(transformLoc, 1, GL_FALSE, glm::value_ptr(trans));
glBindVertexArray(VAO);
glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);
我在vertex shader中也设置了uniform。
为什么它不旋转和缩放,甚至在我乘transform
和[=时出现16=] ?
编辑: 我发现问题在于缩放,因为代码仅适用于旋转。该代码不适用于仅缩放。
让我们只考虑二维。
四边形在 "world" 坐标中定义。要将它 围绕某个点 旋转,请将四边形移动到该点,然后旋转并缩放它,然后将其移回。
对矩阵的处理与 transform * model
相同,其中 transform
类似于
transform = moveback * scale * rotate * movetopoint
如果scaleAmount == 0.0
:
glm::mat4 trans( 1.0f );
float scaleAmount = 0.0f;
trans=glm::scale(trans,glm::vec3(scaleAmount,scaleAmount,scaleAmount));
那么这会导致 trans
是
{{0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 1}}
因为 sin(0.0) == 0.0
必须确保在 sin(j*0.3);
的情况下 j
不等于 0.0.