Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Duda Sobre Camaras Y Matrices

Iniciado por tamat, 28 de Enero de 2004, 12:37:24 AM

« anterior - próximo »

tamat

 Estoy intentando hacer un pequeño framework para testear algunas de mis ideas sin embargo acabo de topar con un problema que me está llevando más tiempo del que esperaba, como es algo largo de explicar lo separaré  un poco:

1.- Cada elemento de mi mundo hereda de WorldObject.

Un WorldObject tiene un vector posicion y un cuaternión rotación, gracias a estos dos valores cualquier objeto del entorno puede ser renderizado en su posición correcta.
Para ello hay un metodo renderSituation() que hace lo siguiente:

glMatrixMode( GL_MODELVIEW );
glLoadIdentity();
glTranslatef( Position().x, Position().y, Position().z);
Rotation().multMatrix();


Pero esto me plantea un dilema, si tengo objetos adheridos a uno (como por ejemplo una jerarquia de elementos) entonces este sistema no es el más adecuado, qué proponeis? qué suelen ahcer los engines?

2.- Las camaras

He hecho que las camaras hereden de WorldObject ya que tienen una posición y un angulo, sin embargo tengo una duda:

Si una camara solo modifica la modelview (supongamos que usa mismo projective ya que tiene mismo far, fov, aspect, etc) entonces al renderizar la camara solo se modifica la modelview, pero si luego renderizo un objeto qué tambien hereda de world object entonces la modelview no se tiene en cuenta porque se machaca, resumiendo, las camaras no sirven de nada, qué hago mal?
Debería renderizar los objetos sin machacar la modelview?


En fin, gracias por la ayuda y si teneis algun link que explique bien toda la problematica asociada a las matrices modelview y projection pues os lo agradecería.
Por un stratos menos tenso

CoLSoN2

 no sé cómo funciona OpenGL pero en DX tienes 3 matrices: proyeccion, world y view. La view es la que maneja la cámara y la de world para posicionar objetos. ¿En ogl están las dos juntas?
CitarPero esto me plantea un dilema, si tengo objetos adheridos a uno (como por ejemplo una jerarquia de elementos) entonces este sistema no es el más adecuado, qué proponeis? qué suelen ahcer los engines?
No sé si te he entendido pero suelen tener un graph de nodos adheridos unos a otros, y al final todos a un nodo root (0,0,0 inamovible). Entonces al renderizar cada nodo haces:

pos = m_vPos + m_pParent->getPos();

y el parent hace lo propio, y lo mismo con las rotaciones.  
Manuel F. Lara
Descargar juegos indie  - blog sobre juegos indie y casual
El Desarrollo Personal.com  - blog sobre productividad, motivación y espíritu emprendedor

tamat

Cita de: "CoLSoN2"no sé cómo funciona OpenGL pero en DX tienes 3 matrices: proyeccion, world y view. La view es la que maneja la cámara y la de world para posicionar objetos. ¿En ogl están las dos juntas?
Nop, hay tres, la modelview, la projection y la viewport, solo que las camaras de mi escena en teoria solo deben afectar a la modelview ya que la projection solo define el frustum y yo lo dejo fijo para todas las camaras.

Lo que comentas de renderizado jerarquico creo que es exactamente lo que busco, siendo el parent final la camara de la escena, así que creo que con eso me bastará, gracias :)
Por un stratos menos tenso

CoLSoN2

 si buscas cómo implementar un graph mirate el SceneManager, SceneNode y demás de Ogre.
Si hay 3 entonces no veo el problema. La cámara tiene posicion y rotacion, pero no modifica ninguna matriz modelview, solo la viewport. Y la projeccion en principio no hay que tocarla una vez inicializada.
Manuel F. Lara
Descargar juegos indie  - blog sobre juegos indie y casual
El Desarrollo Personal.com  - blog sobre productividad, motivación y espíritu emprendedor

tamat

 Weno, cuando hablo de camaras no me refiero a distintos viewports, más bien a que el usuario posiciona varias camaras en la escena y puede 'switchear' entre cada una segun le convenga, además una vez tenga eso añadir la opción de renderizar varias camaras a la vez será un momento.

En OGL cualquier operación de rotación o translación altera la matriz de modelview, esta matriz es la que multiplica cada vertice al principio de la pipe para obtener su coordenada real en la escena. Cuando tu situas una camara con funciones como glLookAt ,que te permite indicar donde está la camara y hacia donde mira, lo que hace simplemente es aplicar a la modelview una traslación y una rotación inversa de manera que la escena quede tal cual si la mirases desde el punto dado, es decir, si la camara la ponemos en (0,0,20) lo que hace es desplazar todos los puntos que pintemos despues en (0,0,-20).

De ahí mi problema, si renderizo la camara y despues vacio la modelview para posicionar el objeto entonces estoy perdiendo la camara, lo obvio sería que al renderizar la posición de mi objeto lo haga acumulando las operaciones sobre la modelview, y eso con lo que me has comentado de usar una jerarquía lo puedo hacer, así que gracias :)

Por cierto, el termino técnico es 'graph' ?
Por un stratos menos tenso

CoLSoN2

 sip, scene graph en este caso, pero es una estructuras de datos como otra cualquiera
Manuel F. Lara
Descargar juegos indie  - blog sobre juegos indie y casual
El Desarrollo Personal.com  - blog sobre productividad, motivación y espíritu emprendedor

BeRSeRKeR

 
Cita de: "tamat"En OGL cualquier operación de rotación o translación altera la matriz de modelview (...)

De ahí mi problema, si renderizo la camara y despues vacio la modelview para posicionar el objeto entonces estoy perdiendo la camara, lo obvio sería que al renderizar la posición de mi objeto lo haga acumulando las operaciones sobre la modelview, y eso con lo que me has comentado de usar una jerarquía lo puedo hacer, así que gracias :)
En Direct3D el equivalente a la matriz modelview de OpenGL son las matrices world (para transformar la geometría) y view (para la cámara). De forma que son independientes. Si modificas una, no afectas a la otra.

Cita de: "tamat"Por cierto, el termino técnico es 'graph' ?
Sí, creo que el término en castellano es grafo.
¡Si te buscan en nombre de la ley, huye en nombre de la libertad!!






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.