OpenGL - применить преобразование к многоугольнику в трехмерном пространстве - PullRequest
0 голосов
/ 09 мая 2018

Я пытаюсь повернуть квад в трехмерном пространстве.Следующий код показывает вершинный шейдер, используемый для рисования квадрата:

#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 голосов
/ 09 мая 2018

Если 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.

0 голосов
/ 09 мая 2018

Давайте думать только в 2D.

Квадрат определен в «мировых» координатах. Чтобы повернуть вокруг некоторой точки , переместите квад в эту точку, затем поверните и масштабируйте его, а затем верните назад.

Выполнение этого с матрицами аналогично transform * model, где transform - это что-то вроде

transform = moveback * scale * rotate * movetopoint
...