Jump to content

Rotação dum objeto


Go to solution Solved by thoga31,

Recommended Posts

Fernando Couto

Olá, 

Estou com o seguinte problema: num programa do Visual Studio em que uso c++,  tenho algumas figuras que constituem uma casa como o telhado, a porta, a janela. Sendo que faço cada um deste elementos deslocar-se para um sítio, como está no código seguinte (aqui está o exemplo da porta, o da janela terá uma deslocação para um sítio diferente, já o telhado e as paredes ficam no mesmo sítio) que funciona bem: 

glm::mat4 mvp = glm::ortho(-40.0f, 40.0f, -40.0f, 40.0f);

unsigned int matrix = glGetUniformLocation(programID, "mvp");
glUniformMatrix4fv(matrix, 1, GL_FALSE, &mvp[0][0]);

glm::mat4 trans;
trans = glm::translate(glm::mat4(1.0), glm::vec3(delta, delta, 0.0f)); //direção da deslocação (se puser -delta vai na direção contrária
unsigned int m = glGetUniformLocation(programID, "trans");
glUniformMatrix4fv(m, 1, GL_FALSE, &trans[0][0]);

Acontece que gostava que cada elemento que se desloca também rodasse sobre si próprio, ou seja fizesse uma rotação, o código que pus a seguir ao de cima não está a ter efeito, e não estou a conseguir resolver o assunto:

glm:mat4 rot = glm::mat4(1.0f);
rot = glm::rotate(rot, glm::radians(0.0f), glm::vec3(0.0f, 0.0f, 1.0f));

GLint r = glGetUniformLocation(programID, "rot");
glUniformMatrix4fv(r, 1, GL_FALSE, &rot[0][0]);

Será que me podiam ajudar?

Link to post
Share on other sites
thoga31

Na rotação indicaste que o objeto deve ser rodado 0 rad no eixo z, ou seja, não vai rodar.
Pretendes que o objeto rode ao longo do tempo ou que a rotação seja estática (one time only)?

Por fim, tens a variável rot declarada no vertex shader?

Cumprimentos.

Knowledge is free!

Link to post
Share on other sites
Fernando Couto
22 horas atrás, thoga31 disse:

Na rotação indicaste que o objeto deve ser rodado 0 rad no eixo z, ou seja, não vai rodar.
Pretendes que o objeto rode ao longo do tempo ou que a rotação seja estática (one time only)?

Por fim, tens a variável rot declarada no vertex shader?

Cumprimentos.

Olá! Muito obrigado pela tua resposta!

Pois realmente indiquei 0 radianos não sei porquê...mas mudei isso e ainda não consegui resolver o problema.

Pretendo que o objeto rode ao longo do tempo.

O meu vertex shader não tem declarações nem da variável rot nem da variável trans...não sei se foi isto que te referias, vou copiá-lo para aqui:

#version 330 core

// Input vertex data and color data 
layout(location = 0) in vec3 vertexPosition;
layout(location = 1) in vec3 vertexColor;

// Values that stay constant for the whole mesh.
uniform mat4 mvp;
uniform mat4 trans;

// Output fragment data 
out vec3 fragmentColor;

void main()
{
	// position of each vertex in homogeneous coordinates
	//gl_PointSize = 10.0;
    //gl_Position.xyz = vertexPosition;
    //gl_Position.w = 1.0;
	gl_Position = mvp * trans * vec4(vertexPosition, 1.0);
	
	// the vertex shader just passes the color to fragment shader
	fragmentColor = vertexColor;

}

 

Link to post
Share on other sites
  • Solution
thoga31

Para a rotação decorrer, tens de ter a variável declarada no vertex shader e usá-la na multiplicação que calcula o gl_Position. A posição de cada ponto é calculada através da multiplicação de matrizes, sendo a de rotação uma delas.

uniform mat4 rot;

// Na main:
gl_Position = mvp * trans * rot * vec4(vertexPosition, 1.0);

Tem em atenção que a multiplicação NÃO é comutativa uma vez que são matrizes.
Portanto, primeiro tens de rodar o objecto (rot), depois fazes a translação (trans), e por fim aplicas o Model-View-Projection (mvp).
Para a ordem ser esta, tens de multiplicar da direita para a esquerda, daí a multiplicação ser mvp * trans * rot e não rot * trans * mvp.

De resto, assim por alto, creio que a rotação deva decorrer sem problemas uma vez que no código do programa estás a injectar o valor de rot (apenas não tinhas a variável declarada nem em uso no shader).

Cumprimentos.

  • Vote 2

Knowledge is free!

Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.