Jump to content

Kolizje - sposoby na sprawdzanie kolizji. Rzutowanie punktu na płaszczyzny 3D


raV

Recommended Posts

Witajcie

 

Jak mając N powierzchni (trójkątów) sprawdzić przecięcia? bo można przez poprowadzenie pół-prostej z punktu P i chcę stwierdzić, którą powierzchnię przetnę jako pierwszą. Zadanie jak dla Z-bufora, ale potrzebuje rozwiązanie analityczne.

 

Ja mam bardzo doskonały pomysł brute-force: sprawdzić przecięcie z każdą powierzchnią i tyle.

 

Macie jakieś pomysły?

Link to comment
Share on other sites

Jedyny pomysł jaki mi przychodzi do głowy to potraktować ekran jako układ współrzędnych z ćwiartki I jak dobrze pamiętam. I sprawdzić czy prosta o równaniu y = ax + b przetnie się z odcinkiem |AB| później |A'B'| itd jednak to w sumie również jest brutalem jechane :D

 

O tyle dobre że jeżeli odcinek będzie miał taki sam współrzędnik a to wiadome że się nigdy nie przetnie z półprostą (zakładając iż się nie nakładają)

Link to comment
Share on other sites

A ja się podepnę pod temat bo interesują mnie kolizje z obiektami, i wykrywanie która płaszczyzna została "przecięta" przez prosta lub przez inną płaszczyznę,

opiszę obrazowo:

mam np. płot a sztachety i słupki to prostopadłościany pionowe (dla uproszczenia) oraz dwa poziome prostopadłościany - rygle do których sztachety są przybite.

"Macham" teraz okręgiem (zbudowanym z 20 odcinków) który symuluje siekierę i trafia losowe jeden lub kilka sztachet, "przecina na wylot lub tylko nacina, zarysowuje"

Pytanie o najszybszy możliwy sposób na sprawdzenie:

1. na których prostopadłościanach jedna ze ścian została przecięta nie koniecznie cała bo może być nacięta w poprzek sześcianu jedna , dwie, wszystkie cztery krawędzie

2. lub jeśli ostrze pójdzie wzdłuż to krawędzie nie będą ruszone a jednak ostrze przetnie płaszczyznę.

 

Czy można zastosować jakieś uogólnienie, bo wydaje mi się że sprawdzanie przecięcia każdej krawędzi (odcinka) przy dużej ilości tych elementów może znacząco spowolnić symulację .. bo nie będzie to tylko niszczenie jednego płotu czy wybijanie (trafianie) w cegły w ścianie żeby zrobić dziurę. Taka cegła w ścianie 3D uderzona np 10 razy stopniowo znikała by jako niszczona, różna siłą (głębokością) uderzeń.

Chyba że macie prostszy sposób na sprawdzanie tego.

Link to comment
Share on other sites

Czy ktoś ma takie matematyczne umiejętności, by podać mi wzór na punkt leżący na pół-sferze (zaznaczony na obrazku). Chodzi o to, by parametryzując alfa i betha (0,180) móc otrzymać współrzędne punktu.

 

Obrazek

Link to comment
Share on other sites

Dzięki Toster, o to mniej więcej mi chodzi, niestety tylko mniej więcej. We wzorach algebraicznych nie znalazłem zależności na płaszczyznę, na której leży punkt.. Ilustruje to zmieniony rysunek.

Generalnie możemy założyć, że mamy dane 3 punkty z płaszczyzny -> stąd płaszczyznę da się wyznaczyć. Mamy też normalną (określa która pół-przestrzeń nas interesuje). Wszystko w kolorze niebieskim na rysunku.

Płaszczyzna nie musi być równoległa do niczego, czerwony punkt w srodku pol-sfery niech będzie np. srodkiem ciezkosci tego trójkąta.

I jak coś takiego właśnie ugryźć?

 

 

Obrazek

Link to comment
Share on other sites

Jeśli chodzi o to by punkt był ustawiony lokalnie względem jakiejś płaszczyzny to za mało danych nadal masz by to wyznaczyć.

 

należy wyznaczyć macierz przekształcenia:

http://www.songho.ca/opengl/files/gl_anglestoaxes01.png

 

Potrzeba trzech wektorów bazowych określający lokalny układ wsp. są to np Front,Up,Left . Powiedzmy że Up to normalna trójkąta musisz dobrać do tego pozostałe dwa np Front to jedna z krawędzi a Left to iloczyn wektorowy dla Up i Front. Ostatecznie te trzy wektory tworzą macierz obrotu układu współrzędnych (nazwijmy mR)

Druga macierz to translacja która jest określona przez punkt P (nazwijmy mT)

 

P' będzie punktem względem płaszczyzny która nas interesuje

P' = (P(???) * mR) * mT

 

Mniej więcej tak to wygląda, możliwe że kolejność mnożeń pomyliłem ale sama koncepcja ok :P

www.spider.dathox.com :)

Link to comment
Share on other sites

Archived

This topic is now archived and is closed to further replies.

×
×
  • Create New...