Autor Wątek: Bulled tworzenie kształtów do obliczeń fizyki  (Przeczytany 976 razy)

Offline prociomen007

  • Użytkownik

# Kwiecień 07, 2012, 18:03:24
Mam jakiś dziwy problem z utworzeniem nieregularnego kształtu dla fizyki. Z kostkami walcami kapsułkami i tym podobnymi kształtami jest ok. Kiedy jednak próbuje dorzucić coś nieregularnego otrzymuję jakieś dziwactwa. Używam bulled i funkcji:

CollisionShape groundShape = new ConvexHullShape(wierzchołkiDlaFizyki);

zgodnie z tutorialami jakie odnalazłem w sieci powinna ona utworzyć mi fizyczny kształt z tablicy wierzchołków która jest w formie

tablica <wierzchołki jako wektor>

niby coś się tworzy ale po bliższych oględzinach nie jest to prawidłowo policzone. Kiedy powierzchnie są płaskie typu kostka jest ok. ale po dodaniu jakiś skosów/spadów kątów itp. rzeczy zaczyna się dziać kosmos.

Offline Mr. Spam

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

Offline voytech

  • Użytkownik

# Kwiecień 08, 2012, 13:24:29
zgodnie z tutorialami jakie odnalazłem w sieci powinna ona utworzyć mi fizyczny kształt z tablicy wierzchołków która jest w formie...
jeżeli poprzez fizyczny kształt rozumiesz np. obiekt z wgłębieniami (concave-wklęsły) to jesteś w błędzie. Convex hull (convex-wypukły) to coś w stylu sphere/box/cylinder/capsule/cone tylko że bardziej skomplikowany. Wygląda jak oszlifowany diament, wypukła bryła z dużą ilością ścianek.

Cytuj
niby coś się tworzy ale po bliższych oględzinach nie jest to prawidłowo policzone. Kiedy powierzchnie są płaskie typu kostka jest ok. ale po dodaniu jakiś skosów/spadów kątów itp. rzeczy zaczyna się dziać kosmos.

Nie wiem jak mam rozumieć ten kosmos, ale jak chcesz odwzorować dość dokładnie kształt to możesz przesłać siatkę obiektu i utworzyć obiekt klasy btBvhTriangleMeshShape. Bardziej wydajnym rozwiązaniem byłoby utworzenie obiektu kolizyjnego btCompoundShape, który przechowuje wskaźniki do  innych prostszych obiektów kolizyjnych. Dzięki temu możesz w jakimś edytorze (np. Blender) powstawiać na scenę proste bryły (sfery,boxy,cylindry) i spiąć je razem w jeden większy skomplikowany obiekt kolizyjny.

Blender używa bulleta więc można testować te rozwiązania w jego symulatorze fizyki. Żeby skonwertować to na własny kod to można ponazywać obiekty i wyeksportować ich dane, np. BOX_Cube.001, SPHERE_Mesh.002, CHULL_Mesh, CYLINDER_Mesh, itp. oraz ich pozycję i rotację na scenie. Na podobnej zasadzie tworzy się kolizję dla UDK, proste i skuteczne rozwiązanie :)

Offline prociomen007

  • Użytkownik

# Kwiecień 08, 2012, 14:51:47
Dzięki śliczne z poradę udało mi się jednak ciut przed tobą znaleźć w sieci zadowalające informacje. Jeśli ktoś by potrzebował to działa to tak:

 - Convex hull ze zbioru podanych punktów tworzy swój uproszczony kształt! Ważne jest tu słowo uproszczony przez co traci on dokładność. Nie można stosować tej metody do tworzenia obiektów typu ziemia gdzie liczy się dokładność gdyż zniekształci ona nam zamierzony kształt.

- btBvhTriangleMeshShape nadaje się tutaj znacznie lepiej i dokładnie odwzorowuje podany kształt jednak nadaje się tylko do obiektów statycznych. Po za tym mocno pożera zasoby przy skomplikowanych kształtach.

W ruchu tak to wygląda : http://warsztat.gd/video/1144

Offline lukasyno

  • Użytkownik

# Kwiecień 08, 2012, 15:11:41
fajne,  szkoda ze nie udostepniasz pliku .apk, mozna by zobacyzc jak to w praktyce dziala(chociazby FPS)..

Offline prociomen007

  • Użytkownik

# Kwiecień 08, 2012, 15:16:33
Plik .apk zostanie udostępniony  - mam to w planach -. Muszę jednak usunąć wszelakie bugi.

Offline voytech

  • Użytkownik

# Kwiecień 09, 2012, 21:54:19
- btBvhTriangleMeshShape nadaje się tutaj znacznie lepiej i dokładnie odwzorowuje podany kształt jednak nadaje się tylko do obiektów statycznych. Po za tym mocno pożera zasoby przy skomplikowanych kształtach.

Dlatego warto stworzyć uproszczoną na maksa siatkę, która posłuży jako siatka kolizyjna :). Bullet tworzy później z podanych trójkątów strukturę drzewiastą, którą da się serializować na dysk gdy np. nie chcemy za każdym razem przechodzić przez ten proces z powodów powiedzmy wydajnościowych.

Widzę że na filmiku jest tam jakiś teren i z tego co widzę bullet ma klasę btHeightfieldTerrainShape, może warto i tego spróbować.