Co powinno zawierać wykres sceny gry?

10

Czy mógłbyś mi pomóc wyjaśnić, co dokładnie powinien zawierać wykres sceny gry? Zobacz następującą listę:

  • Aktorzy gry? (oczywiście tak, wszystkie obiekty zmieniające stan powinny być główną częścią wykresu sceny)
  • Prosta statyczna gra ojbects? (Mam na myśli odsunięcie miejsc w tle, które się nie animują, ani nie kolidują)
  • Wyzwalacze gier ?
  • Światła gry ?
  • Aparaty do gier ?
  • Kule broni ?
  • Wybuchy w grze i efekty specjalne?

Powyższe rozważane typy obiektów. Teraz do pokrycia wykresu sceny:

  • Czy wykres sceny powinien zawierać całą mapę poziomów gry od początku poziomu, czy powinien zawierać tylko widoczną część mapy? Jeśli druga prawda jest prawdą, oznaczałoby to, że wykres sceny byłby stale aktualizowany poprzez dodawanie / usuwanie obiektów gry, gdy gracz się porusza. Jednak zawieranie tylko widocznych obszarów mapy byłoby znacznie szybsze w przejściu i aktualizacji.
Bunkai.Satori
źródło
@Josh: dziękuję za edycję i poprawienie mojego pytania.
Bunkai.Satori

Odpowiedzi:

4

Myślę, że dobra lektura tego, co robią inne technologie wykresów scen, przyniosłaby ci wiele korzyści.

tło
Na przykład spójrz na opis Ogre3D. Jest to silnik graficzny oparty na grafie scen, który jest open source. Sugerowałbym zapoznanie się z samouczkami i sprawdzenie, w jaki sposób wykorzystywane są węzły scen (Uwaga: nie mówię, abyś nauczył się korzystać z Ogre, a raczej jakie funkcje są obecne w węzłach scen i menedżerach scen)

Dokumentacja SceneNode:
http://www.ogre3d.org/docs/api/1.9/class_ogre_1_1_scene_node.html

Dokumentacja SceneManager: http://www.ogre3d.org/docs/api/1.9/class_ogre_1_1_scene_manager.html

Kolejną rzeczą, na którą warto spojrzeć, jest następujący link:
http://sgl.sourceforge.net/#features

Jest to rozwiązanie oparte na grafice OpenGL, a strona funkcji pokazuje wszystkie węzły, które może zawierać.

Twoje sugerowane węzły
Uważam, że wykres sceny powinien być jak najbardziej oderwany od logiki gry, abyś nie miał problemów z zależnościami. Dla każdego z twoich punktów kulistych powiedziałbym, co następuje:

Aktorzy gry
prawdopodobnie powiedziałbym „nie”. Podobnie jak Ogre, miałbym podstawową klasę Entity (która zawiera logikę specyficzną dla obiektu) i podstawową SceneNode ze wskaźnikiem elementu Entity, aby uzyskać odpowiednie informacje do renderowania obiektu (Pozycja, Orientacja itp.)

EDYCJA: Nie mówię, żeby nie włączać twoich aktorów do gry na wykresie sceny (inaczej nic by się nie pokazało: P) Mówię, że mam węzeł sceny z odniesieniem do logicznej klasy aktora, więc masz wciąż mam luźne połączenie renderowania i aktualizacji obiektów gry.

Prosta statyczna gra ojbects
Tak

Wyzwalacze gier?
Nie, to wydaje mi się logiką specyficzną dla gry.

Światła gry?
tak

Aparaty do gier?
tak

Kule broni?
Nie jestem do końca pewien, ale prawdopodobnie powiedziałbym „tak”, ale prawdopodobnie chciałbyś, aby wszystkie pociski jako dzieci trafiły do ​​węzła sceny nadrzędnej „BulletCollection”, abyś mógł buforować tę pozycję i nie będziesz musiał przechodzić wykres sceny do usunięcia i dodania pocisków do renderowania.

Wybuchy w grze i efekty specjalne?
Nie jestem pewien, pozwolę komuś na to odpowiedzieć.

Pokrycie wykresu sceny
Jeśli masz względnie mały poziom, powinieneś być w stanie zapisać cały poziom na wykresie sceny, a następnie zoptymalizować pod kątem widoczności za pomocą drzewa Octree (zwykle dla środowisk zewnętrznych) lub drzewa BSP (zwykle dla środowisk wewnętrznych).

Jeśli masz znacznie większy poziom i nie chcesz ładować żadnego poziomu, w tym miejscu mogłaby pojawić się transmisja strumieniowa, ale to zupełnie inna kwestia. Zaczynam od małego poziomu i stopniowo sprawdzam, jak duży możesz go zrobić bez negatywnego wpływu na wydajność.

Wniosek
Dla mnie wykres sceny dotyczy części renderowania w pętli gry. Nie powinieneś zbyt ściśle łączyć renderowania i aktualizacji logiki, w przeciwnym razie napotkasz irytujące problemy z zależnościami.

Ray Dey
źródło
+1 - Dziękujemy za szczegółową i cenną odpowiedź. Moja wiedza na temat SceneGraphs pochodzi z książki Game Coding Complete ( amazon.com/Game-Coding-Complete-Third-McShaffry/dp/1584506806/... ). Twoje linki są pomocne, zwłaszcza klasa SceneNode Ogre. Odnosząc się do twojego wniosku , czy widzisz Wykres Scenowy jako świetny sposób na aktualizację Transformacji połączonych obiektów w grze? Zarówno twoje, jak i Josha są doskonałe. Myślę, że ten zawiera więcej informacji, więc zaznaczam ten jako odpowiedź zaakceptowaną .
Bunkai.Satori
@Bunkai Jeśli myślisz, że twoje obiekty gry mają metodę Update (), w której aktualizują swoje wektory pod kątem ich pozycji, orientacji itp., To wszystko, co musiałby zrobić twój węzeł sceny, to renderowanie siatki i przekształcanie jej za pomocą GetPosition () i GetOrientation () i wyrenderuj to na ekranie. To naprawdę oddziela logikę aktorów od ich kodu renderowania, o który powinieneś naprawdę dążyć.
Ray Dey,
9

Chciałbym zasugerować umieszczenie mniejszej liczby rzeczy na wykresie sceny. Zobacz w szczególności ten artykuł Toma Forsytha: „ Scene Graphs - Just Say No ”.

Sednem artykułu Forsyth jest to, że nie powinieneś próbować wtłaczać wielu niepowiązanych elementów w jedną wielką strukturę danych podstawowych. Jest to bardzo podobne do pomysłów, które poruszyłem w tej odpowiedzi, dotyczących czerpania wszystkiego z gry, GameObjecta następnie umieszczania tego wszystkiego na jednej dużej heterogenicznej liście (to znaczy źle).

Stosunkowo niewiele obiektów na świecie naprawdę wykazuje silną relację rodzic-dziecko, jak przystało na strukturę drzewa. Zwykle używa się tutaj kanonicznego przykładu filiżanki kawy na stole - jasne, można uznać, że jest to „dziecko” stołu ... przynajmniej do momentu, gdy zostanie ono przewrócone. Czy to naprawdę jest dziecko ze stołu? Oznacza to, że twoje „drzewo” może skończyć się dość płytkie i rodzaj zdegenerowanych list.

Sugeruję więc użycie wielu struktur danych dla wielu rzeczy, co jest najbardziej sensowne dla tych rzeczy. Na przykład geometria statyczna i światła wydają się rozsądnym rozwiązaniem, aby wrzucić je na wykres sceny. Nawet jeśli reprezentowane obiekty nie mają naturalnych relacji rodzic-dziecko, fakt, że są statyczne, oznacza, że ​​możesz nadać im strukturalne relacje rodzic-dziecko wiedząc, że nigdy się nie zmieniają.

Aktorzy z gry ... Nie jestem tego taki pewien. W rzeczywistości wszystko, co ma tendencję do poruszania się, oznacza, że ​​zwykle musisz trzymać je blisko podstawy wykresu lub stale je ponownie nadawać (co jest obowiązkowe i niezbyt wydajne).

Pociski, wyzwalacze, efekty specjalne i inne przejściowe obiekty, które chciałbym przechowywać gdzie indziej. Na renderowanym wykresie nie powinno znajdować się nic, co renderuje lub ma wizualną reprezentację (wyzwalacz jest zwykle niewidoczną ograniczającą objętością, kula jest zwykle tylko promieniowaniem). Powinieneś dążyć do oddzielenia warstw renderujących i logicznych .

Dla tego, co jest warte, nigdy nie użyłem drzewnego wykresu scen w żadnym z rendererów, które zbudowałem dla celów nieakademickich (oczywiście wcześniej budowałem drzewne wykresy scen, i tak doszedłem do wniosku, że ja teraz próbuję zachęcić cię do zaakceptowania).

Korzystam z metod partycjonowania przestrzennego odpowiednich dla stylu gry (quad-tree, octree, BSP, i tak dalej) do grupowania / usuwania elementów logicznych w grze, które powinny (a) przetwarzać tę ramkę i (b) renderować ta rama. Następnie kończę wprowadzanie zestawu obiektów z listy (b) do systemu, który mapuje obiekty logiczne w celu renderowania opisów i sortuje te opisy w segmenty na podstawie właściwości (na przykład wszystko, co korzysta z przezroczystości, zostanie wrzucone do wiadra na „rzeczy” które powinny być renderowane od tyłu do przodu). Następnie renderuję każdy segment w kolejności, a dla każdego segmentu renderuję każdy opis w kolejności. Myślę, że można to nazwać „drzewem”, ale nie wykazuje ono typowego stanu / transformują metody propagacji, które robią tradycyjne wykresy zorientowane na drzewa. YYMV,

Społeczność
źródło
+1 za doskonałą odpowiedź. Przeczytałem zalecany artykuł. Zasadniczo chciałbym użyć Wykresu Sceny, aby zaktualizować pozycje połączonych obiektów (przykład: zestaw żołnierzy jest na statku. Gdy statek się porusza, żołnierze poruszają się wraz z nim, a pistolety w rękach również się poruszają). Dlatego planuję mieć klasę interfejsu: CGameObject, a wszystkie obiekty, które mają być umieszczone w Scenie sceny, powinny być jego częścią. Dziękuję bardzo za porady.
Bunkai.Satori