En concreto en Ogre tiene, estoy viendo ahora mismo la Api de Ogre, vamos a ver, tiene una clase scenemanager y dos clases que heredan de ella bspscenemanager y octrescenemanager, bien pongamos que me decanto x Octre (los BSP han quedado un poco obsoletos ¿no?
Los BSP aún tiene sus usos, aunque para visibilidad yo creo que sí que están obsoletos. Pero, por ejemplo, acabo de terminar el núcleo del sistema de particionamiento espacial de nuestro motor. Está basado en portales/sectores para los interiores (para los exteriores me imagino que nos decantaremos por un Octre con algún sistema de oclusión) y una de las cosas que he hecho es crear un árbol BSP del nivel. Con ese árbol BSP se puede saber en qué sector esta la cámara, se pueden recortar volúmenes de sombra o, por ejemplo, también se pueden recortar los decals. Los decals son los típicos polígonos que se utilizan para trabajo cosas en las paredes. Por ejemplo, la mancha que deja un misil al impactar con la pared. Imagina que ese polígono sobresale por una esquina del mapa. Está claro que hay que recortarlo para quitar la parte que queda flotando. Pues eso, un BSP está bien para esas cosas. Para operación CSG son una maravilla.
En cualquier caso, para los exteriores los árboles BSP+pvs o los portales, no suelen ser una buena solución. Lo mejor es un Octre, sí.
/*--------- Nodos -*/.
Posiblemente ni hayas utilizado Ogre, pero supongo que, será genérico en cualquier motor.
Un octrenode, bien es un clase, pero como viene definida? Y Octre otra clase, pero me pasa lo mismo, mi problema creo que están en los nodos. Los nodos donde los creo, cuando exporto la escena con el 3ds Max? Entonces necesito crearme mi propio exportador ¿no? O tendría que trabajar el cargar el mapa y dinámicamente crear nodos que solo existen en tiempo de ejecución.
Pues no, no he utilizado el Ogre, pero efectivamente un Octre es un Octre en todas partes y las bases deben ser las mismas. Los nodos del Octre los puedes crear donde quieras. O bien te creas tu propio exporter y al exportar la escena generas el Octre y lo escribes en un archivo, o bien te creas una aplicación aparte que cargue la geometría contenida en un 3ds/obj/ase/etc y de ahí generas el Octre y los guardas en disco o bien generas el Octre cada vez que inicies el mapa. Evidentemente, lo mejor para reducir tiempos de carga es guardar el Octre en disco.
Es que, aun no tengo muy claro el término nodo. A ver hago este ejemplo: .
A ver, cada círculo seria un nodo ¿no? Y puedo definir seguir ampliando la profundidad hasta que yo quiera, ¿no? Cada nodo que propiedades tendría? Un identificador único supongo, y quien es su padre ¿no?
Y cuando llegamos a los nodos últimos almacenarian los polígonos de la escena, si? Uy como sea así, creo que me estoy respondiendo a mí mismo.
Ante todo he de decir que nunca he implementado un Octre (ya me llegara la hora) por lo que todo lo que te digo es de cosas que he ido leyendo a lo largo del tiempo.
Un nodo de un Octre contiene básicamente un puntero al nodo padre y un puntero a los hijos (que serán 8 hijos ya que el Octre se subdivide en 8 partes cada vez). Los nodos terminales (hojas), además, contienen polígonos.
Como explicar esto en 3d es algo complicado, lo explico en la versión 2d del Octre que es el quadtre. Mientras un Octre subdivide cada vez en 8 cubos, un quadtre subdivide cada vez en 4 rectángulos iguales.
Así que imagina que tenemos la siguiente escena:
Lo primero que hay que hacer es calcular el rectángulo que contiene todos los triángulos. Algo como esto:
Eso es el nodo raíz y a partir de ahí iremos subdividiendo hasta que se cumplan ciertas premisas. Normalmente, la subdivisión de un nodo se detiene cuando en su interior hay un número mínimo de polígonos. O también cuando el rectángulo tiene unas dimensiones mínimas.
Así que el siguiente paso es subdividir en 4 rectángulos iguales el nodo raíz. Recuerda que estamos hablando de un quadtre. En un Octre sería 8 cubos. La subdividir por primera vez tenemos esto:
Como todos los nodos tienen más polígonos que el número mínimo que especifiquemos, volvemos a subdividir cada nodo en otros 4 rectángulos de iguales dimensiones:
Ahora vemos que hay algunos nodos que tienen muy pocos polígonos en su interior, por lo que esos nodos no serán subdivididos. Ese nodo se denomina hoja y es la que contiene polígonos. Tras una nueva subdivisión, éste sería el resultado:
Como puedes ver, los nodos 1.4, 2.3, 2.4, 3.4 y 4.1 han dejado de subdividirse. El resto se ha vuelto a subdividir. En esa misma imagen puedes ver la estructura en árbol del nodo 1. No he puesto el resto porque era una locura.
Evidentemente, muchos de esos nodos volverán a subdividirse, mientras que otros contendran el número mínimo de polígonos y se detendran.
Hay una cosa a tener en cuenta y es el eterno dilema de si particionar los polígonos o no. Como es de esperar, habrán nodos que contendran parcialmente determinados polígonos. Hay dos opciones. O se parten dichos polígonos en dos y se manda cada mitad a su nodo correspondiente o bien el polígono completo se deja en ambos nodos. Evidentemente, a la hora de renderizar, hay que evitar renderizar dicho polígono dos veces. Para ello, a tu estructura de polígonos le puedes meter una propiedad frame. Entonces cuando vayas recorriendo el Octre para renderizar, para cada polígono, compruebas si la propiedad frame es igual al frame actual. Si no lo es, le asignas el frame actual a la propiedad frame y mandas el polígono a renderizar. De lo contrario, si el número de frame es igual, significa que ese polígono ya se ha mandado a renderizar, por lo que no hay que mandarlo otra vez.
Sobre si es conveniente o no partir los polígonos, yo prefiero no dividirlos ya que de lo contrario puedes acabar con un montón de splits y el número de polígonos de la escena pueden llegar a multiplicarse. Saludos.
-- IMÁGENES ADJUNTAS --
🖼️
Estamos trabajando para mostrar las imágenes del foro
Adjunto #27247
🖼️
Estamos trabajando para mostrar las imágenes del foro
Adjunto #27248
🖼️
Estamos trabajando para mostrar las imágenes del foro
Adjunto #27249
🖼️
Estamos trabajando para mostrar las imágenes del foro
Adjunto #27250
🖼️
Estamos trabajando para mostrar las imágenes del foro
Adjunto #27251