Fernando Couto Posted February 4, 2021 at 12:34 PM Report #621184 Posted February 4, 2021 at 12:34 PM 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?
thoga31 Posted February 4, 2021 at 10:32 PM Report #621192 Posted February 4, 2021 at 10:32 PM 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!
Fernando Couto Posted February 5, 2021 at 08:46 PM Author Report #621221 Posted February 5, 2021 at 08:46 PM 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; }
Solution thoga31 Posted February 5, 2021 at 09:38 PM Solution Report #621222 Posted February 5, 2021 at 09:38 PM 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. 2 Report Knowledge is free!
Fernando Couto Posted February 6, 2021 at 01:00 AM Author Report #621227 Posted February 6, 2021 at 01:00 AM Muito mas muito obrigado!!! Agora tenho outra última dúvida, vou agora escrever o tópico....
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now