Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Diferencias Entre Modelo3d Y Objeto3d

Iniciado por josette, 19 de Abril de 2006, 09:49:19 AM

« anterior - próximo »

josette

 Hola todos,

  He encontrado este link: http://tomaskovic.com/download/super_engin...ecification.doc

en donde se explica una determinada manera de hacer un pequeño motor/aplicación badasa en windows y opengl.

  En los esquemas hay clases como 'Object3D', 'Object3DModel' y 'ModelObject3D'. Mi duda es anivel de concepto. ¿Alguien me puede explicar cuales son los conceptos que estan representando estas clases? ¿Que conceptos son los que hay que tener en cuenta a la hora de programar el motor 3D?

   Saludos.

senior wapo

 No te compliques la vida con los detalles de una implementación concreta. Te doy una explicación supersimplificada, no intento ser académicamente preciso sino ser sencillo y accesible.

En general, tendrás lo que se llama nodos del grafo de escena y mallas.

El "grafo de escena" es la lista de cosas que hay en el mundo para dibujarlas. Organizadas según te convenga, no tiene porqué ser con una lista.

Los nodos del grafo son cada uno de los elementos que hay en esa lista ,las cosas que hay visibles en el mundo: Una casa, una persona, un libro, un area del mapa con su propio sistema de render, etc...  

A las cosas se les suele llamar entidades, tanto si están en el mundo como si no. Todas las cosas que son nodos suelen ser entidades. Pero no todas las entidades son nodos (no todas forman parte del grafo de escena porque no todas representan algo visual). Ejemplo: un generador de enemigos cada 5 segundos: tiene una posición en el espacio pero no es visible ni se procesa por el grafo de escena. Sigue siendo una entidad.

Mucha gente considera entidad a todo lo que tiene una posición en el espacio, pero no preguntes o te responderán mil cosas distintas :) Solo es un término para entendernos, no representa nada concreto.

Las mallas o modelos, son la representación visual de las cosas que hay en el mundo. Distintas entidades comparten el mismo aspecto (malla/modelo) con lo cual si tienes 8 soldados de élite idénticos, solo tienes 1 modelo 3D (malla) pero tienes 8 objetos 3D(entidades) en tu grafo de escena (que usan el mismo modelo).

josette

 Gracias 'senior wapo' me ha quedado todo muy claro (eso creo).

Entonces por ejemplo una luz, una camara son entidades pero no son nodos del grafo.

Y si varias entidades comparten un modelo/malla y una malla es una matriz/array de puntos, si varias entidades comparten esa malla cuando una entidad sufre una transformacion se almacena una matriz de transformaciones? No creo que sea así. Cuando te refieres al modelo te referirás a que cad modelo  tiene una serie de keyframes en donde cada keyframe es una malla de puntos, de forma que cuando varias entidades comparten un midmo modelo segun el indice del keyframe de cada entidad en ese momento  se dibuja ese keyframe en la posicion de la entidad, que es distinta para cada una de las entidades.
¿Es así?

Y si por ejemplo es en opengl, a la hora de dibujar una entidad
1- transladar la malla de keyframe a la posicion de la entidad, 'rotarla' y escalarla. (rotar-> trasladar al origen,rotar y devolver a la posicion original)
2- dibujar los puntos de la malla del keyframe.
3- deshacer la transformacion

¿Es correcto?

Y si tengo una escena grande, como puedo saber que nodos estan dentro del area visible de la camara y cuales no?

senior wapo

 Los datos de las mallas nunca los modificas, lo que haces es asignar la matriz de transformación que la tarjeta usará para dibujar y luego desahacerla. Supongo que te referías a eso pero no hace daño decirlo.

Algunos motores meten las cámaras y luces en los nodos del grafo para que todo se maneje igual a la hora de trabajar. Pero no, no es necesario. Lo que ocurre es que las cámaras y luces pueden no estar sueltas sino formar parte de una entidad en movimiento (faros de un coche y cámaras subjetivas de los conductores del circuito) y en ese caso pues puede que el motor las maneje como nodos de la escena en lugar de por separado.

Para saber que nodos estan visibles en el área de visión de la cámara debes realizar "frustum culling" que es el nombre que le damos al proceso de comprobar si hay intersección entre el espacio ocupado por una entidad y el área de visión de la cámara. La forma más eficiente requiere una multiplicación de vector (6 multiplicaciones de numeros y 3 sumas) por cada plano que define el área visible.

Bájate los fuentes del quake y busca la función boxOnPlaneSide para ver como comprobar a que lado de un plano se encuentra una caja. La idea es que según la orientación del plano, puedes saber que 2 esquinas de la caja son las más cercana y lejana usando la diagonal más alineada con la normal del plano. Compruebas la distancia de esos 2 puntos al plano y ya sabes como intersecta. Si sólo compruebas el más cercano, sabrás que hay colisión. Si compruebas ambos, además sabrás si la caja está entera dentro del plano o solo parcialmente. Intenta visualizarlo y lo entenderás.

El área de visión de la camara son los planos que pasan por los bordes de la pantalla y por el centro de la posición de la cámara. A eso le añades dos planos paralelos a la pantalla, uno muy cerca o otro muy lejos. Total 6 planos para definir un frustum (una caja deformada). El frustum se puede extraer de la matriz modelview sin necesidad de hacer esos cálculos, busca en google.

josette

 Gracias senior wapo, voy a meditarlo todo y a implementarlo a ver si ya puedo mostrar cosas para que las puedas ver.

     Saludos.






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.