Skocz do zawartości


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


8 odpowiedzi w tym temacie

#1 raV

    Starszy bywalec

  • Użytkownicy
  • 97 Postów:

Napisano sob, 21 maj 2011 - 18:10

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?

#2 Stelma

    Starszy bywalec

  • Super użytkownicy
  • 103 Postów:
  • Gadu-Gadu:4588140

Napisano nie, 22 maj 2011 - 18:15

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 biggrin.gif

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ą)

#3 raV

    Starszy bywalec

  • Użytkownicy
  • 97 Postów:

Napisano nie, 22 maj 2011 - 20:02

A, powinno to wynikać z użytego słownictwa, ale problem dotyczy przestrzeni 3D.

Póki co będzie brutal. Trudno.

#4 Integer

    Pomocna dłoń

  • Moderatorzy
  • 191 Postów:
  • Gadu-Gadu:6888400

Napisano nie, 22 maj 2011 - 21:58

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.

#5 Blind

    Dzień dobry

  • Moderatorzy
  • 1057 Postów:

Napisano pon, 23 maj 2011 - 10:09

Jest kilka algorytmów do podziału przestrzeni, jednym z prostszych i wystarczających jest np. "drzewo ósemkowe".

#6 raV

    Starszy bywalec

  • Użytkownicy
  • 97 Postów:

Napisano pon, 23 maj 2011 - 20:51

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

#7 Toster

    Archon

  • Moderatorzy
  • 1885 Postów:
  • Gadu-Gadu:posiadam

Napisano wto, 24 maj 2011 - 07:38

x = sin( a ) * cos( B ) * r
y = sin( a ) * sin (B ) * r
z = cos( a ) * r

pisane z pamięci, sprawdź sobie wzór na transformacje do układu sferycznego z układu kartezjańskiego.

#8 raV

    Starszy bywalec

  • Użytkownicy
  • 97 Postów:

Napisano wto, 24 maj 2011 - 14:39

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

#9 Spider100

    Pomocna dłoń

  • Super użytkownicy
  • 293 Postów:
  • Gadu-Gadu:8249331

Napisano śro, 25 maj 2011 - 17:10

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 tongue.gif