2010-11-10 7 views
6

Attualmente sto cercando di utilizzare OpenGL (con SDL) per disegnare un cubo nella posizione in cui ho lasciato il clic sullo schermo e quindi farlo puntare sulla posizione nella schermata in cui faccio clic con il pulsante destro del mouse.Trovare gli angoli per l'asse X, Y e Z in 3D - OpenGL/C++

Posso con successo disegnare un cubo nella posizione desiderata utilizzando gluUnproject - Significato Conosco già le coordinate di cui è situato il mio cubo.

Tuttavia, non so come calcolare tutti gli angoli richiesti per far puntare il mio cubo nella nuova posizione.

Naturalmente sto ancora usando gluUnproject per trovare le coordinate del mio clic destro, ma so solo come ruotare attorno all'asse Z dall'uso della grafica 2D.

Ad esempio prima, se volessi ruotare un quad attorno all'asse Z (Ovviamente, questa sarebbe una vista dall'alto in basso dove l'asse Z sta ancora "attraversando" lo schermo) in 2D vorrei fare qualcosa come :

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

La mia domanda è, come potrei fare in 3D?

  • Devo calcolare gli angoli per ciascun asse come ho fatto sopra?
  • In tal caso, come si calcola l'angolo di rotazione attorno all'asse X e Y?
  • In caso negativo, quale metodo dovrei usare per ottenere i risultati desiderati?

Qualsiasi aiuto è molto apprezzato.

+0

Come si specifica le coordinate z rappresentato da ogni clic del mouse? Se imposti entrambi su 0, la geometria 2D è sufficiente e suppongo che non sia il tuo intento. –

+0

Un clic in uno spazio 3d dovrebbe definire un raggio, non un punto. Sono curioso di sapere come hai ottenuto la localizzazione del cubo in primo luogo. – tafa

+0

@Marcelo Cantos: Perdonami se ho capito male la tua domanda, ma sono nuovo per questo e quindi, anche se penso di sapere cosa stai chiedendo, potrei avere ancora un'idea sbagliata.Fondamentalmente se il mio cubo è a (100, 200, 300) e clicco su (400, 500, 600), ho bisogno di trovare gli angoli a cui ho bisogno di ruotare il cubo, per farlo guardare al secondo set di coordinate. –

risposta

9

Se il cubo è in A = (x0, y0, z0)

Se il cubo è attualmente alla ricerca in B = (x1, y1, z1)

e se si desidera guardare C = (x2, y2, z2) allora;

Sia V1 il vettore da A a B

v1 = B - A

e V2 quella da A a C

v2 = C - A

First normalizzare loro.

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

quindi calcolare l'angolo di rotazione e l'asse di rotazione come

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

È possibile chiamare glRotate con

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

Grazie mille per questa risposta tafa! Ho cercato tutorial e altre risorse sull'argomento negli ultimi due giorni, e ho roba collaudata con prodotti punto ecc., ma dato che sono appena tornata da 2D, per me non aveva molto senso, ma la tua risposta ha spiegato tutto ciò che dovevo sapere in modo molto chiaro, che nessuna delle risorse trovato su google potrebbe, grazie –

+0

@ Sour Lemon, felice di sentirlo. – tafa