Jak wykonuje się wykrywanie kolizji na obiektach wykonanych z wielu małych trójkątów?
13
Rozumiem, że każdy kształt może być utworzony (lub przybliżony) przez mniejsze trójkąty. Dowolny prostokąt można utworzyć za pomocą 2 mniejszych trójkątów. Dowolne koło można utworzyć za pomocą wielu cienkich trójkątów „plasterka pizzy”. Jak to się przekłada na wykrywanie kolizji?
Rozumiem, jak obliczyć nachylenie prostokąta za pomocą wierzchołków. Rozumiem, jak obliczyć nakładanie się koła za pomocą środka, promieni i odległości.
Ale w jaki sposób wykrywa się kolizję na kształtach wykonanych z małych trójkątów? Nie konkretne, ale tylko ogólna koncepcja ...
Ale w jaki sposób wykrywa się kolizję na kształtach wykonanych z małych trójkątów?
Nie robiąc tego.
Wykrywanie kolizji z dowolną kolekcją trójkątów (lub, co gorsza, między dwiema kolekcjami dowolnych trójkątów) jest zbyt drogie.
Zamiast tego zwykle wykrywamy kolekcję w sposób zhierarchizowany, zaczynając od niezwykle prostych, prostych kształtów (takich jak pudełka lub kule), które przybliżają (słabo) obiekt leżący pod spodem.
To pozwala nam szybko odrzucić większość potencjalnych kolizji jako „nie występujące”, co jest typowym przypadkiem. W przypadku, gdy taki prymitywny test mija, co wskazuje na potencjalne rzeczywiste zderzenie, a my przystępujemy do wykonania kontroli w oparciu o bardziej szczegółowe przybliżenie podstawowego kształtu (takiego jak ten wykonany z wielu ciasno dopasowanych kształtów kapsułek lub wielu wyrównane ramki graniczne).
Zasadniczo wykrywanie kolizji rozpoczyna się od prymitywnych testów, a wraz z tymi testami przechodzi do coraz bardziej szczegółowej reprezentacji. Ten obraz, dostarczony przez Shiro w komentarzu do odpowiedzi Alexandre'a , ilustruje, w jaki sposób model złożony (człowiek) może być reprezentowany przez szereg prostszych kształtów:
Rzadko mamy rzeczywiście trzeba wykonać kolizji na poziomie indywidualnym trójkąta, a gdy robimy my zwykle stosowane metody cruder drążyć do bardzo małej grupy potencjalnych trójkątów do testu przeciw. W tym momencie do wykonania testów używane są określone algorytmy, tak jak w przypadku, gdyby dwa prostokąty zachodziły na siebie. Na przykład możesz określić, czy i gdzie promień uderza w trójkąt .
Dzięki. Tak, gdybym tworzył grę, użyłbym tylko istniejącego silnika. Chcę tylko zrozumieć podstawowe pomysły, które są wdrażane we wcześniej przygotowanym silniku wykrywania kolizji. Na powyższym diagramie użyłbyś matematyki prostokątnej, aby sprawdzić, czy coś dotyka ŻADNEGO z dziesiątek prostokątów, które składają się na mężczyznę. Czy to podstawowy pomysł?
JackOfAll
Są to zorientowane ramki ograniczające (3D), a nie prostokąty. Ale tak. Gdybym miał sprawdzić, czy promień (reprezentujący, powiedzmy, pocisk) zderzył się z graczem, testowałbym promień na tych polach - być może po pierwszym testowaniu na jednym gigantycznym polu reprezentującym całą postać - nie przeciwko każdemu trójkąt siatki renderowania).
Chodzi o to, że możesz użyć przybliżonego przybliżenia postaci, takiego jak zorientowane ramki graniczne pokazane na powyższym obrazku, i przetestuj to najpierw, aby wykonać tańszy test trafienia, a jeśli dojdzie do kolizji, przejdź do niższego poziomu JEŚLI KONIECZNE, testowanie pojedynczych trójkątów zawartych w obwiedni. Zazwyczaj może być używanych kilka różnych BV w sposób hierarchiczny, przy czym zewnętrzny jest mniej dokładny, ale najszybszy do przetestowania (kula, obwiednia) i drążenie w dół do czegoś bardziej konkretnego (k-DOP), a potencjalnie drążenie w dół jeszcze bardziej (trójkąty )
Kik
4
Wykrywanie kolizji opiera się na geometrii (prymitywy, takie jak linia, płaszczyzny, kule, pudełka, kapsułki, cylindry).
Jeśli chcesz wykonać wykrywanie kolizji na kształtach wykonanych z trójkąta, na przykład na terenie, który nie jest płaski, musisz przetestować wszystkie trójkąty tworzące siatkę.
Jeśli dojdziesz do tego punktu, zdecydowanie zalecam użycie gotowego silnika do wykrywania kolizji, ponieważ tego rodzaju rzeczy stają się dość złożone, dość szybkie.
Jak wykrywasz kolizję na kształtach złożonych z trójkątów?
JackOfAll
@JackOfWszystko już wspomniał, że w swojej odpowiedzi jest to za pomocą kształtów geometrycznych zwykle i.stack.imgur.com/CAhxn.jpg
dimitris93
@JackOfAll Zredagowałem moją odpowiedź; i jak mówi Shiro, jeśli masz bardziej złożone „przedmioty” w swoim otoczeniu (ciała, krzesła, samochody itp.), w rozwoju gry są one zwykle wykonane z prostszych, powiązanych ze sobą prymitywów. Wykrywanie zderzeń odbywa się na prymitywnych kształtach, ale symulacja fizyki jest następnie wykonywana na całym ciele.
Vaillancourt
4
Nie dosłownie próbuję stworzyć grę, chcę tylko zrozumieć podstawowe pomysły, które są implementowane w gotowym silniku wykrywania kolizji. Zgadzam się, że gdybym rzeczywiście tworzył grę, to na pewno nie wymyśliłbym koła.
Wykrywanie kolizji opiera się na geometrii (prymitywy, takie jak linia, płaszczyzny, kule, pudełka, kapsułki, cylindry).
Jeśli chcesz wykonać wykrywanie kolizji na kształtach wykonanych z trójkąta, na przykład na terenie, który nie jest płaski, musisz przetestować wszystkie trójkąty tworzące siatkę.
Jeśli dojdziesz do tego punktu, zdecydowanie zalecam użycie gotowego silnika do wykrywania kolizji, ponieważ tego rodzaju rzeczy stają się dość złożone, dość szybkie.
źródło