Dlaczego silniki gier przekształcają modele w trójkąty zamiast quadów?

47

Pracowałem przy użyciu Mayi do tworzenia animacji i projektów zorientowanych na film, ale koncentruję się również na studiach nad tworzeniem gier wideo. W każdym razie rozmawiałem z jednym z moich profesorów i nie mogliśmy zrozumieć, dlaczego wszystkie silniki gier (o których wiem) zamieniają się w trójkąty.

Czy ktoś wie, dlaczego silniki gier przekształcają się w trójkąty w porównaniu z pozostawieniem modeli jako wielokątów? Jakie są wady i zalety (jeśli w ogóle) robienia tego?

Dotacja
źródło
1
W pewien sposób NVidia NV1 zastosowała kwadratowe mapowanie tekstur (które wykorzystuje kwadraty) zamiast trójkątów / wielokątów. Co najmniej nie był to duży hit. Zobacz en.wikipedia.org/wiki/NV1 .
Macke,
5
@Macke: Kwadratowy jak w „równaniu kwadratowym”, a nie kwadratowy jak w „czworoboku”. Nie używa quadów, ale raczej krzywą kwadratową zdefiniowaną przez 9 punktów. stason.org/TULARC/pc/3d-graphics-cards-faq/...
9
+1 za twoje pytanie, ale duże -1 dla twojego profesora. Jest to podstawowa rzecz, którą powinien był znać tak dobrze, jak zna swoją własną rękę, i znak, że jest trochę poza kontaktem z rozwojem w ciągu ostatnich 15 lat.
Maximus Minimus,
1
Cóż, w mojej obronie profesorów nie jest po stronie twórców gry, jest raczej animatorem / modelarzem. Wiedział, że przekształcił się w tris, ale nie znał matematycznego powodu, dla którego miałby to renderować. Ale tak, pewnie powinien był wiedzieć.
Grant

Odpowiedzi:

56

Najważniejsze jest rasteryzacja trójkątów, czyli sposób, w jaki komputery renderują obiekty na ekran. Chociaż inni mówią to bardziej wymownie niż ja:

Wszystkie obiekty 3D, które widzimy na ekranie komputera, są w rzeczywistości wykonane z małych małych obiektów geometrycznych, często nazywanych prymitywami. Czworoboki, trójkąty, n-gony itp. Są przykładem prymitywów. Skoncentrujemy się na trójkątach głównie z jednego głównego powodu: każdy obiekt można podzielić na trójkąty, ale trójkąta nie można podzielić na nic innego niż trójkąty. Z tego powodu rysowanie trójkątów jest o wiele prostsze niż rysowanie wielokątów wyższego rzędu; mniej spraw do załatwienia. Właśnie dlatego te trójkąty są tak często używane w grafice komputerowej.

Podkreśl moje. Źródło: http://www.devmaster.net/articles/software-rendering/part3.php

Nate
źródło
2
Niesamowite! To ma sens, gdy się nad tym zastanowić. Dziękuję za odpowiedź!
Grant
1
W OpenGL ES, w ramach wysiłków na rzecz uproszczenia API, quady i wielokąty nie są nawet obsługiwane. Praktycznym powodem używania trójkątów jest to, że nie masz innego wyboru. Ale powodem, dla którego usprawniony interfejs API, taki jak ES, unika innych prymitywnych typów, są powody przedstawione w tej i innych odpowiedziach.
Suboptimus
5
+1 Ponieważ jest to odpowiedź, którą mogę bezpiecznie wykorzystać jako odniesienie, gdy ktoś zapyta mnie o to samo w moich zakładkach. Trzeba tylko powiedzieć, że zawsze myślałem, że powodem, dla którego trójkąty są małymi możliwymi prymitywami, jest to, że przy niedokładności arytmetyki liczb zmiennoprzecinkowych, tris są jedynym bezpiecznym wielokątem, który możesz zagwarantować, że jest płaski we wszystkich przypadkach, przy quadach nie możesz zagwarantować, że będą cały czas być płaskie. Oprogramowanie do modelowania prawdopodobnie pokazuje obiekty jako kwadraty lub n-gony jako wygodę dla modelarza, ale stosuje transformacje / renderuje dzielące wielokąty jako dwa lub więcej trójkątów.
Hatoru Hansou
56

Trójkąty mają wiele właściwości, które sprawiają, że łatwiej i przez to szybciej rysują.

Cztery lub więcej punktów może nie znajdować się na tej samej płaszczyźnie, ale zawsze są trzy punkty (ignorując przypadki zdegenerowane). Ma to interesującą właściwość polegającą na tym, że wartości skalarne zmieniają się liniowo na powierzchni trójkąta. Nawet gdy trójkąt jest rzutowany na ekran, wartości skalarne wciąż zmieniają się liniowo względem x '/ z oraz y' / z.

To z kolei oznacza, że ​​większość, jeśli nie wszystko, co jest potrzebne do cieniowania, mapowania tekstur i filtrowania głębokości, trójkąt można obliczyć za pomocą interpolacji liniowej, co można wykonać niezwykle szybko na specjalistycznym sprzęcie.

tl; dr: trójkąty są najprostszym prymitywem, więc algorytmy zajmujące się trójkątami można znacznie zoptymalizować.

ggambett
źródło
11
+1. Myślę, że fakt, że trójkąt jest zawsze płaski, jest jednym z głównych powodów. Nieplanarne wielokąty znacznie komplikują sprawy.
bummzack
2
+1. Myślę, że trójkąty to jedyny wielokąt, który możesz zagwarantować, że jest płaski, to główny techniczny powód, aby tworzyć api i sprzęt, który wymaga trójkątów. Oprogramowanie do modelowania prawdopodobnie pokazuje siatki jako quady jako wygodę dla modelarza.
Hatoru Hansou
1
Ładną niepłaską analogię, której używam ... Trójnogi stołek może stać na ziemi tylko w jedną stronę, jego stopy są jak narożniki trójkąta. Ale czteronogi taboret może stać na ziemi na dwa sposoby i kołysze się z jednej pozycji do drugiej, jeśli jedna noga jest krótsza niż druga.
ChrisC
Jestem ciekaw; jak to możliwe, że trójkąt ma zawsze punkty na tej samej płaszczyźnie? Jak zatem rysujesz kulę? Przynajmniej jeden punkt musi zostać przetłumaczony na inną płaszczyznę, w przeciwnym razie otrzymasz płaską powierzchnię.
rataplan
@newbiez Trzy wierzchołki zawsze definiują jedną płaszczyznę. Kula składa się z różnych trójkątów; dwa sąsiednie trójkąty reprezentujące płat powierzchni kuli dzielą dwa wierzchołki, ale nie są one w tej samej płaszczyźnie. Ten obraz może uczynić wszystko wyraźniejszym: cse.csusb.edu/tongyu/courses/cs420/images/icos.jpg
ggambett
8

Trzy punkty (trójkąt) ZAWSZE określają płaską płaszczyznę. Innymi słowy, biorąc pod uwagę dowolne trzy punkty, zawsze możesz stworzyć płaską płaszczyznę, która może przeciąć wszystkie trzy punkty. Jednak nie zawsze dotyczy to czterech punktów. Możesz mieć cztery punkty w samolocie, ale możesz też mieć cztery punkty, które nie są w samolocie.

Tim Holt
źródło
2
W rzeczywistości 4 losowe punkty prawdopodobnie nie znajdują się w samolocie, więc i tak będziesz musiał triangulować.
ChrisF,
Jest to prawdą tylko wtedy, gdy punkty nie są zbieżne.
notlesh,
1
Nawet jeśli punkty są zbieżne, są one współpłaszczyznowe na nieskończonej liczbie samolotów.
3Dave
Bycie współpłaszczyznowe nie „ZAWSZE definiuje płaską płaszczyznę” .
sam hocevar
6

Nie robią tego „silniki gier” - robi to całe oprogramowanie 3D, którego używasz. To po prostu ci o tym nie mówi, a twój profesor wydaje się dość słabo wykwalifikowany, jeśli o tym nie wie. Istnieją w pamięci komputera, nawet jeśli oprogramowanie ukrywa je przed tobą. Wszystkie programy 3D mają opcję, dzięki której trójkąty będą widoczne. Będą również mieli opcję, która dzieli je na edytowalne krawędzie, dzięki czemu można z nimi grać. Ale zawsze były na początku i naiwnością twojego profesora jest nauczanie tego tematu i wciąż zastanawianie się „po co są trójkąty”.

Trójkąt to jedyny sposób na ułożenie wierzchołków i zagwarantowanie płaskiej powierzchni. Kiedy masz quada, możesz ułożyć wierzchołki w taki sposób, aby wyginał się. Ale jest już zrobiony z trójkątów i to te trójkąty, które pozwalają na zgięcie.

Domarius
źródło
3

Trójkąt jest najprostszym prymitywem, który można opisać osobno, ponieważ ma trzy punkty, mniej niż te, które nie opisują powierzchni w 3D.

Ponieważ trójkąt można rozpatrywać w oderwaniu, możliwe jest wykonanie fragmentu kodu lub silikonu, który jest w stanie renderować tylko jeden trójkąt, który dzięki sile powtarzania może renderować dowolną powierzchnię.

Dlatego pierwszy system komputerowy, któremu udało się renderować „dowolną powierzchnię” naturalnie zrobił to, renderując wiele trójkątów niezależnie.

Jeśli ktoś myśli o trójkątach i quadach jako o „prymitywach” (tj. O całkowicie odizolowanych fragmentach geometrii bez kontekstu), trójkąt jest bardziej prymitywny i dlatego będzie miał tendencję do „wygrywania”.

Jednak gdy komputery klasy rozrywkowej przekroczyły pewien poziom wyrafinowania w latach osiemdziesiątych, prostota rozpatrywania „prymitywów” w izolacji stała się mniej ważna. Jeśli grafika ma być produkowana masowo, wówczas korzyści skali sprzyjają przetwarzaniu grup powiązanych wierzchołków, tak samo jak sprzyjają montowaniu stu prawie identycznych samochodów na raz.

Dlatego w latach 80. filmy przyjęły „quad”, co jest mylące, ponieważ odnosi się do siatki 2D wierzchołków w przestrzeni 3D, a nie do izolowanego czworoboku.

Ta sama zmiana z trójkątów na „quady” jeszcze się nie wydarzyła w dziedzinie interaktywnej rozrywki, ale prawdopodobnie nastąpi to dość szybko iz tych samych powodów miało to miejsce w branży filmowej.

bmcnett
źródło
2

Jest tylko jeden sposób na triangulację trójkąta w stosunku do 'n - 2' sposobów dla wieloboku wielobocznego. Tak więc trójkąty są ostatecznie najmniej dwuznacznym sposobem definiowania kształtu wielościennego. Ponadto, jak wskazują inne plakaty, istnieje wiele sposobów na przyspieszenie rasteryzacji trójkątów (zamiast quad lub wyższych) (stała z jest jednym z moich ulubionych). Ponadto łatwiej jest zoptymalizować testy przecięcia trójkąt-promień niż w przypadku testów arbitralnego skrzyżowania wielokąta. W rzeczywistości wiele operacji na wielokątach n-stronnych korzysta z posiadania trójkątnej reprezentacji pod ręką. Nie oznacza to, że n-stronne reprezentacje wielokątów są „złe” - są bardzo przydatne, ale ostatecznie będziesz chciał pracować z trójkątami dla wielu operacji siatki.

Luther
źródło
2

Tak długo, jak trójkąt jest zdefiniowany przez trzy nieliniowe wierzchołki (czytaj: żaden z kątów nie jest dokładnie Pi), wówczas wierzchołki określają unikalną płaszczyznę.

Kwadrat jest oczywiście definiowany przez cztery wierzchołki. Jest całkowicie możliwe, że te wierzchołki będą nie współpłaszczyznowe. W takim przypadku twój quad byłby naprawdę dwoma trójkątami podzielonymi przez przekątną na quadzie. To dwie płaszczyzny, dwa zestawy normalnych powierzchni itp.

Każde dostępne narzędzie do modelowania, każdy algorytm teksturowania, oświetlenia itp. Zakłada, że ​​model składa się z płaskich segmentów, a każda formuła, którą posiadamy (produkty krzyżowe do normalnego obliczania jest pierwszą, którą mamy) używa bezwzględnego minimalnego zestawu danych wejściowych - trzy wierzchołki definiują płaszczyznę, a płaszczyzna jest tym, czego potrzebujemy, aby wykonać wszystkie wymyślne rzeczy.

Z pewnością możesz napisać silnik do pracy z quadami, ale zignorujesz czwarty wierzchołek niemal w każdym przypadku, z wyjątkiem sytuacji, gdy (często) będziesz musiał upewnić się, że jest współpłaszczyznowy z pozostałymi trzema, które definiują quad. I najbardziej logiczne rozwiązanie do przypadku, gdy jest to nie w jednej płaszczyźnie byłoby podzielić quad na dwa trójkąty. Dlaczego więc po prostu tego nie zacząć?

Jaki byłby sens pracy z quadami?

Jeśli chcesz quad, połącz dwa trójkąty.

3Dave
źródło
2

Jeśli założymy, że uzyskanie 4 punktów na współpłaszczyznach nie stanowi problemu (jest to, jak zauważyli inni, ale trzymajcie się mnie), to okaże się, że renderowanie dowolnego trapezu (tak zwykle będzie wyglądać czworobok) po przekształceniu w przestrzeń ekranu) nie różni się szczególnie od renderowania trójkąta - w rzeczywistości działa prawie tak samo po wykonaniu obcinania, ponieważ może wprowadzić dodatkowe wierzchołki. (Przynajmniej w modelu oprogramowania - sprzęt może mieć prostszy sposób na wycinanie).

Pozostała kwestia dotyczy zatem wydajności reprezentacji. - możesz łatwo przedstawić kwadrat z 2 trójkątami i bez żadnych dodatkowych wierzchołków, jeśli użyjesz paska trójkąta (3 wierzchołki dla pierwszego trójkąta, a następnie dodatkowy wierzchołek dla drugiego trójkąta). Z drugiej strony, jeśli spróbujesz przedstawić trójkąt z kwadratem, musisz użyć 4 wierzchołków i mieć zdegenerowany identyczny z drugim. Nie jest to idealne pod względem wydajności.

Kylotan
źródło