OpenGL - 在3D空间中将变换应用于多边形

时间:2018-05-09 19:14:56

标签: c++ opengl transformation glm-math

我正在尝试在3D空间中旋转四边形。以下代码显示用于绘制四边形的顶点着色器:

#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);

我也在顶点着色器中设置了均匀性。
为什么它不会旋转和缩放,甚至在我transform(projection*view*model*vec4(aPos,1.0f))相乘时出现?
编辑:我发现问题在于缩放,因为代码仅适用于旋转。该代码仅适用于扩展。

2 个答案:

答案 0 :(得分:1)

让我们只考虑2D。

四边形在“世界”坐标中定义。要旋转它围绕某个点将四边形移动到该点,然后旋转并缩放它然后将其移回。

使用矩阵执行此操作与transform * model相同,其中transform类似

transform = moveback * scale * rotate * movetopoint

答案 1 :(得分:0)

如果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。