Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[opengl] kolizja z obracajaca sie przeszkoda

Ostatnio zmodyfikowano 2010-11-18 23:55
Autor Wiadomość
dmx81
Temat założony przez niniejszego użytkownika
[opengl] kolizja z obracajaca sie przeszkoda
» 2010-11-16 10:29:14
witam,zastanawiam sie nad takim problemem: mam obiekt zlozony z linii laczacych wierzcholki,ktorych wspolrzedne sa w tablicach. Drugi obiekt porusza sie po scenie,wykrywana jest kolizja i odbicie(na podstawie wsp.wierzcholkow w tablicach) i tak dziala dobrze. Chce troszke ozywic scene,wprowadzajac obracajaca sie przeszkode i mam pytanie,jesli obroce ja przez glRotate,wczesniej glPushMatrix,pozniej glPopMatrix, w ktorym miejscu sprawdzac kolizje(tzn czy wsp.wierzcholkow ulegna zmianie i pilka bedzie widziala przeszkode na nowych wspolrzednych,czy tylko narysowana bedzie przeszkoda jako obrocona,a pilka odbije sie od powietrza:starych wspolrzednych) mam nadzieje,ze rozumiecie o co mi chodzi
P-24053
DejaVu
» 2010-11-16 16:12:47
Zadam Ci prostsze pytanie. Wyobraź sobie:
1) Masz ścianę reprezentowaną przez linię {(0,0),(10,0)}.
2) Masz pocisk w postaci okręgu o promieniu 0.5 na pozycji (5,-1).
3) Pocisk ma prędkość 1000000 i jest skierowany w kierunku osi y
4) Jak wykryjesz kolizję, skoro pozycja po wykonaniu przemieszczenia dla piłki wynosi (5,999999)?

Czegokolwiek nie wymyślisz będzie to rozwiązanie zawsze przybliżone. Pozostaje tylko kwestia jak rozwiążesz przybliżenia by Twoja gra funkcjonowała efektywnie przy większej liczbie obiektów na scenie.
P-24059
dmx81
Temat założony przez niniejszego użytkownika
» 2010-11-16 19:50:05
ten przyklad rozumiem - tu bym poprostu liczyl odleglosci przy kazdym ruchu do kazdej przeszkody (to pewnie by bylo odpowiednio zoptymalizowane - nie wszytskich na scenie, ale w zasiegu ruchu czy jakos tak) ale nie o to mi chodzi tutaj - pilka nie mija jako takiej przeszkody - ale widzi ja w miejscu innym, niz jest ona narysowana (widzi ja w miejscu, gdzie byla przed przeksztalceniem)
a konkretniej:

prostokat  a(0,0)b(2,0)c(2,1)d(0,1) - pilka (x,y), pilka w ruchu, jesli odl. srodka od linii mniejsza niz promien, znaczy sie ze kolizja - to tak oczywiscie w skrocie, bo duzo wiecej warunkow itd... teraz pojawia sie obrot - jesli wcisne spacje, protokat obracam o kat 45st - przez funkcje glRotatef - na ekranie widze przekrecony prostokat, jednak pilka nie odbija sie od tego, co widze na ekranie, ale odbija sie w miejscu, jakby prostokat wciaz byl w poprzedniej pozycji (czyli przelatuje przez sciany narysowanego, a odbija sie od "powietrza"

funkcja wykrywania kolizji bazuje na wierzcholkach x,y - podaje pkt A i B - licze odleglosc punktu od sciany itd - dla nieruchomych scian jest ok - ale jak porusze sciane (w moim wypadku sciany - caly prostokat) to pilka i tak nie widzi ze sie przesunal - czy musialbym jakos aktualizowac wspolrzedne prostokatna zapisane w tablicy i dla nich sprawdzac kolizje?  wciaz nie wiem, czy jasno sie wyrazam o co mi chodzi
C/C++
glPushMatrix();
glRotatef( kat, 0, 1, 0 );
prostokat.rysuj(); // prostokat - rysowany w zaleznosci od kata obrocony lub nie
glPopMatrix();
sciany.rysuj(); // rysuje sciany wkolo pilki - otoczenie
pilka.kolizja( wektor ); // sprawdzam kolizje dla wszytskich scian(par wierzcholkow)
pilka.ruch(); // ustawiam wektory ruchu itd
pilka.rysuj(); // rysuje pilke
to kod "mniej wiecej" - pokazujacy sens dzialania - czy funkcja kolizja widzi przesuniete wspolrzedne, czy raczej powinienem sprawdzac w momencie zanim przywroce macierz po obrocie - ale wtedy jak bedzie widziana moja pilka - bo funkcja kolizja bierze naturalnie tazke pozycje pilki...

dopiero wrocilem z pracy, wiec dopiero bede zaraz sam sprawdzal rozne rozwiazania, a pytanie wyslalem wlasnie z pracy rozmyslajac o roznych mozliwosciach :) sam przed zadaniem pytania wole sam przeszukac wszytskie mozliwosci - ale nie mialem mozliwosci, a odpisalem dlatego, ze widze, ze chyba nie wytlumaczylem dokladnie tego, co chcialem, bo rozumiem sens odpowiedzi jaka uzyskalem - ale nie o to pytalem


ps>> wyprobowalem pare rozwiazan i ciagle to samo, mimo obrocenia prostokatu, pilka wciaz widzi stare polozenie, a nie to narysowane - wydaje mi sie, ze zamiast korzystac z glRotatef() trzeba bedzie przemnozyc wspolrzedne przez odpowiednia macierz obrotu...
P-24071
dmx81
Temat założony przez niniejszego użytkownika
» 2010-11-16 21:00:52
C/C++
void button::ustaw_wsp()
{
    float tx, ty;
    kat = 45;
   
    for( int i = 0; i < 4; i++ )
    {
        tx = tabx[ i ];
        ty = taby[ i ];
        tabx[ i ] = tx * cos( kat * 3.14159 / 180 ) - ty * sin( kat * 3.14159 / 180 );
        taby[ i ] = tx * sin( kat * 3.14159 / 180 ) + ty * cos( kat * 3.14159 / 180 );
       
    }
}

dziala - pilka odbija sie od nowych wspolrzednych, ale zastanawiam sie teraz :

rysujemy rozne obiekty - tworzac je tworzymy w osobnych ukladach wspolrzednych (nie rozmieszczone od razu na jednym ukladzie w przestrzeni) - np kazdy znajduje sie od -1 do 1 w x,y i z - dopiero pozniej umieszczamy to na scenie przez glTranslate3f() - ale szukajac kolizji - jakich wspolrzednych szukac, tzn jak uzyskac globalne wpolrzedne - bo wspolrzedne w tablicach wierzcholkow beda takie same dla tych samych rodzajow obiektow (chociaz inaczej sa rozmieszczone na scenie) - bo szescian na z=-2 i ten na -20 bedzie mial takie same wspolrzedne w tablicy wierzcholkow, wiec tej tablicy nie moge podac jako argumentow dla kolizji no nie? chyba ze kazda ze wspolrzednych trzeba jako przemnozone argumenty podac? to takie moje rozwazania, bo moze ktos wieksza praktyke ma, ja dopiero zaczynam sie tym "bawic"

ps>> sorki ze sie tak rozpisalem - ale jak widac, zagadnienie obszerne :)

udalo mi sie tez pare innych rzeczy, tak jak wyzej napisalem, tablice wierzcholkow podaje do funkcji kolizji zmienione, tzn przeksztalcone o wektor przesuniecia - glTranslatef(1,0,-1), wiec kolizja(tabx[0]+1,0,tabz[0]-1) - cos w tym stylu. nie wiem, czy tak jest "prawidlowo" z punktu widzenia bardziej doswiadczonych gl-koderow:)
P-24078
DejaVu
» 2010-11-17 09:22:04
Myślę co Ci napisać ale na razie witki mi opadły... może później coś Ci napiszę, choć nie mam weny do tego.
P-24086
dmx81
Temat założony przez niniejszego użytkownika
» 2010-11-17 17:30:28
ok rozumiem :) nie da sie tu odpowiedziec tak, nie lub cos konkretnego, bo nie ma konkretnego pytania, poprostu bede cwiczyl :) a jak sie na czyms zatne to bede konkretnie pytal, poki co niezle idzie:) dzieki i pozdr.
P-24095
DejaVu
» 2010-11-17 18:13:31
Wyobraź sobie:
1) Masz model obiektu (np. sześcian).
2) Ten model umieszczasz w 5 miejscach na scenie i każdy obrócony jest o inny kąt.
Ile obiektów jest na scenie? Jakie z tego płyną wnioski w nawiązaniu do kolizji?
P-24096
dmx81
Temat założony przez niniejszego użytkownika
» 2010-11-17 23:26:59
jest 5 obiektow ( maja te same tablice wierzcholkow - wiec te same wspolrzedne)
te 5 obiektow rozmieszcza sie po scenie przez glPushMatrix(), glTranslatef(x,y,z) - tu kazdy obiekt bedzie mial inne wartosci x,y,z,  rysowanie, po czym powrot glPopMatrix()
a kolizje bedziemy liczyli dla tablicy wierzcholkow - ale przeksztalconych o w/w wektor przesuniecia dla kazdego oczywiscie odpowiednio wg przeksztalcenia (najlepiej chyba utworzyc klase, zawierajaca macierz przeksztalcenia(tzn wartosci x y z na jakich ma sie znalezc dany obiekt na mapie i te wartosci brac do sprawdzania kolizji)

czy dobrze mysle? dzis nie bylo kiedy pocwiczyc... trening, pozniej mecz Polakow (3-1) :)
P-24105
« 1 » 2
  Strona 1 z 2 Następna strona