[C++] Odbicie wektora od powierzchni

Awatar użytkownika
Livo
Użytkownik
Użytkownik
Posty: 2
Rejestracja: 16 cze 2010, o 23:55
Płeć: Mężczyzna
Lokalizacja: Białystok

[C++] Odbicie wektora od powierzchni

Post autor: Livo »

Witam. Próbuję zaimplementować odbicie obiektu od statycznej powierzchni. Posługuje się geometrią 3d, jednak w tym przypadku sytuacja wymaga jedynie wymiarów x i z.

Rysunek przestawiający problem:

Posiadam kąt oznaczony jako alpha, wektor padający na powierzchnię (w tym przypadku odcinek) oraz wektor normalny powierzchni, od której następuje odbicie. Potrzebą wyznaczyć kąt eta oraz wektor po odbiciu.

Mój algorytm:
1. Wyliczam kąt pomiędzy wektorem padającym, a wektorem normalnym powierzchni.
2. Podwajam go.
3. Początkiem wektora odbitego jest koniec wektora padającego.
4. Koniec wektora odbitego wyliczam z obrotu początku wektora padającego o wcześniej wyliczony kąt względem punktu styczności wektorów oraz powierzchni.
5. Wyliczam kąt eta wiedząc, że tg eta = wsp. a w prostej leżącej na znalezionym wektorze w poprzednim punkcie.

Niestety już w 4. punkcie mam jakiś błąd. Wiem czy to wina algorytmu, wzorów czy też kodu. Może ktoś będzie wstanie mi pomóc

Kod: Zaznacz cały

v1.x = sin(alfa) * i;
v1.z = - cos(alfa) * i;
dp1 = v1.x * v3.lx + v1.z * v3.lz;
gamma = acos(dp1 / i * 2);
#v1.B.x - dane (ostatni punkt ruchu obiektu przed detekcją kolizji)
#v1.B.z - dane (ostatni punkt ruchu obiektu przed detekcją kolizji)
v1.A.x = x - v1.x;
v1.A.z = z - v1.z;
v2.A.x = v1.B.x;
v2.A.z = v1.B.z;
v2.B.x = (v1.A.x - v2.A.x) * cos(2*gamma) + v2.A.x - (v1.A.z - v2.A.z) * sin(2*gamma) + v2.A.z;
v2.B.z = (v1.A.x - v2.A.x) * sin(2*gamma) + v2.A.x + (v1.A.z - v2.A.z) * cos(2*gamma) + v2.A.z;
Oznaczenia:
v1 - wektor padający:
  • v1.A - początek wektora padającego
  • v1.B - koniec wektora padającego
  • v1.A.x - współrzędna iksowa początku wektora padającego
  • v1.A.y - współrzędna igrekowa początku wektora padającego
  • v1.B.x - współrzędna iksowa końca wektora padającego
  • v1.B.y - współrzędna igrekowa końca wektora padającego
  • v1.x - współrzędna iksowa wektora padającego
  • v1.y - współrzędna igrekowa wektora padającego
v2 - wektor po odbiciu:
  • v1.A - początek wektora odbitego
  • v1.B - koniec wektora odbitego
  • v1.A.x - współrzędna iksowa początku wektora odbitego
  • v1.A.y - współrzędna igrekowa początku wektora odbitego
  • v1.B.x - współrzędna iksowa końca wektora odbitego
  • v1.B.y - współrzędna igrekowa końca wektora odbitego
  • v1.x - współrzędna iksowa wektora odbitego
  • v1.y - współrzędna igrekowa wektora odbitego
v3 - wektor normalny powierzchni, od której następuje odbicie
  • v3.lx - współrzędna iksowa wektora normalnego powierzchni, od której następuje odbicie
  • v3.ly - współrzędna igrekowa wektora normalnego powierzchni, od której następuje odbicie
gamma - kąt między wektorem padającym, a wektorem normalnym powierzchni, od której następuje odbicie
i - długość wektora padającego oraz odbitego
szerokość powierzchni = 2
Awatar użytkownika
Sokół
Użytkownik
Użytkownik
Posty: 451
Rejestracja: 17 wrz 2006, o 19:22
Płeć: Mężczyzna
Lokalizacja: Zielona Góra
Podziękował: 15 razy
Pomógł: 55 razy

[C++] Odbicie wektora od powierzchni

Post autor: Sokół »

v1.x = sin(alfa) * i;
v1.z = - cos(alfa) * i;
jesteś pewien, że to jest dobrze? Albo jeszcze rano mózg mi nie funkcjonuje, albo ma być x=i*cos(alfa), z=sin(alfa)*i - jeśli uwzględnimy zwrot osi z-etów, strzałka w dól jest celowo narysowana, wartości na osi rosną w dół?

To tak na pierwszy rzut oka. Spróbuj testować kolejne podpunkty i weryfikuj je z obliczeniami na kartce.
Awatar użytkownika
Livo
Użytkownik
Użytkownik
Posty: 2
Rejestracja: 16 cze 2010, o 23:55
Płeć: Mężczyzna
Lokalizacja: Białystok

[C++] Odbicie wektora od powierzchni

Post autor: Livo »

Sokół pisze:
v1.x = sin(alfa) * i;
v1.z = - cos(alfa) * i;
jesteś pewien, że to jest dobrze? Albo jeszcze rano mózg mi nie funkcjonuje, albo ma być x=i*cos(alfa), z=sin(alfa)*i - jeśli uwzględnimy zwrot osi z-etów, strzałka w dól jest celowo narysowana, wartości na osi rosną w dół?

To tak na pierwszy rzut oka. Spróbuj testować kolejne podpunkty i weryfikuj je z obliczeniami na kartce.
Celowo wartości zetów rosną w dół. Tak wygląda to w opengl'u (zasada prawej ręki). Dlatego też sin zamieniam z cos i cos z sin. Poza tym zgadza się podczas normalnego ruchu (bez kolizji).
ODPOWIEDZ