Recientemente, intenté dar sentido a la implementación de un sistema de nivel de detalle fragmentado en Unity. Voy a generar cuatro planos de malla, cada uno con un mapa de altura, pero supongo que eso no es demasiado importante en este momento. Tengo muchas preguntas después de leer sobre esta técnica, espero que esto no sea mucho pedir de una vez, pero estaría extremadamente agradecido de que alguien me ayude a dar sentido a esta técnica.
1 : No puedo entender en qué punto de la tubería Chunked LOD la malla se divide en trozos. ¿Es esto durante la generación de malla inicial, o hay un algoritmo separado que hace esto?
2 : Entiendo que se usa una estructura de datos Quadtree para almacenar los datos LOD Chunked , creo que me falta un poco el punto, pero ¿está el quadtree almacenando datos de vértices y triángulos para cada nivel de subdivisión?
3a : ¿Cómo se calcula generalmente la distancia de la cámara? Al leer sobre quadtree, se mencionan mucho los cuadros delimitadores alineados con el eje. En este caso, ¿cada fragmento tendría un cuadro de límite de colisión para detectar que la cámara o el reproductor están cerca? o hay una mejor manera de hacer esto? (Raycast tal vez?)
3b : ¿Los trozos calculan la distancia de la cámara ellos mismos?
4 : ¿Cada fragmento tiene la misma "resolución". por ejemplo, en el nivel superior, la malla será 32x32, cada nodo subdividido también será 32x32. Ejemplo a continuación:
fuente
Respuestas:
1: No puedo entender en qué punto de la tubería Chunked LOD la malla se divide en trozos. ¿Es esto durante la generación de malla inicial, o hay un algoritmo separado que hace esto?
No importa. Por ejemplo, puede integrar la fragmentación en su algoritmo de generación de mallas. Incluso puede hacer esto dinámicamente, de modo que los niveles más bajos se agreguen dinámicamente (por ejemplo, a medida que el jugador se acerca) utilizando un algoritmo de refinamiento similar al plasma. También puede generar una malla de alta resolución a partir de la entrada del artista o los datos de medición de elevación y agregarlos a todos los fragmentos de LOD en el momento de finalización del activo. O puedes mezclar y combinar. Realmente depende de su aplicación.
2: Entiendo que se usa una estructura de datos Quadtree para almacenar los datos LOD Chunked, creo que me falta un poco el punto, pero ¿está el quadtree almacenando datos de vértices y triángulos para cada nivel de subdivisión?
No necesariamente. El árbol solo almacena información sobre la geometría y cómo representarla. Esto podría significar tener una lista de vértices / caras en cada nodo del árbol. Más realista en este día y época, almacenaría los identificadores de las mallas / instancias en la memoria de la GPU.
3a: ¿Cómo se calcula generalmente la distancia de la cámara? Al leer sobre quadtree, se mencionan mucho los cuadros delimitadores alineados con el eje. En este caso, ¿cada fragmento tendría un cuadro de límite de colisión para detectar que la cámara o el reproductor están cerca? o hay una mejor manera de hacer esto? (Raycast tal vez?)
Una opción muy barata y fácil es usar la distancia al punto central del trozo y luego corregirlo. Sabes que esta distancia siempre es una subestimación: si el punto central está a distancia
Z
, esto significa que la mitad del trozo está más cerca que eso. Sin embargo, lo que no sabemos es la orientación. Si estamos viendo un trozo de ancho dew
borde, el bit más cercano del trozo estará a distanciaZ-w
. Sin embargo, si estamos viendo el fragmento en la esquina primero, el bit más cercano estará a distanciaZ-sqrt(2)*w
. Si puede vivir con esta incertidumbre (casi siempre puede hacerlo), ya está. Tenga en cuenta que también puede corregir el ángulo de visión utilizando la trigonometría básica.Prefiero calcular la distancia mínima absoluta de la cámara al fragmento para minimizar los artefactos. En la práctica, esto significa hacer una prueba de distancia punto-cuadrado . Es un poco más trabajo que calcular distancias a los puntos centrales, pero no es como si hicieras un trillón de estos en cada cuadro.
Si puede aprovechar su motor de física para hacerlo, entonces hágalo, pero realmente desea pensarlo más en términos de "consulta de distancia" que de "colisión".
3b: ¿Los trozos calculan la distancia de la cámara ellos mismos?
Realmente depende del diseño de su motor. Sin embargo, recomendaría mantener las hojas relativamente livianas. Dependiendo de su plataforma, solo la sobrecarga de llamadas de tener unos pocos miles de fragmentos de terreno realizar su propia actualización cada fotograma puede afectar seriamente el rendimiento.
4: ¿Cada fragmento tiene la misma "resolución". Por ejemplo, en el nivel superior, la malla será 32x32, cada nodo subdividido también será 32x32.
No tienen que hacerlo, pero es conveniente si todos los fragmentos ocupan la misma cantidad de espacio. Luego puede hacer su gestión de memoria (GPU) en unidades de "fragmentos". También es más fácil quitar / ocultar las costuras entre dos trozos de diferentes tamaños si una resolución es múltiplo de la otra porque comparten más vértices. (por ejemplo: 32x32 y 64x64 es más fácil de administrar que 32x32 y 57x57) (¡gracias Guiber!). Si tiene una buena razón para variar el tamaño de la geometría del fragmento, hágalo.
fuente