Wiązania w Blender Game Engine (011; 31.07.2009; blender)
Artykuł ten ma na celu opis zastosowania wiązań dla elementów typu Rigid Body w silniku gry Blendera. Szczegółowy opis wiązań i metody ich ustalania uzupełniony został wieloma przykładami.
Wiązanie jest to połączenia dwóch elementów - ograniczenie ich wzajemnego ruchu. Patrząc w ujęciu mechaniki elementy te tworzą parę kinematyczną, a wiązanie to w istocie więzy geometryczne. Jednak wracając do Blendera, wiązania te dotyczyć będą elementów typu Rigid Body i określane są mianem Rigid Body Joints. Należą one do jednej z grupy wiązań (constraints) możliwych do zastosowania w Blenderze.
Tworzenie wiązania kulistego.
Do powyżej pokazanych par obiektów utwórzmy odpowiednie wiązania. Plik z obiektami do pobrania.
Wiązanie działa prawidłowo, pozostał jeszcze do rozważenia problem przenikania się obiektów (wywołałem go celowo, aby dokładniej opisać to zagadnienie).
Przyjrzyjmy się dokładnie siatce jaka została utworzona dla obiektów na potrzeby symulacji (a raczej gry, bo to w końcu silnik gry blendera). Zaznaczamy w menu Game opcję Show Physics Visualization oraz przechodzimy do wyświetlania typu Wireframe. Po uruchomieniu symulacji zauważymy białe bryły o środkach w środkach lokalnych układów współrzędnych obu brył nijak nie oddające ich kształtu. Istotnie, nie ustaliliśmy dla obiektów żadnego rodzaju granic (Bounds), zostały zatem dobrane domyślne o średnicy ustalonej parametrem Radius.
Najprościej jest zazwyczaj wcisnąć przycisk Bounds i wybrać Convex Hull. Jednak dla tej opcji, wiele niepotrzebnych szczegółów obiektu jest dokładnie odwzorowywane, warto czasem zastanowić się nad zastosowaniem prostszego obszaru kolizji (np. dla kół samochodu użyć typu Cylinder).
Przy okazji nadmienię, że w wizualizacji obiektów do symulacji rozpoznać można kilka kolorów linii. Linie białe tworzą siatkę granicy kolizji obiektów. Gdy obiekt przejdzie w stan uśpienia zmieniają one kolor na zielony (uśpienie następuje, gdy prędkość obiektu będzie dostatecznie mała i nie ma już potrzeby przeliczania jego fizyki; opcję tą można wyłączyć wciskając dla obiektu przycisk No sleeping).
Plik z gotowym wiązaniem: WiazanieAB.blend
Tworzenie wiązania zawiasowego.
Polecam sprawdzić zachowanie obiektów, gdy wyłączymy w opcjach wiązania przycisk No collision. Jeśli chcemy, aby obiekty ulegały kolizji, musimy koniecznie zadbać, aby kolizja nie występowała w miejscu połączenia oraz dla ruchu w pożądanym zakresie.
Plik z gotowym wiązaniem.
Wiązania 6DOF.
Wiązanie to jest wiązaniem, które daje ogromne możliwości, właściwie daje wszystko czego potrzebujemy, aby stworzyć każde wiązanie. Po rozszyfrowaniu nazwa oznacza 6 stopni swobody (6 Degrees of Freedom).
Obiektowi, któremu nadajemy wiązanie ustalmy nieruchomy układ współrzędnych. Nasz obiekt w ogólności może przemieszczać się wzdłuż trzech osi układu odniesienia oraz obracać się wokół tych trzech osi, obiekt ma zatem 6 stopni swobody. Wiązanie 6DOF pozwala nam ograniczyć dowolny ze stopni swobody obiektu zadając wartość maksymalną i minimalną przemieszczenia lub kąta obrotu.
6DOF - przykład.
Tworzymy następującą scenę:
W panelu Logic zmieniamy typ obiektu na Rigid Body, klikamy Bounds i wybieramy Box.
Uwaga: Dla obszaru kolizji typu Box użycie polecenia Scale and Rotation to ObData (ctrl+A) powoduje, że obszar sześcianu kolizji jest zawsze zorientowany równolegle do osi układu współrzędnych, a nie jest to pożądane w naszym przykładzie. Polecam sprawdzić jak wygląda obszar kolizji przy włączonej opcji Show Physics Visualization i trybie Wireframe oraz przetestować swobodny spadek obiektu i kolizję z podłożem.
Ustalamy dla obiektu wiązanie o następujących parametrach:
Układ współrzędnych pokrywa się z lokalnym układem obiektu i po uruchomieniu symulacji zostanie w tym miejscu, gdyż jest związany z obiektem Plane (nieruchomym podłożem).
W ustawieniach dokonaliśmy:
Wszystkie ograniczenia mają swoje graficzne odzwierciedlenie po uruchomieniu symulacji:
Wiązania w prostym pojeździe.
Stwórzmy następującą scenę: Do pobrania: PojazdModel.blend
Dla obu obiektów używamy kombinacji klawiszy Ctrl + A i wybieramy polecenie Scale and Rotation to ObData.
Używamy wiązania zawiasowego (Hinge) do przymocowania koła do podwozia, pamiętając o odpowiednim ustawieniu osi px.
Duplikując koło (Shift+d) otrzymujemy pozostałe koła od razu z gotowymi wiązaniami. Odpowiednio nazywamy koła.
Wszystkie obiekty ustawiamy jako Rigid Body. Dla podwozia wybieramy obszar kolizji typu Box, dla kół ustalamy typ Triangle Mesh. Gdy użyjemy kolizji obszaru kół typu Convex Hull w czasie symulacji występują jakieś nieprzewidziane bezpodstawne kolizje obiektów.
Możemy już wstępnie przetestować pojazd - upada z niewielkiej wysokości na podłoże, wiązania trzymają koła.
Zastosujmy napęd do prawego koła tylnego tylnego (tylne koła - czerwone). W panelu logiki obiektu dodajemy sensor typu Keyboard, klikamy pole obok napisu key i wciskamy na klawiaturze strzałkę do góry. Dodajemy kontroler typu AND i łączymy go z sensorem. Dodajemy aktuator typu Motion i w drugim polu wiersza Torque (moment siły) wpisujemy wartość 10 (moment przykładamy wokół osi y lokalnego układu koła, a nie układu wiązania). Przycisk L w tymże wierszu musi być wciśnięty (ponieważ interesuje nas lokalny a nie globalny układ współrzędnych).
Powtarzamy operację dla napędu wstecznego, przy czym wybieramy klawisz strzałka w dół i wpisujemy wartość momentu napędowego -10.
Zaznaczamy drugie tylne koło, następnie z wciśniętym shiftem zaznaczmy koło, któremu nadaliśmy już napęd. Wciskamy kombinacje klawiszy Crtl+c i wybieramy polecenie Logic Bricks. Tym samym dokonaliśmy skopiowania kostek logiki dla drugiego koła - napęd zadziała jednocześnie na oba.
Można już przetestować pojazd. Zauważamy, że pojazd rozpędza się dość wolno, koła doznają poślizgu. Masa podwozia nie może być taka sama jak koła, zwiększmy ją do 200. Aby uniknąć poślizgu zwiększmy dla każdego koła skalowanie momentu bezwładności względem masy ustawiając Form: 10.
Gotowy model do pobrania: PojazdGotowy.blend
Błędy wyświetlania.
Gdy spotkamy się z sytuacją, w której niektóre ściany obiektów są nie widoczne, bądź 'wywracają się' na drugą stronę przechodzimy do trybu Edit Mode (klawisz 'tab'), zaznaczamy cały obiekt (klawisz 'a') i używamy kombinacji klawiszy 'Ctrl+n' i zatwierdzamy polecenie Recalculate normals outside.
Sztywność wiązań a dokładność obliczeń.
Temat ten rozważałem już na forum troman.pl. Skorzystajmy w wcześniej zamodelowanego pojazdu i zmieńmy masę podwozia na 500. Po włączeniu symulacji zauważamy, że opadając i uderzając o podłoże pojazd zachowuje się jakby miał miękkie zawieszenie. Z racji dużej masy we wiązaniach powstają duże siły, które je 'rozciągają'. Może to być korzystny efekt (właśnie w przypadku zawieszenia), jednak gdy niezbędna jest lepsza sztywność wiązań musimy zwiększyć dokładność obliczeń silnika Bullet.
Zaznaczamy kamerę znajdującą się w scenie, przechodzimy do panelu Shading (F5) i w World Buttons odnajdujemy zakładkę Mist/Stars/Physics. Parametr Sub określa ilość kroków symulacji przypadających na klatkę fizyki. Parametr Phys określa liczbę klatek fizyki przypadających na klatkę gry. Zatem dla zwiększenia dokładności obliczeń i tym samym zwiększenia sztywności wiązań zwiększamy paramer Sub.
Gdyby maksymalna możliwa do ustawienia wartość parametru Sub równa 5 była niewystarczająca, istnieje możliwość ustalenia większych wartości za pomocą skryptu pythona. Treść skryptu (dla Sub: 6), który należy jednorazowo uruchomić na początku symulacji za pomocą kontrolera Python wygląda następująco:
import PhysicsConstraints PhysicsConstraints.setNumTimeSubSteps(6)
Dodatkowe uwagi.
Dla każdego obiektu typu Rigid Body możemy zablokować obliczenia wzdłuż osi globalnego układu współrzędnej lub wokół tej osi. Dokonać możemy tego w panelu Logic po wciśnięciu przycisku Advanced (pzyciski Lock X Axis, Lock X Rot Axis itd.).
Inne przykłady z zastosowaniem wiązań.
Kola.blend
Gasienica.blend
Pozdrawiam użytkowników serwisu troman.pl
Pobierz ten artykuł w formacie pdf: PDF