es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Transformando las normales de OpenGL

Soy nuevo en OpenGL, estoy usando la versión 4.6.0.
Tengo un modelo compuesto por diferentes figuras.
Cuando se aplica iluminación, las normales se desconfiguran.
He intentado leer la documentación y, en teoría, todo lo que tengo que hacer es multiplicar por el inverso de la transpuesta y luego redimensionar las normales.
En este foro:

http://www.songho.ca/opengl/gl_normaltransform.html
recomiendan tener dos modelos de vista, uno para las transformaciones del modelo y otro para almacenar solo las rotaciones de las normales.

El problema es que no sé cómo definir un segundo modelo de vista o cualquier tipo de matriz, ni cómo transponer glModelView.

Gracias.

Tags:  ,

Answer

  1. Avatar for davy.ai

    ¡Hola!

    Si eres nuevo en OpenGL, puede que te tome un tiempo acostumbrarte a todos los conceptos y funciones diferentes. Sin embargo, no te preocupes, todo es cuestión de práctica y experiencia.

    Para abordar tu problema específico, parece que estás teniendo dificultades para definir un segundo modelview o matriz, y cómo transponer el glModelView. Aquí tienes algunos pasos que pueden ser útiles:

    1. En OpenGL, puedes definir múltiples matrices para manejar transformaciones, incluyendo una matriz de modelo y vista, una matriz de proyección y más. Para definir una segunda matriz de modelo y vista, simplemente puedes crear una nueva variable de matriz y usarla según sea necesario. Por ejemplo:
    glm::mat4 modelview1 = glm::mat4(1.0f); // matriz identidad
    glm::mat4 modelview2 = glm::mat4(1.0f); // otra matriz identidad
    
    // Aplica transformaciones a la matriz de modelo y vista 1
    modelview1 = glm::translate(modelview1, glm::vec3(0.0f, 0.0f, -5.0f));
    modelview1 = glm::rotate(modelview1, glm::radians(45.0f), glm::vec3(1.0f, 0.0f, 0.0f));
    
    // Aplica rotaciones a la matriz de modelo y vista 2, pero sin traslaciones
    modelview2 = glm::rotate(modelview2, glm::radians(45.0f), glm::vec3(1.0f, 0.0f, 0.0f));
    
    1. Para transponer una matriz, puedes usar la función glm::transpose. Por ejemplo:
    glm::mat4 miMatriz = glm::mat4(1.0f); // alguna matriz
    
    // Transpone miMatriz
    glm::mat4 matrizTranspuesta = glm::transpose(miMatriz);
    
    1. En cuanto a tu problema específico con las normales, parece que puede que necesites ajustar la matriz de normales además de la matriz de modelo y vista. Puedes calcular la matriz de normales tomando la inversa transpuesta de la matriz de modelo y vista (como mencionaste), y luego pasar esa matriz a tu programa de sombreado. Aquí tienes un ejemplo:
    glm::mat4 modeloVista = glm::mat4(1.0f); // alguna matriz de modelo y vista
    
    // Calcula la matriz de normales
    glm::mat4 matrizNormal = glm::transpose(glm::inverse(modeloVista));
    
    // Pasa ambas matrices a tu programa de sombreado
    glUniformMatrix4fv(glGetUniformLocation(programaShader, "modeloVista"), 1, GL_FALSE, glm::value_ptr(modeloVista));
    glUniformMatrix4fv(glGetUniformLocation(programaShader, "normal"), 1, GL_FALSE, glm::value_ptr(matrizNormal));
    

    ¡Espero que eso te ayude! No dudes en preguntar si tienes más preguntas. ¡Buena suerte!

Comments are closed.