2010-11-10 7 views
6

Aktualnie próbuję użyć OpenGL (z SDL), aby narysować sześcian w miejscu, w którym kliknąłem lewym przyciskiem myszy na ekranie, a następnie ustawić go na ekranie wskaż pozycję na ekranie, na którą kliknę prawym przyciskiem myszy.Znaleźć kąty dla osi X, Y i Z w 3D - OpenGL/C++

Mogę z powodzeniem narysować kostkę w wybranym miejscu za pomocą gluUnproject - Znaczenie znam już współrzędne, z których moja kostka się znajduje.

Jednak nie wiem, jak obliczyć wszystkie kąty wymagane, aby mój punkt kostki w nowej lokalizacji.

Oczywiście nadal używam gluUnproject, aby znaleźć współrzędne mojego prawego kliknięcia, ale wiem tylko, jak obracać wokół osi Z z wykorzystaniem grafiki 2D.

Na przykład wcześniej, gdybym chciał obrócić kwadraturę wokół osi Z (Oczywiście byłby to widok z góry na dół, gdzie oś Z wciąż "przechodzi" przez ekran) w 2D, zrobiłbym coś takiego :

angle = atan2(mouseCoordsY - quadPosY, mouseCoordsX - quadPosX); 
glRotatef(angle*180/PI, 0, 0, 1); 

Moje pytanie brzmi: jak mam to zrobić w 3D?

  • Czy muszę obliczać kąty dla każdej osi, tak jak powyżej?
  • Jeśli tak, to jak obliczyć kąt obrotu wokół osi X i Y?
  • Jeśli nie, jakiej metody należy użyć, aby osiągnąć pożądane wyniki?

Każda pomoc jest bardzo doceniana.

+0

Jak określić współrzędna reprezentowany przez każde kliknięcie myszą? Jeśli po prostu ustawisz na 0, wystarczy geometria 2D i domyślam się, że to nie jest twój zamiar. –

+0

Kliknięcie w przestrzeni 3D powinno definiować promień, a nie punkt. Jestem ciekawy, w jaki sposób udało ci się zlokalizować kostkę. – tafa

+0

@Marcelo Cantos: Przebacz mi, jeśli źle zrozumiałem twoje pytanie, ale jestem nowy w tym i dlatego, chociaż myślę, że wiem, o co prosisz, może nadal mam zły pomysł.Zasadniczo, jeśli moja kostka znajduje się w (100, 200, 300) i klikam (400, 500, 600), potrzebuję znaleźć kąty, w których potrzebuję obrócić kostkę, aby spojrzeć na drugi zestaw współrzędne. –

Odpowiedz

9

Jeśli kostka jest przy A = (X0, Y0, Z0)

Jeśli kostka jest obecnie patrząc na B = (x1, y1, z1)

a jeśli chcesz to patrzeć C = (x2, y2, z2);

Let V1 być wektor z punktu A do punktu B

V1 = B - A

V2 jest jeden z A na C

V2 = c - a

pierwsze normalizacji im.

v1 = v1/|v1| 
v2 = v2/|v2| 

następnie obliczyć kąt obrotu i oś obrotu jako

angle = acos(v1*v2) //dot product 
axis = v1 X v2 //cross product 

Można zadzwonić glRotate z

glRotate(angle, axis[0], axis[1], axis[2]) 
+0

Bardzo dziękuję za tę odpowiedź tafa! Szukałem samouczków i innych zasobów w tej sprawie przez ostatnie kilka dni i testowałem produkty z kropkami itp., ale ponieważ dopiero co przyszedłem z 2D, nie miało to dla mnie większego sensu, ale twoja odpowiedź wyjaśniła wszystko, co muszę wiedzieć w bardzo jasny sposób, że żaden z zasobów znaleźć w Google może dziękuję –

+0

@ Sour Lemon, cieszę się, że to słyszę. – tafa

Powiązane problemy