Autor Wątek: Chyba dość nowatorski sposób opisywania aktora  (Przeczytany 1577 razy)

Offline PsichiX (ΨΧΞ)

  • Użytkownik
    • PsichiX Website

# Listopad 12, 2009, 22:47:40
Witam. Od dłuższego czasu męczy mnie jedna myśl: Otóż jak chyba każdy tak i ja posiadam w swoim silniku obiekty aktorów których byt w przestrzeni można opisać za pomocą wektora pozycji, kierunku i skali. Jednak zastanawia mnie czy opisanie aktora za pomocą macierzy ma jakiś głębszy sens? Generalnie jestem zdania, że macierze mają ogromny potencjał - jak wiadomo w macierzy można zawrzeć jednocześnie pozycję (przesunięcie), kierunek (rotację) oraz skalę (i pewnie więcej informacji o których nie mam pojęcia, nie mniej byłbym wdzięczny za podpowiedzenie co można w macierzy jeszcze zawrzeć ;) ), dodatkowo użycie ich do renderingu jest chyba szybsze niż tradycyjne wektory. Zastanawia mnie jednak czy rzeczywiście pomoże to przyspieszyć proces renderowania modelu (mnożąc macierz lokalną modelu przez macierz transformacji świata i rysować tak model) zamiast używania tradycyjnych technik (wektorami dokonujemy transformacji (choć w gruncie rzeczy generujemy z nich nową tymczasową macierz lokalną) dla modelu) ?
Jestem ciekaw co o tym sądzicie, ponieważ jeśli na prawdę warto tym zastąpić opis wektorowy, to chętnie uwzględnię to w swoim silniku :)
Za pomocne i wartościowe odpowiedzi z góry dziękuję ;)

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline Kuba D.

  • Użytkownik

# Listopad 12, 2009, 22:51:06
No cóż, nowatorskie to na pewno nie jest ;) Zobacz sobie właściwości aktora w PhysX, który jest tylko silnikiem fizycznym.

Offline PsichiX (ΨΧΞ)

  • Użytkownik
    • PsichiX Website

# Listopad 12, 2009, 23:07:29
no niestety nie sprawdze - na to wyglada ze aby dostac sdk physx trzeba wyslac maila na adres i czekac na zatwierdzenie konta. powiedzmy ze nie chcial bym czekac tygodniami na zatwierdzenie konta, albo i wogole sie nie doczekac bo na nic mi nie potrzebny on jesli tylko do sprawdzenia. pomysl raczej odpada ;p jednak dziekuje za niego :) a moze po prostu zle przeczytalem :D choc jednak nie moge poki co znalezc dokumentacji online ani tym bardziej downloadu ;p o jest :)
a tak poza tym to moze bylbys w stanie odpowiedziec na reszte pytan, z mysla ze physx jest na chwile obecna nie osiagalny? bede wdzieczny :)
« Ostatnia zmiana: Listopad 12, 2009, 23:17:18 wysłana przez PsichiX »

Offline Kuba D.

  • Użytkownik

# Listopad 12, 2009, 23:21:21
No co Ty ? Jaki e-mail ? Jakie potwierdzenie? Ściągasz i masz ;)

No ale skoro zakładamy że nie ściągamy physX SDK...

Macierz zawiera wszystkie przekształcenia więc wydaje się dobrym rozwiązaniem tylko trochę nieintuicyjnym. Łatwiej jest zawrzeć np. skalę w 3 parametrach ( jako wektor) niż wydobywać to z macierzy gdzie są już wszystkie przekształcenia.
Poza tym i tak wszystkie przekształcenia są robione na macierzach w shaderach więc jest dostatecznie szybkie. Klepiąc w kodzie np. glTranslate(3,4,5);/glRotatef(30,0,1,0); to wbrew pozorom nie działasz na wektorze tylko na macierzy właśnie. I tak wszystko się sprowadza do macierzy, z którymi trzeba się koniecznie zaprzyjaźnić żeby podziałać w temacie grafiki 3D ;)

Offline PsichiX (ΨΧΞ)

  • Użytkownik
    • PsichiX Website

# Listopad 12, 2009, 23:28:43
nom ok, o macierzach mam wiedze ogolna, wiem jak ich uzywac, jednak wlasnie wady i zalety tego konkretnego pomyslu interesuja. czyli tak czy inaczej wszystko sprowadza sie do macierzy, to wiem, wedle mojej logiki niby szybciej wyslac gotowa macierz do karty niz klepac transformacje (liczba wywolan gl sie przeciez podobno liczy ;p) za kazdym wywolaniem rysowania modelu. jednak wada jest dla mnie wlasnie pozniejsze pobranie danych pozycji, rotacji, skali, aby mialo to rece i nogi, znaczy sie mnozac wektor przez macierz otrzymam punkt po przeksztalceniu, ale to tylko pozycja. kierunek mysle ze mozna by tez drugi punkt do pozycji, jako wektor otrzymac, z ktorego dostane wektor kierunku, a skale rozumiem ze otrzymam z dlugosci tego wektora? bo skali juz nie wykombinuje jak otrzymac z macierzy :)

ps. wybaczcie jesli niezbyt zrozumiale pisze, dosc pozna godzina heh ;)
« Ostatnia zmiana: Listopad 12, 2009, 23:30:54 wysłana przez PsichiX »

Offline Kuba D.

  • Użytkownik

# Listopad 12, 2009, 23:49:50
Liczba wywołań gl nie jest wcale takim problemem jak piszesz, lepiej niech vertex shader liczy macierze niż CPU ;)
Co do zachowywania pozycji/skali/zwrotu to lepiej te dane ( oczywiście jak masz zamiar je wykorzystać do czegoś innego niż tylko do modyfikacji macierzy modelu) mieć po prostu w klasie aktora, te parę bajtów więcej nie zaszkodzi.

Offline PsichiX (ΨΧΞ)

  • Użytkownik
    • PsichiX Website

# Listopad 12, 2009, 23:55:05
heh, tak myślałem, że będzie trzeba pewnie te dane dodatkowo trzymać. generalnie macierze mi są potrzebne do szybkiej fizyki ciał, a dodatkowo pomyślałem że szybkość renderingu wzrośnie, dla tego się tak na nie uparłem :)
PS. no chyba że jakimś cudem GPU policzy mi kolizje, w co wątpie szczerze aby szybkie było i zadowalające :)

Offline Will

  • Użytkownik

# Listopad 13, 2009, 00:00:46
Dodatkowe dane musisz trzymać tylko dla skali(jeśli jest jednorodna tylko jeden float)+ kierunek(chodzi o rotacje obiektu? Jeśli 2D to też tylko jeden float). To nie jest zbyt wielkim problemem.

Offline PsichiX (ΨΧΞ)

  • Użytkownik
    • PsichiX Website

# Listopad 13, 2009, 00:04:53
obiekt 3D zapomniałem dodać ;P skala i rotacje w 3 wymiarach niestety są wymagane. A więc raczej dla fizyki będzie trzeba generować macierz i pozostać przy standardowej metodzie, lub jakimś cudem uda mi się rozbić złożone transformacje na końcową pozycję (proste), rotację (jeśli wektorową to też powinno być proste) i skalę (mam pomysł aby skalę w 3 osiach obliczyć z wektorów jednostkowych: góra-kierunek-prawo i na podstawie ich długości uzyskać skale 3 osi, dobrze kombinuje?)
« Ostatnia zmiana: Listopad 13, 2009, 00:08:28 wysłana przez PsichiX »

Offline Kuba D.

  • Użytkownik

# Listopad 13, 2009, 00:10:11
Jeśli masz zamiar bawić się w zaawansowaną i szybką( sprzętową ) fizykę to zainteresuj się gotowym silnikiem fizycznym takim jak PhysX ( sprzętowa tylko na NVIDII aczkolwiek są sposoby na obejście tego ). Nie dość że zaoszczędzisz sobie wiele pracy i czasu to jeszcze przynajmniej będzie to szybkie i jakościowo b. dobre no i banalnie proste bo wszystko będzie się samo liczyło. Ty tylko ustawiasz parametry, tworzysz aktorów i podziwiasz efekty bo resztą zajmuje się silnik ;)

Offline PsichiX (ΨΧΞ)

  • Użytkownik
    • PsichiX Website

# Listopad 13, 2009, 00:15:45
wybaczcie że tak komplikuję, ale ten pomysł odpada - póki co mam ładny kawał kodu gotowej fizyki zaimplementowanej, teraz postanowiłem to przyspieszyć właśnie macierzami, a chcę ominąć używania gotowych silników - jestem zawzięty i postanowiłem cały sam napisać, przy okazji nauczyć się nowych technik a użycie physxa mi nie pomoże, tylko rozleniwi bardziej. mam młody chłonny umysł, warto go użyć do kombinowania, niż do staczania się w kierunku kopiego-pasta z tutków itp. wolę sam zrozumieć jak to działa korzystając czasem ze wskazówek :D

Offline Reg

  • Administrator
    • Adam Sawicki - Home Page

# Listopad 13, 2009, 19:55:39
Nie licząc rzutowania perspektywicznego (stosowanego tylko w macierzy rzutowania) i ścinania (rzadko spotykanego), taka macierz jakie stosuje się do opisywania lokalizacji obiektów w świecie gry zawiera dokładnie te 3 rzeczy które wymieniłeś - translację, rotację i skalowanie.

Moim zdaniem warto mieć w obiekcie zarówno te dane osobno, jak i macierz. Bardzo często potrzeba nie tylko zapisywać, ale i odczytywać pozycję czy orientację obiektu, dlatego niefajnie byłoby trzymać je wyłącznie jako zakodowane w macierzy. Dużo lepiej, żeby obiekt miał pola:

- Pozycja : vector3
- Orientacja : kwaternion albo 3 kąty Eulera
- Skalowanie : float albo vector3 (jeśli pozwalasz na niejednorodne)

To są tak jakby parametry "wejściowe". Z kolei do renderowania (parametry "wyjściowe") najczęściej potrzebna jest macierz. Można ją za każdym razem wyliczać z tych 3 pól, ale można też przechowywać wyliczoną. Ja lubię to robić tak, że oprócz macierzy pamiętam też w polu typu bool czy ona jest aktualna i w ten sposób liczę ją tylko *przy pierwszym pobraniu macierzy od ostatniej zmiany pozycji, orientacji lub skalowania* - czyli uprawiam leniwe wartościowanie (lazy evaluation).

Vipa

  • Gość
# Listopad 13, 2009, 20:46:05
Poprawcie mnie jeśli się mylę, ale odwołania do macierzy nie będą wcale szybsze. Owszem, odwołujemy się do jednego zbioru, jednakże jest on tak czy inaczej transformowany przez macierz orientacji (główną).
Jeżeli odwołasz się poprzez porównanie dwóch macierzy jako całości to może... Ale co wtedy gdy chcesz porównać tylko jeden parametr?

Offline Krzysiek K.

  • Redaktor
    • DevKK.net

# Listopad 14, 2009, 14:46:43
Cytuj
- Orientacja : kwaternion albo 3 kąty Eulera
...albo 2-3 wektory (przód, góra i ewentualnie bok, który i tak możesz prosto wyliczyć), czyli w zasadzie macierz obrotu. Jak dla mnie rozwiązanie łatwe i przyjemne (stosowałem w Alerian Orbit do obrotów księżyca). :)