Niedawno staram się wprowadzić sensowny system szczegółowości w Unity. Będę generować cztery płaszczyzny siatki, każda z mapą wysokości, ale chyba nie jest to w tej chwili zbyt ważne. Mam dużo pytań po przeczytaniu na temat tej techniki, mam nadzieję, że nie jest to zbyt wiele, aby zadać wszystko za jednym razem, ale byłbym bardzo wdzięczny za to, że ktoś pomógłby mi zrozumieć tę technikę.
1 : Nie rozumiem, w którym momencie w dół potoku Chunked LOD, że siatka zostaje podzielona na kawałki. Czy dzieje się to podczas początkowego generowania siatki, czy też istnieje osobny algorytm, który to robi.
2 : Rozumiem, że struktura danych Quadtree jest używana do przechowywania danych Chunked LOD , myślę, że trochę mi brakuje tego punktu, ale czy w quadtree są przechowywane dane wierzchołków i trójkątów dla każdego poziomu podziału?
3a : Jak zwykle oblicza się odległość kamery. Podczas czytania o quadtree dużo wspomina się o wyrównanych do osi obwiedniach. Czy w takim przypadku każdy fragment miałby pole ograniczające kolizję, aby wykryć kamerę lub odtwarzacz w pobliżu? czy jest na to lepszy sposób? (może raycast?)
3b : Czy fragmenty same obliczają odległość kamery?
4 : Czy każdy fragment ma tę samą „rozdzielczość”. na przykład na najwyższym poziomie siatka będzie miała wymiary 32 x 32, a każdy podzielony węzeł również będzie miał wymiary 32 x 32. Przykład poniżej:
źródło
Odpowiedzi:
1: Nie rozumiem, w którym momencie w dół potoku Chunked LOD, że siatka zostaje podzielona na kawałki. Czy dzieje się to podczas początkowego generowania siatki, czy też istnieje osobny algorytm, który to robi.
Nie ważne. Na przykład możesz zintegrować tworzenie porcji z algorytmem generowania siatki. Możesz to zrobić nawet dynamicznie, dzięki czemu niższe poziomy są dodawane dynamicznie (np. W miarę zbliżania się gracza) za pomocą algorytmu wyrafinowania podobnego do plazmy. Można również wygenerować siatkę o wysokiej rozdzielczości na podstawie danych wejściowych wykonawcy lub danych pomiaru wysokości i agregować ją we wszystkich częściach LOD w momencie finalizacji zasobu. Lub możesz mieszać i łączyć. To zależy od twojej aplikacji.
2: Rozumiem, że struktura danych Quadtree jest używana do przechowywania danych Chunked LOD, myślę, że trochę mi brakuje tego punktu, ale czy w kwadracie są przechowywane dane wierzchołków i trójkątów dla każdego poziomu podziału?
Niekoniecznie. Drzewo tylko przechowuje informacje o geometrii i sposobie jej renderowania. Może to oznaczać posiadanie listy wierzchołków / twarzy w każdym węźle drzewa. Bardziej realistycznie w dzisiejszych czasach, przechowujesz uchwyty oczek / instancji w pamięci GPU.
3a: Jak zwykle oblicza się odległość kamery. Podczas czytania o quadtree dużo wspomina się o wyrównanych do osi obwiedniach. Czy w takim przypadku każdy fragment miałby pole ograniczające kolizję, aby wykryć kamerę lub odtwarzacz w pobliżu? czy jest na to lepszy sposób? (może raycast?)
Bardzo tanią i łatwą opcją jest użycie odległości do punktu środkowego porcji, a następnie jej poprawienie. Wiesz, że odległość ta jest zawsze niedoceniana: jeśli punkt środkowy znajduje się w odległości
Z
, oznacza to, że połowa fragmentu jest bliżej. To, czego nie wiemy, to orientacja. Jeśli oglądamy fragment o szerokościw
krawędzi, najbliższy fragment będzie w pewnej odległościZ-w
. Jeśli jednak oglądamy fragment w pierwszej kolejności, najbliższy bit będzie w pewnej odległościZ-sqrt(2)*w
. Jeśli możesz żyć z tą niepewnością (prawie zawsze możesz), to koniec. Pamiętaj, że możesz również poprawić kąt widzenia za pomocą podstawowej trygonometrii.Wolę obliczyć absolutną minimalną odległość od kamery do fragmentu, aby zminimalizować artefakty. W praktyce oznacza to wykonanie testu odległości punkt-kwadrat . To trochę więcej pracy niż obliczanie odległości do punktów środkowych, ale nie jest tak, że wykonasz zillion tych wszystkich klatek.
Jeśli możesz do tego wykorzystać silnik fizyki, zrób to, ale naprawdę chcesz o tym myśleć bardziej w kategoriach „kwerendy odległości” niż „kolizji”.
3b: Czy fragmenty same obliczają odległość kamery?
To zależy od konstrukcji silnika. Zalecałbym jednak, aby liście były stosunkowo lekkie. W zależności od platformy sam narzut związany z wykonaniem przez kilka tysięcy fragmentów terenu każdej aktualizacji może poważnie wpłynąć na wydajność.
4: Czy każdy fragment ma tę samą „rozdzielczość”. na przykład na najwyższym poziomie siatka będzie miała wymiary 32 x 32, a każdy podzielony węzeł również będzie miał wymiary 32 x 32.
Nie muszą, ale jest to wygodne, jeśli wszystkie fragmenty zajmują tyle samo miejsca. Następnie możesz zarządzać pamięcią (GPU) w jednostkach „porcji”. Łatwiej jest również usunąć / ukryć szwy między dwoma kawałkami o różnych rozmiarach, jeśli jedna rozdzielczość jest wielokrotnością drugiej, ponieważ mają one więcej wierzchołków. (np. 32x32 i 64x64 jest łatwiejszy w zarządzaniu niż 32x32 i 57x57) (dzięki Guiber!). Jeśli masz dobry powód, aby zmieniać rozmiar geometrii porcji, na pewno idź.
źródło