PhysX & Direct3D
A
A
A
rozmiar czcionki
Dzisiejsze gry komputerowe, oprócz ładnie prezentującego się świata 3D, mają do zaoferowania graczom także rzeczywistą interakcję niemal z każdym napotkanym obiektem. Jest to możliwe dzięki nowoczesnym silnikom fizycznym, takim jak Havok i PhysX. Przekonajmy się, ile pracy wymaga dodanie do aplikacji 3D odrobiny realistycznego ruchu i funkcjonowania przedmiotów.
Jaki jest nasz cel?

Zrzut ekranu uruchomionej aplikacji 3D, symulującej upadek dziesięciu drewnianych skrzyń.Naszym zadaniem jest utworzenie aplikacji, która będzie symulować upadek dziesięciu drewnianych skrzyń (rys. 1). Upuścimy je z pewnej wysokości na płaską powierzchnie i będziemy obserwować, co się stanie. Do utworzenia trójwymiarowej sceny wykorzystamy interfejs Direct3D, natomiast za symulację realistycznego ruchu będzie odpowiadać biblioteka PhysX, którą zintegrujemy z Direct3D. W artykule skupimy się wyłącznie na utworzeniu symulacji fizycznej, całą resztę związaną z renderowaniem grafiki 3D pominiemy.
Utworzenie sceny fizyki
Tworzenie środowiska, w którym będzie przeprowadzana fizyczna symulacja trójwymiarowego świata, rozpoczynamy od przygotowania głównego obiektu PhysX SDK.
NxPhysicsSDK* gPhysXSDK = 0;
gPhysXSDK = NxCreatePhysicsSDK(NX_PHYSICS_SDK_VERSION);
Teraz możemy ustawić podstawowy parametr symulacji. Jest nim grubość skóry obiektów. Skóra określa, w jakim stopniu obiekty mogą się nawzajem przenikać (rys. 2 i 3). Ustawiając globalną wartość grubości skóry, sprawimy, że będzie ona automatycznie przypisywana do każdego obiektu, który dodamy do sceny. Biblioteka umożliwia dodatkowo indywidualną zmianę grubości skóry każdego obiektu. Nie zaleca się ustawiania zerowej grubości, bo może to powodować niewłaściwe funkcjonowanie obiektów. Zbyt gruba skóra również ma swoje wady, przede wszystkim generuje rzadko pożądany efekt zanurzania się jednego obiektu w drugi. W naszej aplikacji ustawimy 0.01, czyli 1cm. Domyślnie parametr NX_SKIN_WIDTH jest ustawiony na 0.025 (2,5 cm):
gPhysXSDK->setParameter(NX_SKIN_WIDTH, 0.01f);

Po lewej stronie widoczne jest niewłaściwe dopasowanie rozmiaru obiektu w scenie Direct3D i PhysX. Obiekt w scenie Direct3D z jakichś powodów jest dwukrotnie mniejszy. Jedna skrzynia powinna leżeć swobodnie na drugiej, tymczasem lewituje w powietrzu.Przechodzimy do tworzenia sceny. Jest to obiekt, który będzie przechowywał informacje o wszystkich obiektach biorących udział w symulacji. Każdy pojedynczy obiekt dodany do sceny nazywamy aktorem. Scenę tworzymy z poziomu głównego obiektu PhysX. Najpierw należy utworzyć odpowiednią zmienną do zapamiętania adresu sceny.
NxScene* gScena = 0;
Kolejny krok to przygotowanie struktury opisującej właściwości sceny - grawitację i typ symulacji. Grawitację opisujemy za pomocą wektora, który wskazuje kierunek jej oddziaływania. Wybieramy dobrze znaną ze szkoły wartość przyśpieszenia 9,8 m/s, działającego prosto w dół na wszystko, co się znajduje w powietrzu. Typ symulacji określa, czy scena będzie obliczana sprzętowo (NX_SIMULATION_HW), czy metodą programową (NX_SIMULATION_SW). Do symulacji programowej jest zaprzęgany procesor, natomiast do sprzętowej niezbędny będzie specjalny akcelerator fizyki wyposażony w PPU.
NxSceneDesc opisSceny;
NxVec3 grawitacja(0, -9.8f, 0);
opisSceny.gravity = grawitacja;
opisSceny.simType = NX_SIMULATION_SW;
Teraz możemy utworzyć scenę. Służy do tego funkcja createScene. Jeżeli miałeś kontakt z DirectX API, z pewnością zdążyłeś już zauważyć pewną analogię - tworzenie i niszczenie obiektów w bibliotece PhysX odbywa się na podobnych zasadach.
gScena = gPhysXSDK->createScene(opisSceny);
| Wymagania i narzędzia | | Aby skorzystać z porad zawartych w artykule, musisz opanować przynajmniej podstawy programowania w języku C++. Ogólna wiedza na temat grafiki 3D oraz doświadczenie w kodowaniu z wykorzystaniem biblioteki DirectX Graphics. Poza tym powinieneś zaopatrzyć się w takie narzędzia jak DirectX SDK 9, PhysX SDK 2.7 oraz Visual Studio 2005. Znajdziesz je na oficjalnej stronie www.microsoft.com i www.ageia.com oraz na płycie DVD dołączonej do naszego pisma. Aby uruchomić aplikacje korzystające z biblioteki PhysX, musisz ponadto zainstalować w systemie odpowiednie biblioteki uruchomieniowe Ageia. |
|