Jak powstają silniki terenowe wokselowe?

53

Kilka dni temu znalazłem coś, co nazywa się terenami wokselowymi i myślę, że są całkiem fajne. Ale nie wiem, co ich generuje. Czy modelujesz to w swoim oprogramowaniu do modelowania, czy używasz czegoś takiego jak mapa wysokości? Czytałem na Wikipedii, że woksele są jak piksele 3d lub piksele wolumetryczne.

Po utworzeniu terenu wokselowego, w jaki sposób mogę wziąć te woksele i uczynić je możliwymi do zniszczenia / kopania ?


Wybiorę najlepszą odpowiedź na podstawie:

  1. kod i algorytmy. najlepiej oparty na C #
  2. wyjaśnienia. Jestem początkującym w algorytmach, ale bardzo dobrze znam programowanie obiektowe
  3. pokazy krok po kroku. Nie tylko koncepcja, ale i kierunek.
  4. diagramy / ilustracje. Nie, nie zrzuty ekranu z innych silników.


Wiem, że to skomplikowany temat. Ale dziękuję za wszelką pomoc!

Nie, nie próbuję stworzyć klonu minecrafta.


Edytować

Dziękujemy wszystkim za wspaniałą pomoc (zwłaszcza Nick Wiggill)! Właśnie to udało mi się zrobić (Praca w toku).

Daniel Pendergast
źródło
[jedność] i C ? To ... nie ma sensu.
Martin Sojka
Rozumiem C.
Daniel Pendergast
8
Bardzo śmiało prosisz o zaufanie do społeczności. Mam na myśli kompletny artykuł na temat w pełni dynamicznego terenu wokseli dla dzisiejszego sprzętu z dobrym FPS, powinno być łatwo, prawda? Cóż, temat jest tak szeroki i trudny, wątpię, czy zobaczysz ogólne rozwiązanie, a nawet wtedy może być całkowicie bezużyteczny w twoim przypadku. Ale kto wie, może to być wykonalne w zależności od modelu do naśladowania. Czy chcesz teren wokselowy Crysis 2 czy Delta Force ? Może robisz klon Minecraft lub potrzebujesz tylko symulacji piasku do gry w kopanie? Proszę określić zakres.
EnoughTea
2
Sprawdź to oprogramowanie pośrednie: forum.unity3d.com/threads/… . W szczególności demo
Tetrad
1
GPU Gems 3 zawiera rozdział o terenie wokseli: http.developer.nvidia.com/GPUGems3/gpugems3_ch01.html
Tamschi

Odpowiedzi:

58

Aby wygenerować teren wokseli

(a) Powszechną metodą jest generowanie mapy wysokości za pomocą szumu Perlina. Mapa wysokości jest w zasadzie obrazem monochromatycznym przedstawiającym różne wysokości przez ciemność lub jasność pikseli.

wprowadź opis zdjęcia tutaj

Na tej mapie wysokości będziesz patrzył na poszczególne piksele, aby utworzyć „stosy” wokseli do różnych wysokości (oś Z) w różnych lokalizacjach (x, y), zgodnie z jasnością tego piksela na obrazie mapy wysokości. Ponieważ obraz szumu Perlina jest gładki (brak ostrych krawędzi światła w stosunku do ciemności), dzięki temu będziesz mieć łagodnie toczący się teren.

(b) Możesz budować go stopniowo, tworząc krajobraz z różnych wielościanów. Utwórz wielościenny kształt wektorowy, który będzie zbliżony do kształtu wokseli, który chcesz. Za pomocą dowolnej metody 3D-punkt-w-wielościanie (najczęściej punkt-wypukły-kadłub) sprawdź, które punkty siatki światowej mieszczą się w tej wielościennej objętości. Na przykład zdefiniuj piramidę w przestrzeni. Po sprawdzeniu każdego punktu w lokalnym obszarze twojego świata względem piramidalnej objętości, będziesz wiedział, które punkty w nim mieszczą się, i możesz ustawić te komórki jako „obecne”, co oznacza, że ​​stają się wokselami, a nie pustą przestrzenią. Masz teraz piramidę woksela w swojej przestrzeni. W ten sposób możesz nadal dodawać kształty, dopóki nie utworzysz terenu.

(c) (Naprawdę to samo co b ) Napisz narzędzie do modelowania. Voxatron pokazuje, jak by to wyglądało. To tylko tworzenie formularzy wokseli w zastępczym świecie (edytor), a następnie importowanie ich do rzeczywistego świata gier. Wierzę, że Voxlap miał pierwszy edytor open source dla wokseli. Możesz umieszczać pojedyncze woksele lub użyć „pędzla” wokseli o różnych kształtach / objętościach, aby narysować woksele w swoim świecie.


Czego potrzebujesz, aby zbudować własną grę opartą na wokselach

Zamieszczam ten odcinek, ponieważ droga wokselowa nie jest łatwa, a przynajmniej nie w chwili obecnej. Ostatnio duzi gracze ponownie przeprowadzają wiele badań w silnikach wokseli, w zakresie renderowania i zastosowań fizycznych.

Prostota może stanowić problem, ponieważ dynamiczne konstruowanie świata z surowych wokseli jest proceduralnym podejściem do konstruowania świata i nie jest z natury proste . Przepraszam, będzie kilka terminów technicznych tutaj. Pisanie silnika wokseli jest dość poważnym przedsięwzięciem i wymaga wiedzy w wielu obszarach rozwoju silnika gry, szczególnie w zakresie koncepcji przestrzennych, a to oznacza zrozumienie matematyki wektorowej 3D, macierzy i rachunku podstawowego do pewnego rozsądnego poziomu.

Powiedziawszy to, twoja „generacja terenu wokselowego” wymaga kontekstu, w którym może działać, ponieważ silniki wokselowe nie są dokładnie rozpowszechnione. Przejdźmy do podstawowego opisu działania silnika wokselowego.

Woksele są podstawowymi elementami budującymi twój świat. Ich pozycje są definiowane przez siatkę 3D (macierz) z indeksowaną liczbą całkowitą, a nie przez ciągłą zmiennoprzecinkową przestrzeń (stosowaną w grach 3D wektorowych). To będą „atomy” waszego świata. Mogą mieć wysokość 3 stóp, jak w grach takich jak Minecraft, lub mogą być mniejsze niż oko twojej wirtualnej postaci, chyba że skupione w dużych ilościach - trochę bardziej jak cząsteczki. Istnieją dwa rodzaje:

  • Woksele oparte na siatce sześciennej ( przykład ) - są to nowsze rodzaje, używane dla uproszczenia i łatwe do użycia w połączeniu z nowoczesną technologią graficzną. Używany w grach takich jak MineCrat i Dungeon Keeper.
  • Punktowe woksele ( przykład , przykład ) - woksel oryginalny. Każdy z nich jest indywidualnym, zderzalnym punktem w przestrzeni, chociaż może być otoczony kulistą objętością ograniczającą. Są prostsze, więc możesz mieć ich o wiele więcej w swoim świecie, a tym samym możesz je zmniejszyć, co jest ogólnie korzystne. Dwie gry, które je wykorzystały, to Comanche i remake Lords of Midnight z lat 90.

Tak czy inaczej, twoje podejście do manipulowania wokselami w twoim świecie jest prawie takie samo, jak poniżej.

Aby konstruować i przenosić obiekty w twoim świecie, potrzebujesz narzędzi matematycznych wymienionych powyżej. Na przykład, aby utworzyć ścianę: Zbuduj pudełko o odpowiednich wymiarach w przestrzeni 3D, używając wektorów. Użyj matematyki matematycznej, aby przekształcić pole do rotacji i pożądanej pozycji w świecie 3d (w ciągłej przestrzeni wektorowej). W przypadku silnika wokselowego dodatkowym krokiem jest teraz użycie algorytmu punkt-w-wielościanie 3D, aby określić, który z wokseli wchodzi w obróconą przestrzeń.

Zasadniczo w ten sposób konstruujesz większość obiektów w swoim świecie. Poza tym możesz napisać własne narzędzia do „modelowania” postaci w sposób, w jaki można powiedzieć, Maya lub 3DS Max. Ale ponieważ modelujesz swoją postać z wokseli zamiast punktów, krawędzi i ścian, twoje metody będą się zasadniczo różnić. Jeśli zdecydujesz się następnie obrócić te obiekty w swoim świecie, musisz w podobny sposób użyć transformacji macierzowych.

Zniszczalny teren jest tak prosty, jak usunięcie jednego woksela na raz zgodnie z wybraną metodą lub użycie operacji CSG (Constructive Solid Geometry) na dużych objętościach wokseli, aby je usunąć zgodnie z pewną wcześniej określoną objętością; na przykład, jeśli strzelasz wiązką laserową przez skałę, możesz użyć cylindrycznej objętości, aby odjąć woksele tutaj, wiązka strzela przez skałę. CSG jest stosunkowo prostym procesem, w którym wykorzystuje się przestrzenne siatki 3D, które tworzą świat wokseli, i sprawdza każdą komórkę w części siatki bazowej (w tym przypadku skały) względem innej siatki (w tym przypadku wiązki laserowej)

Aby mieć „przepływy” materiałów (jak zauważył Vigil w swoim komentarzu do piasku), musisz przyjrzeć się dynamice płynów i automatom komórkowym. Używał ich autor Dwarf Fortress, Tarn Adams, w gruncie rzeczy także w świecie wokseli (chociaż woksele są w tym przypadku znacznie większe, porównywalne z Dungeon Keeper, zasada pozostaje ta sama). Są to najnowocześniejsze tematy, a nie konieczność definiowania silników wokseli, więc zostawię to jako „odgałęzienie” do własnych badań.

CSG i dynamika płynów doprowadzają mnie wreszcie do optymalizacji. Obecnie opracowywane silniki Voxel prawie wyłącznie wykorzystują rzadkie oktony wokseli (SVO), które są metodą dzielenia przestrzeni wokseli na różne rozdzielczości, o czym świadczy ten film pokazujący nadchodzący silnik Atomontage. Używanie oktetów / SVO jest bardziej koniecznością niż wyborem optymalizacyjnym, ze względu na koszty ogólne przetwarzania związane z przetwarzaniem jednej ogromnej, jednolitej siatki. Oktree jest zasadniczo drzewem (ukierunkowany wykres acykliczny), w którym każdy węzeł ma 8 lub zero węzłów potomnych, w zależności od tego, czy reprezentowana przestrzeń zawiera jakieś woluminy fizyczne. Schematy pokazujące jak octrees dzielące przestrzeń, tworząc woksele są tutaj .

Najlepszą implementacją wokseli, jaką znam, jest silnik Voxlap Kena Silvermana , który został użyty w Voxelstein3D. Jest napisany w C ++ i implementuje operacje CSG na deformację terenu.

Inżynier
źródło
Zmiana wiki społeczności jest trwała, nie ma możliwości jej cofnięcia. Musisz usunąć i odtworzyć swoją odpowiedź (oczywiście poświęcając swoje dotychczasowe głosy)
Jesse Dorsey
meta.stackexchange.com/questions/2974/… twierdzi, że moderatorzy mogą to usunąć. Nie wiem jednak, czy coś się zmieniło. Dzięki za przyjrzenie się temu w obu kierunkach.
Inżynier
1
Idź do figury, bądź ostrożny następnym razem.
Jesse Dorsey
2
Pierwsza z nich to dyskrecjonalna przestrzeń, w której istoty mogą leżeć tylko bezpośrednio na komórce. Podobnie jak idealnie ułożone elementy na szachownicy, nie mogą leżeć „między” komórkami lub nakładać się na granice. Podczas gdy przestrzeń ciągła jest taka, jak w większości silników fizyki, tzn. Jest oparta na liczbach zmiennoprzecinkowych, a zatem jest ciągła, a nie kwantyzowana. Twoja istota może siedzieć na dowolnej dowolnej pozycji w przestrzeni kosmicznej, którą wybierzesz - tak jak w prawdziwym życiu.
Inżynier
1
Teksturowanie jest niejawne. Prawdziwe woksele, niezależnie od tego, czy są oparte na siatce, czy nie, mają czysty kolor. Wyżej wymienione podejścia po prostu tworzą bardziej realistyczne szczegóły i umożliwiają podejście z połączoną siatką (Google Unity VoxelForm). Im drobniejsze są twoje woksele, tym drobniejsze są uzyskane szczegóły tekstury. Przykład: modeluj koryto rzeki jako kamień (szary). Konwertuj każdy piksel w odległości x powierzchni na piasek, ustawiając te woksele tak, aby miały materiał = „piasek”; można je następnie renderować w kolorze piasku. Dodatkowo może to również wpływać na ich fizyczną interaktywność, więc piasek może być przenoszony przez wodę lub odkopywany.
Inżynier
33

Najlepszym sposobem na wygenerowanie interesującego terenu wokselowego jest mapa gęstości hałasu Perlin. Zamiast korzystać z mapy hałasu 2D Perlin, określającej wysokość świata 3D, użyj mapy hałasu 3D Perlin. Zważ mapę tak, aby wartości bliżej dna były bardziej prawdopodobne, a wartości bliżej góry z pewnością będą powietrzne. Daje to wysokość twojego świata, ale pozwala również na nawisy i jaskinie, podobne do terenu Minecraft , ponieważ ten widok z boku fragmentu terenu pokazuje:

Świat z nawisami

Stąd możesz przetestować pływające wyspy lub dodać systemy jaskiń za pomocą fraktalnego hałasu:

Świat z systemem jaskiń

Powyższe zdjęcia i pomysły na system jaskiń pochodzą z tego doskonałego posta na blogu . Można dowiedzieć się wszystkiego o Perlin hałasu tutaj , a tam jest jakiś przykładowy kod, aby zacząć grę tutaj .

dlras2
źródło
4

Pozostałe odpowiedzi tutaj są doskonałe, ale podjąłem nieco inne podejście.

Generuję środowisko w narzędziu do modelowania (3DSMAX) i buduję z niego rzadką oktodę. Każdy sześcienny, niepusty węzeł liścia jest wokselem. W czasie renderowania używam raycastingu (zaimplementowanego w HLSL), aby znaleźć, który woksel zajmuje dany piksel, i ustawiam piksel na kolor przechowywany w węźle, który obliczyłem podczas generowania drzewa, uśredniając wartości tekstury z modelu źródłowego.

Daje to wiele miłych korzyści - wykrywanie kolizji za darmo, zmienne LOD, sprawdzanie przestrzeni kosmicznej itp. - a oprócz radia kierowniczego - łatwe do wdrożenia.

Niestety publikowanie przykładowego kodu z telefonu jest prawie niemożliwe.

3Dave
źródło
+1 za alternatywę. Chociaż nie jest to niemożliwe do wdrożenia przy rozsądnej wydajności, zalety są znacznie większe niż wady. Voxel raytracing powoduje ogromne obciążenie procesora graficznego. Niezbędna do tego arytmetyka i warunki warunkowe są bardzo kosztowne, gdy te same cykle GPU mogą nakładać wiele imponujących efektów przestrzeni ekranowej, np. SSAO. Największy problem polega na tym, że raycasting wygląda najlepiej przy wielu odbiciach, jakie występują w radości - nie jest to wykonalne dla sceny składającej się z milionów lub miliardów wokseli, w której każdy segment promienia wymaga znacznego wysiłku, aby się odbić i złożyć.
Inżynier
... Właśnie dlatego wspomniałem o rycastingu skalinowym tylko na marginesie w mojej odpowiedzi (VoxLap) - nawet trudno jest go dobrze wdrożyć. Jeśli możesz uruchomić pionowe podejście do skanowania, koszt jest o rząd wielkości mniejszy niż śledzenie promieni na piksel, ponieważ zmniejszyłeś wymiarowość procesu renderowania z 3D do 2D. To podejście nadal stand by, choć nie wyklucza kompleksowych rozwiązań oświetleniowych możliwe z tradycyjnym RTRT.
Inżynier