[Práctico 3] Ejercicio 1

[Práctico 3] Ejercicio 1

de Rodrigo Luis Ferreri Martin -
Número de respuestas: 6

Buenas a todos, tengo una consulta sobre las displayLists.

En este ejercicio si veo el .exe puedo ver un montón de árboles, así como moverme por el mundo. Si leo la letra del ejercicio, la idea es modelar estos objetos usando displayLists.

Ahora, investigando parece ser que las displayLists brindan un mecanismo para compilar un montón de primitivas (incluyendo transformaciones) y guardarlas adentro de OpenGL para después ejecutarlas cuando yo quiera (usando glCallList).

Mi duda es, dado que según lo que pude investigar el código de las displayLists es estático, y sabiendo que yo modelo cada árbol con una de ellas, ¿cómo puede ser posible lograr que giren los triangulos que los conforman en forma relativa entre ellos si están en la misma displayList?

De momento puedo lograr 1) girar toda la displayList, o 2) hacer que las mismas sean simplemente cada triangulo por separado y girarlos. Pero el tema es ese, según la letra se da a entender que por cada árbol hay una displayList.

¿Puede alguien ayudarme y explicarme si hay algo que no yo sepa o si en realidad sí se modela un triángulo = una display list?

¡Muchas gracias de antemano!

En respuesta a Rodrigo Luis Ferreri Martin

Re: [Práctico 3] Ejercicio 1

de Rodrigo Luis Ferreri Martin -

Ta, al final pude! Es seguir al pie de la letra las instrucciones sobre cómo renderizar la imagen que están en la letra del ejercicio.

Si alguien tiene la misma duda que yo que pregunte y yo le explico cómo hice!

Saludos!

En respuesta a Rodrigo Luis Ferreri Martin

Re: [Práctico 3] Ejercicio 1

de Santiago Bartesaghi Monza -

Hola estoy teniendo el mismo problema. Por mas que intente rotar la figura al compilar, esta no se mueve. Al menos de que la displayList sea 1 solo triangulo, no logro el movimiento individual de los triangulos. Por las dudas dejo un pseudocodigo para ver si estoy haciendo bien.

main{

Inicializar todo

glGenList

glNewList

...

glEndList

loop

     Manejar Eventos

     dibujar (incluye glCallList)

end loop

glDeleteList

}

En respuesta a Santiago Bartesaghi Monza

Re: [Práctico 3] Ejercicio 1

de Ignacio Avas -

Una forma de lograr rotaciones independientes es meter en la matriz de transformación las rotaciones de los ángulos para cada triángulo usando glPushMatrix:

for(i = 1..nTriangulos-1):
   glRotate(30, 0, 1, 0);
   glPushMatrix();
glCallList(triangleList);

Después del loop la matriz de GL_MODELVIEW va a tener un stack con una rotación por cada triángulo (excepto el de abajo que no se rota). En la displayList que definís antes se usa la matriz de transformación con las rotaciones que se guardan antes de invocar a la playlist. Se sacan usando glPopMatrix y luego se pinta el triángulo. Notá que el triángulo de más abajo no se rota, por lo tanto necesitás guardar una transformación para ese triángulo en sí.

for(i = 1..nTriangulos):
   if(i != nTriangulos):
       glPopMatrix();
   glBegin();
   ...
   glEnd();
   glTranslate(0, -1, 0);

Hay que tener en cuenta que se tiene que arrancar a pintar los triángulos de arriba hacia abajo para usar la matriz de transformación correctamente.

El método en sí me parece un poco oscuro pero funciona. Es bastante propenso a errores porque depende que se pusheen el número correcto de transformaciones en la displayList. De lo contrario podés tener un stack overflow o underflow.

En respuesta a Ignacio Avas

Re: [Práctico 3] Ejercicio 1

de Santiago Bartesaghi Monza -

osea, me estas diciendo que la displaylist es 1 triangulo y no los 7 que estan 1 arriba del otro en el .exe que nos dieron?

mi problema no es la rotacion de toda una displaylist o de una figura, lo que no puedo hacer es rotar algunas partes de la displaylist y otras no. no se si me explico..

En respuesta a Santiago Bartesaghi Monza

Re: [Práctico 3] Ejercicio 1

de Ignacio Avas -

La displayList tiene los 7 triángulos del árbol. Cada uno se pinta teniendo en cuenta las rotaciones que se pasan en la matriz de transformación. Capaz con código queda más claro

class TriangleTree { // para representar un árbol de 7 triángulos
public:
    const Vector3 position; // donde va el árbol en la escena
    const Vector3 color; // el color del árbol

    TriangleTree(Vector3 position, Vector3 color):
        position(position),
        color(color)
    {
    }
};

Al iniciar el programa creás la displayList del árbol de 7 triángulos que sería un código más o menos así:

treeList = glGenLists (3);
glNewList (treeList, GL_COMPILE);
for(int i = treeHeight-1; i >= 0; --i)
{
   glTranslatef(0, (GLfloat)i, 0);
   glBegin (GL_TRIANGLES);
    glVertex2f (-0.5, -0.5);
    glVertex2f ( 0.5, -0.5);
   glVertex2f (0.0, 0.5);
 glEnd ();
   if(i != 0)
     glPopMatrix(); // para ir a la otra rotación que se TIENE que pasar al invocar la lista
}
glEndList ();

Notá que se hacen 6 glPopMatrix(). Para llamar a la displayList debes hacer 6 pushMatrix() o si no el loop de rendering
se va a romper por stack underflow.

Al renderizar se hacen 6 glPushMatrix() con las rotaciones. La variable angle representa la rotacion de los árboles. Eso va cambiando con el tiempo para ver que los árboles giren. Como glPushMatrix guarda la matriz de transformación entonces podés "pasar parámetros" a la displayList.

for (int i = 1; i < nTrees; i++) {  
glPushMatrix();
   TriangleTree &tree = trees.at(i);
    glTranslate(tree.position);
glRotate(-angle * treeHeight, Vector3::up);
    for(int j = 0; j < treeHeight-1; ++j){
         glPushMatrix(); // se corresponde con el glPopMatrix() de la displayList
         glRotate(angle * treeHeight, Vector3::up);
   }
  glColor(tree.color);
    glCallList (treeList);
glPopMatrix();
}

Espero se haya entendido un poco mejor!