Renderowanie znaków z odciętymi kończynami (modele Blendera w Javie / OpenGL)

10

Jakie aspekty należy wziąć pod uwagę przy tworzeniu animacji postaci i klas renderowania, jeśli chcę mieć odłączalne kończyny? Opracowałem szczegółowy układ ciała, który może mieć wszystko do zdefiniowanego układu nerwowego. Dążę do czegoś podobnego do poziomu szczegółów obrażeń w Dwarf Fortress. Na przykład, gdy postać odniesie obrażenia ramienia, istnieje szansa na uszkodzenie nerwów, które może wyłączyć całe ramię. Lub mogą całkowicie stracić rękę.

Mam spisany system do obsługi części danych. Każda postać ma bagażnik z dodatkami i częściami wewnętrznymi. Każdy dodatek może mieć również podrzędne elementy i części wewnętrzne. Dodatki podrzędne są wyłączone / usunięte, jeśli nadrzędny dodatek jest wyłączony / usunięty. Jeśli którykolwiek z wyłączonych / usuniętych dodatków lub wewnętrznych części będzie wymagany do życia, postać wkrótce umrze.

To, nad czym teraz pracuję, to część związana z rysowaniem / animacją. Jak zdefiniować animacje, aby wiedzieć, które z nich są dozwolone, biorąc pod uwagę aktualny stan ciała (brak rąk / nóg itd.)? Jak skonfigurować system rysowania, aby nie rysował brakujących kończyn? Czy każda kończyna / wyrostek musi być własnym modelem (chciałbym narysować odcięte wyrostki na ziemi)?

Prosty system, z którego przechodzę (właśnie napisałem to do testowania) importuje wszystkie klatki kluczowe animacji jako pełne modele do VBO (wraz z wierzchołkami, od których zaczynają się / kończą klatki kluczowe). Nie importuje ani nie wykorzystuje kości zdefiniowanych w Blenderze i nie interpoluje między ramkami.

To prawdopodobnie dość duże pytanie, dlatego szukam również zasobów, które mogą mnie zabrać tam, gdzie muszę.

EDYTOWAĆ

Pytam o animację, wiedząc, które kończyny są animowane, ponieważ chciałbym, aby została skonfigurowana do wykonywania alternatywnej animacji, jeśli brakuje wymaganej kończyny. Po przemyśleniu tego, wyobrażam sobie, że wykonałbym to sprawdzenie przed aktywacją animacji i aktywowałem odpowiednią animację w tym czasie.

MichaelHouse
źródło

Odpowiedzi:

7

Obecnie pracuję na podobnym systemie. Animacja proceduralna + rozczłonkowanie itp.

Jak zdefiniować animacje, aby wiedzieć, które są dozwolone, podaj aktualny stan ciała (brak rąk / nóg itd.)?

Nie do końca to śledzę, jeśli nie ma tam kończyn, to kogo to obchodzi, czy jest animowane, czy nie, ponieważ nie można go zobaczyć.

Czy każda kończyna / wyrostek musi być własnym modelem (chciałbym narysować odcięte wyrostki na ziemi)?

Dynamicznie buduję je na podstawie obciążników kości wierzchołków. Jakość jest prawdopodobnie nieco niższa niż w przypadku ręcznego wykonywania każdej kończyny, ale jest to mniej wysiłku, gdy raz to zrobię, ponieważ mogę następnie zastosować go do każdego modelu.

Przy zdrowym podejściu z poniższej sekcji, tak, każda kończyna miałaby swój własny model.

Prawdopodobnie miałbym pod ręką kompletny model całego bytu, a każda z kończyn została pocięta.

Jak skonfigurować system rysowania, aby nie rysował brakujących kończyn?

2 główne wybory, najprostszym sposobem jest po prostu narysowanie kończyn osobno, a tam, gdzie łączą się kończyny, mają dodatkowe twarze, które normalnie są ukryte za pomocą tekstur „surowego ciała”, które będą widoczne po usunięciu kończyn.

Drugim wyborem jest zrobienie tego dynamicznie w locie, będzie to działać tylko w przypadku stosunkowo prostych modeli. Podejście polega na przyjęciu modelu podstawowego i znalezieniu wierzchołków, które są ważone do kończyny, którą chcesz rozdzielić. Usuń te wierzchołki, zwracając uwagę na to, z czym się łączą, tak aby znać otwartą sekcję. Następnie dynamicznie zamykasz otwartą sekcję za pomocą trójkątów o fakturze „surowego mięsa”. Z punktu widzenia rozsądnego twórcy oprogramowania takie podejście nie jest dobre (deformacja modelu w czasie wykonywania) i mniej „płaskie” charakterystyki wydajności, ale mi się podobają.

Chociaż pierwsza metoda wygeneruje znacznie więcej wywołań losowania, jest również nieco bardziej przystępna.

Osobiście wybieram drugą, ze względnym sukcesem, ale wszystkie moje modele mają bardzo niski poziom poli, więc dynamiczne cięcie modelu i ponowne ładowanie VBO w ramce jest na razie możliwe.

Nie importuje ani nie wykorzystuje kości zdefiniowanych w Blenderze i nie interpoluje między ramkami.

To naprawdę utrudnia rozczłonkowanie w sposób proceduralny, ponieważ skąd wiesz, które wierzchołki należą do którego połączenia? Obciążniki i rozczłonkowanie kości wierzchołków idą ze sobą w parze, więc proponuję, abyś przemyślał to trochę.

Proponuję również zainwestować w interpolację. Bez niego nie możesz przyspieszyć / spowolnić animacji i jesteś połączony z liczbą klatek na sekundę. Oznacza to, że będziesz w stanie uzyskać mniej z animacji. np. nie możesz spowolnić animacji marszu, gdy ktoś się zatrzymuje itp.

Michał
źródło
Dzięki @Michael. Wychowałem interpolację i importowałem kości, ponieważ wiem, że w końcu będę ich potrzebować, ale jeszcze ich nie mam. Z tego, co powiedziałeś, wygląda na to, że będę wiedział, co robić, kiedy dojdę do tego punktu. Prawdopodobnie po prostu skojarzę wyrostek lub grupę wyrostków z kością. Zadam osobne pytanie dotyczące importowania kości.
MichaelHouse
skoro pracujesz nad czymś podobnym, być może masz więcej informacji na to powiązane pytanie? gamedev.stackexchange.com/q/20931/7191
MichaelHouse
5

Najlepszym rozwiązaniem jest odcięcie kończyn i użycie wielu podmodeli w zależności od aktualnego stanu ran. Twoje podejście do używania VBO na klatkę kluczową jest po prostu przesadą; używaj szkieletowego systemu animacji i odtwarzaj różne animacje w zależności od otrzymanych obrażeń (utykanie jedną nogą, czołganie się bez dwóch nóg itp.).

Valve opublikowało dobry zestaw slajdów na temat ran i rozczłonkowania w L4D2. Bardzo podoba mi się podejście polegające na stosowaniu modelu narządów i kości oraz przycinaniu modelu „skóry” na podstawie rzutów tekstur cięć, wystrzałów itp.

r2d2rigo
źródło
Ciekawy. Te slajdy wyglądają dobrze. Wygląda na to, że zadziałałoby to na obrażenia, które nie wpłynęły na cały wyrostek.
MichaelHouse