2011-12-22 9 views
7

So che ci sono un sacco di domande sulla rotazione 3D a cui è stata data una risposta qui, ma tutte sembrano occuparsi di matrici rotazionali e quaternioni in OpenGL (e non mi interessa davvero se ottengo il blocco del giunto cardanico). Ho bisogno di ottenere le coordinate 3D EX: (x, y, z) di un punto che deve sempre essere alla stessa distanza, lo chiamerò "d" per ora, dall'origine. L'unica informazione che ho come input è il deltax e il deltay del mouse sullo schermo. Finora qui è che cosa ho provato:rotazione 3D intorno all'origine

Prima:

thetaxz+=(omousex-mouseX)/(width); 
thetaxy+=(omousey-mouseY)/(height); 

(thetaxy l'angolo in radianti sulla x, asse y e thetaxz sulla x, asse z) (limito entrambi gli angoli in modo che se sono inferiori o uguali a 0 sono uguali a 2 * PI)

secondo:

pointX=cos(thetaxz)*d; 
pointY=sin(thetaxy)*d; 

(pointX è la coordinata x del punto e appuntito è la y)

Terzo:

if(thetaxz)<PI){ 
pointZ=sqrt(sq(d)-sq(eyeX/d)-sq(eyeY/d)); 
}else{ 
    pointZ=-sqrt(abs(sq(d)-sq(eyeX/d)-sq(eyeY/d))); 
} 

(sq() è una funzione che piazze e abs() è una funzione di valore assoluto) (Pointz deve essere coordinata z del punto ed è tranne al incrocio tra z positivo emisfero e emisfero z negativo. Man mano che si avvicina al bordo il punto si allunga oltre la distanza che si suppone debba essere in xey e apparentemente a caso intorno a 0.1-0.2 radianti di thetaxz la coordinata z diventa NAN o indefinita)

Ho ci ho pensato per un po 'e sinceramente ho difficoltà a distorcermi il concetto di quaternioni e matrici rotazionali, tuttavia, se puoi mostrarmi come usarli per generare coordinate reali, sarei lieto di apprendere. Lo preferirei ancora se potessi usare un po 'di trigonometria in qualche asse. Grazie in anticipo per qualsiasi aiuto e se hai bisogno di ulteriori informazioni, per favore basta chiedere.

Suggerimento/idea dell'ultimo minuto: Penso che possa avere qualcosa a che fare con la posizione z che influenza le posizioni x e y, ma non ne sono sicuro.

EDIT: ho disegnato un diagramma: enter image description here

+0

io non sono al 100% questo è esattamente ciò che si vuole, ma penso che si potrebbe desiderare di guardare in [gluUnProject] (http://nehe.gamedev.net/article/using_gluunproject/16013 /) per convertire le coordinate 2D in 3D in base alle matrici della telecamera. Fai questo per un punto sui piani vicino e lontano della telecamera, e poi usa un po 'di trigge per trovare il punto lungo la linea risultante che è la distanza desiderata dall'origine. Nota che ci sono 0, 1 o 2 soluzioni a questo problema, a seconda della linea – Hybrid

+3

Puoi dire che il problema originale è un po 'più chiaro, forse con un'immagine? –

+0

Ho aggiunto un collegamento immagine perché ho solo 1 rappresentante perché sono nuovo di questo sito. –

risposta

5

Se veramente si vuole alcun successo in questo, si sta andando ad avere per stringere i denti e conoscere rotation matrices e/o quaternion rotations. Ci possono essere altri modi per fare quello che vuoi, ma le matrici di rotazione e le rotazioni di quaternioni sono usate semplicemente perché sono ampiamente comprese e tra i mezzi più semplici per esprimere e applicare le rotazioni ai vettori. Qualsiasi altra rappresentazione che qualcuno potrebbe inventare sarà probabilmente una riformulazione più complessa di uno o entrambi. In effetti si può mostrare che la rotazione è linear transformation e quindi può essere espressa come matrix. Le rotazioni del quaternione sono solo uno strumento semplificato per la rotazione di vettori in 3D e pertanto hanno rappresentazioni di matrici equivalenti.

Detto questo, sembra che tu sia interessato ad afferrare un oggetto nella scena con un clic del mouse e ruotandolo in modo naturale. In questo caso, dovresti esaminare il metodo ArcBall (ci sono numerous examples che potresti voler controllare). Ciò richiede ancora che tu sappia qualcosa di quaternioni. Troverai anche utile una comprensione almeno minima degli aspetti di base di linear algebra.

Aggiornamento: In base al diagramma e le osservazioni in esso contenuti, sembra che tutto quello che sta veramente cercando di fare è quello di convertire Spherical Coordinates-Cartesian Coordinates. Finché siamo d'accordo sulla notazione, è facile. Sia θ l'angolo che stai chiamando XY, ovvero l'angolo tra l'asse X ruotato attorno all'asse Z; questo è chiamato l'angolo azimutale e sarà compreso nell'intervallo [0, 2 π) radianti o [0 °, 360 °). Sia φ un angolo tra il piano XY e il vettore; questo è chiamato l'angolo di elevazione e sarà compreso nell'intervallo [- π/2, + π/2] o [-90 °, +90 °] e corrisponde all'angolo che stai chiamando l'angolo XZ (rotazione nel Piano XZ attorno all'asse Y). Ci sono altre convenzioni, quindi assicurati di essere coerente. In ogni caso, la conversione è semplice:

x = d∙cos(φ)∙cos(θ) 
y = d∙cos(φ)∙sin(θ) 
z = d∙sin(φ)
+0

Grazie, ma non sto usando opengl e non sto davvero afferrando un oggetto sto ruotando la scena della telecamera senza trasformare il sistema di coordinate delle scene. C'è un modo per ottenere le coordinate da una matrice di rotazione perché potrei usarle? –

+0

In base al diagramma, penso che tu voglia semplicemente convertire da coordinate sferiche a coordinate cartesiane. Ho modificato la mia risposta per mostrarti come farlo. Se stai cercando di fare qualcosa di interattivo con il mouse e spostando la tua videocamera sull'origine in questo modo, non penso che otterrai i risultati che speri. Detto questo, penso davvero che staresti meglio considerando almeno l'approccio ArcBall. – andand

+0

Grazie, l'ho capito poco prima di pubblicare questo, ma grazie comunque! Un grande aiuto ti darò più uno, ma non ho ancora abbastanza rep per me stesso. Proverò a tornare più tardi perché sei stato molto utile e informativo. –