Autor Wątek: Bounding - kilka pytań  (Przeczytany 776 razy)

Offline deniol

  • Użytkownik

# Listopad 10, 2011, 18:36:02
Witam, mam kilka pytań.

Bounding Spheres czy inne odmiany boundów [nie wiem jak to się po Polsku nazywa] służą do tego aby sprawdzić CZY JEST PRAWDOPODOBIEŃSTWO zderzenia dwóch obiektów, jeśli tak to wykonujemy kod, który sprawdza czy i gdzie ta kolizja nastąpiła i mam pytanie też do tej części.

Powiedzmy, że mam Mesh [około 3000 vertexów czyli 100 trójkątów], to jak wiem, że jest możliwość kolizji dwóch obiektów to jak mam sprawdzać KTÓRE vertexy ze sobą kolidują? Mam przelecieć przez Vertex A meshu A' i sprawdzać wszystkie vertexy B meshu B' ?

tzn. pseudokod

if( mozliwa_kolizja )
{
cialo a;
cialo b;

for( int i = 0; i <= a.IleVertexow(); i++ )
{
     for( int x = 0;x <= b.IleVertexow(); x++ )
     {
          if( b.vertex_B koliduje_z a.Vertex_A )
          {
          return KOLIZJA;
          }
     }
}
}

To chyba nie jest najlepsze rozwiązania bo pewnie bardzo obciąża procesor jak mamy np dwa modele o dużej liczbie vertexów...

Offline Mr. Spam

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

Offline Asmodeusz

  • Użytkownik
    • Bogumił Wiatrowski: Blog

# Listopad 10, 2011, 18:48:25
Skoro masz sprawdzoną kolizję na podstawie BSphere/BBox, to obliczenia możesz zrobić na zbiorach trójkątów:

AVerts = a.VertsCollidingWith(b.BoundingBox);
BVerts = b.VertsCollidingWith(a.BoundingBox);
foreach(a in AVerts) foreach(b in BVerts) if(collide(a,b)) kolizja();

EDIT: nie doczytałem, o wierzchołki biega. Jednak realnie i tak kolizje liczy się na wielokątach/bryłach. Użyj AABB/BSphere do zminimalizowania listy trójkątów do sprawdzenia.

Offline Reg

  • Administrator
    • Adam Sawicki - Home Page

# Listopad 11, 2011, 15:02:29
Wydaje mi się, że nieczęsto potrzeba sprawdzać kolizję między dwiema siatkami trójkątów. Do czego ci to potrzebne? Bohater gry zawadzi wyciągniętą ręką, mieczem albo karabinem o futrynę to nie przejdzie przez drzwi? Niefajny feature. Częściej chyba wystarczy poprzestać na sprawdzeniu kolizji tych brył otaczających (tak bym przetłumaczył bounding volumes) albo kolizji jakiejś prostej figury z siatką. To ostatnie przydaje się na przykład podczas liczenia czy wystrzelony pocisk trafił w potwora i w którą jego część. Tu tą figurą będzie promień (ang. ray), czyli półprosta.

Sprawdzenie kolizji z siatką trójkątów faktycznie polega na sprawdzeniu jej kolejnych trójkątów, ale żeby nie przechodzić wszystkich to można tą siatkę podzielić jakąś techniką podziału przestrzeni, np. drzewem ósemkowym (ang. octree), BSP albo k-d tree.

Sytuacja komplikuje się kiedy postać jest animowana, ale tu znowu można uprościć sprawę opisując kończyny prostymi bryłami otaczającymi np. kapsułą i poprzestać na testowaniu kolizji z nimi.

Offline bartekm

  • Użytkownik
    • Wordpress Blog

# Listopad 11, 2011, 15:41:54
W niektórych grach np. w GTA 3 rozwiązano to tak, ze każdy modelowi przypisuje się dziesiątki bounding sphere, które są ułożone tak, by optymalnie opisywały kształt modelu. Kto grał w GTA widział jak dobrze spisywał się ten sposób sprawdzania kolizji. Np w Vice City miałem sytuację, gdy nie mogłem polecieć helikopterem, bo śmigło przy próbie rozpędzenia uderzało w latarnie obok i silnik nie odpalał:). Można też stworzyć alternatywny do pełnego modelu very low poly model (do 256 trójkątów) i sprawdzać na nim kolizje trójkąt po trójkącie (tak kolizje są zrobione np. w PhysX).