Sei sulla pagina 1di 5

Interfacce di rotazione

™Come può un utente specificare una


rotazione tramite un interfaccia?
Costruzione di Interfacce
™Due modalità:
Lezione 21
™Diretta: specifica valori numerici esatti
Trackball, Generazione TexCoords
™Interattiva: tramite movimenti del mouse

cignoni@iei.pi.cnr.it ™Come rappresento una rotazione?


™Euler Angle
http://vcg.iei.pi.cnr.it/~cignoni
™Axis/angle
™Quaternions

25 Nov 2002 Costruzione di Interfacce - Paolo Cignoni 1 25 Nov 2002 Costruzione di Interfacce - Paolo Cignoni 2

Euler Angle Euler Angle


™Una rotazione viene espressa ™Problema ordine rotazione
come una serie di tre rotazioni ™Il risultato dipende dall’ordine in cui
sui tre assi. faccio le tre rotazioni
™Deriva dal modo con cui si ™Problema Gimbal Lock
descrive l’orientamento di un ™In alcune situazioni le rotazioni fatte
aereo su un asse possono coprire quelle
™Yaw su un altro asse
™Pitch ™Se il pitch è a 90
gradi yaw e roll si
™Roll possono annullare
™Intuitivo per piccoli valori di a vicenda.
pitch e roll ™
25 Nov 2002 Costruzione di Interfacce - Paolo Cignoni 3 25 Nov 2002 Costruzione di Interfacce - Paolo Cignoni 4

Gimbal lock nelle interfacce Axis/angle


™Capita ad esempio quando cerco di far ™Approccio OpenGL
specificare gli euler angle ™Si specifica un’asse di rotazione e un angolo
interattivamente all’utente: di rotazione
™Up/down: rot asse x ™Molto generico
™Left/right: rot asse y ™Poco intuitivo
™Pgup/pgdn: rot asse z ™Qual’e l’asse di rotazione per girare
la testa in modo da guardare in
™Si incarta. basso a destra?

25 Nov 2002 Costruzione di Interfacce - Paolo Cignoni 5 25 Nov 2002 Costruzione di Interfacce - Paolo Cignoni 6

1
Quaternioni Quaternioni
™Cos’è un quaternione? ™Magnitudine
™Un estensione dei numeri complessi,
q = w2 + x 2 + y 2 + z 2
q = w + xi + yj + zk dove i ⋅ i = j ⋅ j = k ⋅ k = −1
™Normalizzazione a quaternione unitario
™Spesso rappresentato come una coppia
scalare-vettore: q= q
q
q = [w, v ] dove v = ( x, y , z )

25 Nov 2002 Costruzione di Interfacce - Paolo Cignoni 7 25 Nov 2002 Costruzione di Interfacce - Paolo Cignoni 8

Somma e prodotto Quaternioni e rotazioni


™ Dati due quaternioni ™Ogni quaternione unitario corrisponde
q1 = w1 + x1i + y1 j + z1k e q2 = w2 + x2i + y2 j + z2 k ad una rotazione in 3d
q1 = [w1 , v1 ] e q2 = [w2 , v 2 ] dove v1 = ( x1 , y1 , z1 ) e v 2 = ( x2 , y2 , z2 ) ™La moltiplicazione tra due quaternioni
™ Si definisce corrisponde alla composizione delle due
q1 + q2 = [w1 + w2 , v1 + v 2 ] rotazioni
q1 ∗ q2 = [w1w2 − v1 ⋅ v 2 , v1w2 + w1v 2 + v1 × v 2 ]

™ Identità
™ somma qI + = [0, (0,0,0)]
™ prodotto qI ∗ = [1, (0,0,0)]

25 Nov 2002 Costruzione di Interfacce - Paolo Cignoni 9 25 Nov 2002 Costruzione di Interfacce - Paolo Cignoni 10

Conversioni Conversioni
™Da quaternione a matrice ™Da axis angle a quaternioni
axis = ( a x , a y , a z ) e angle = θ
1 − 2 x − 2 z
2 2
2 xy − 2 wz 2 xz + 2 wy 
  q = [ v , w]
 2 xy + 2 wz 1 − 2 x2 − 2z2 2 xy − 2 wx 
 2 xz − 2 wy v = ( a x ⋅ sin( θ2 ), a y ⋅ sin( θ2 ), a z ⋅ sin( θ2 ))
 2 yz + 2 wx 1 − 2 x − 2 y 
2 2

w = cos( θ2 )

™Da quaternione ad axis/angle ™Da euler angle a quaternion


qx = [cos( a2 ), (sin( a2 ),0,0)]
q = [w, v ] axis = v / v e angle = 2 arccos( w) q y = [cos( 2b ), (0, sin( 2b ),0)]
qz = [cos( 2c ), (0,0, sin( 2c ))]
q = q x ∗ q y ∗ qz
25 Nov 2002 Costruzione di Interfacce - Paolo Cignoni 11 25 Nov 2002 Costruzione di Interfacce - Paolo Cignoni 12

2
Evitare il gimbal lock Trackball
™ Euler angle è molto intuitivo per piccole ™Come si mappa il movimento
rotazioni: se ruoto di angoli piccoli quello che del mouse in una rotazione?
ottengo è esattamente quello che mi aspetto ™Si immagina una sfera circoscritta
™ Soluzione: all’oggetto con cui si vuole
™ Tenere la rotazione come un quaternione interagire
™ Ad ogni pressione di tasto generare un quaternione ™Ogni drag del mouse definisce due
corrispondente al piccolo euler angle punti p1 e p2(inizio e fine del
™ Ad es. se premo left genero un quaternione drag) sulla sfera
q y = [cos( δ2 ), (0, sin( δ2 ),0)] ™Si considera la rotazione che
™ Comporre il risultato con moltiplicazione tra descrive l’arco di cerchio sulla
quaternioni e tenere il risultato come base; superficie sferica delimitato da p1
e p2

25 Nov 2002 Costruzione di Interfacce - Paolo Cignoni 13 25 Nov 2002 Costruzione di Interfacce - Paolo Cignoni 14

Trackball CITrackball
™La rotazione così calcolata viene ™Classe che implementa una trackball
trasformata in un quaternione e ™Di solito è un oggetto della glview
composta con la trasf corrente ™Interfaccia fondamentale nella glview
™Se una volta rilasciato il mouse, si ™Si deve gestire
continua comporre con l’ultimo Mousedown/mouseup/Mousemove
quaternione calcolato, si ottiene l’effetto ™Avere un membro dove tenere la mat di
di spinning. rotazione corrente
™Comunicare Resize alla trackball

25 Nov 2002 Costruzione di Interfacce - Paolo Cignoni 15 25 Nov 2002 Costruzione di Interfacce - Paolo Cignoni 16

CITrackball CITrackball
void CMBGLView::OnLButtonDown(UINT nFlags, CPoint point)
class CMBGLView : public CView {
{ if(!m_bCaptured) {
… m_tb.MouseDown( point.x, point.y, 0 );
// Gestione trackball SetCapture();
CITrackball m_tb; m_bCaptured = TRUE;
Matrix44f m_matRot; }
bool m_bCaptured; CView::OnLButtonDown(nFlags, point);
… }
}; void CMBGLView::OnLButtonUp(UINT nFlags, CPoint point)
{
void CMBGLView::OnInitialUpdate() if(m_bCaptured) {
{ m_tb.MouseUp(point.x,point.y);
… ReleaseCapture();
CRect rc; m_bCaptured = FALSE;
GetClientRect(&rc); }
m_tb.Init(rc.right,rc.bottom); CView::OnLButtonUp(nFlags, point);
m_matRot.SetIdentity(); }
} void CMBGLView::OnMouseMove(UINT nFlags, CPoint point)
void CMBGLView::OnSize(UINT nType, int cx, int cy) {
{ if(m_bCaptured) {
… m_tb.CalcRotMatrix( m_matRot, point.x, point.y );
m_tb.Resize( cx,cy ); Invalidate();
… }
} CView::OnMouseMove(nFlags, point);
}
25 Nov 2002 Costruzione di Interfacce - Paolo Cignoni 17 25 Nov 2002 Costruzione di Interfacce - Paolo Cignoni 18

3
CITrackBall Modifiche a MoebiusStrip
void CMBGLView::OnDraw(CDC* pDC)
{ ™ Resa piu’ generale

// World To Camera Transformation ™ Non piu width/ height ma innerradius
gluLookAt(0,0,10,0,0,0,0,1,0); e filletratio
// Apply the trackball
glMultMatrix(m_matRot);
™ La Generate è ora divisa in due parti:
™ Prima si genera una sezione
glRotatef( -90,0,1,0);
™ Poi si estrude
glRotatef( 90,1,0,0);

// moto di precessione: una rotazione il cui asse ruota


™ Gestione CreaseAngle tramite
intorno all'asse z duplicazione vertici
glRotated( 10,cos(ToRad(-45+CurAngleDeg*.5)),sin(ToRad(-
45+CurAngleDeg*.5)),0); ™ Introduzione Matrix44

if(pd->m.Empty()) pd->m.Generate(); ™ Gestione normali corretta
pd->m.Ring.Draw<true,true>();
SwapBuffers(m_pDC->GetSafeHdc());
™ Generazione coordinate texture
} ™ Draw templated
25 Nov 2002 Costruzione di Interfacce - Paolo Cignoni 19 25 Nov 2002 Costruzione di Interfacce - Paolo Cignoni 20

Metaprogramming Passaggio parametri


™“the art of programming programs that ™Normalmente il passaggio di parametri
read, transform or write other è fatto attraverso variabili/oggetti
programs” ™ double square(x) {return x*x;}

™Risultati ™Valori specifici vengono passati a run


™Compile-time computations
time quando la funzione viene invocata
™ …square(-3)…
™Compile-time control structure
™In c++ si puo’ fornire placeholder per
™Performance
risolvere tutto a runtime
™Metaprogramming è una gran disciplina, ™ template<type t> inline square(T x) { return x*x;}

questo è sono un minimo assaggio.

25 Nov 2002 Costruzione di Interfacce - Paolo Cignoni 21 25 Nov 2002 Costruzione di Interfacce - Paolo Cignoni 22

Template valori Template


™ Ma si può templatare anche in base a valori ™ In questo modo si puo far fare al compilatore
template <unsigned n> parte del processing
inline double pow(double x) {
template <bool NormFlag, bool TexFlag> Draw()
double ans=1.0; {
for(unsigned k=0;k<n;++k) glBegin(GL_TRIANGLES);
ans*=k; vector<CIFace>::const_iterator fi;
return ans; for(fi=face.begin();fi!=face.end();++fi)
} {
if(NormFlag) glNormal((*fi).v[0]->n);
™ Oppure ancora meglio if(TexFlag) glTexCoord2f((*fi).v[0]->s,(*fi).v[0]->t);
template <unsigned n> glVertex((*fi).v[0]->p);
inline double pow(double x) { …
return pow<n%2>(x) * pow<n/2> (x*x); if(NormFlag) glNormal((*fi).v[2]->n);
} if(TexFlag) glTexCoord2f((*fi).v[2]->s,(*fi).v[2]->t);
template<> pow<1u>(double x) {return x;} glVertex((*fi).v[2]->p);
}
glEnd();
25 Nov 2002 Costruzione di Interfacce - Paolo Cignoni 23 25 Nov 2002 Costruzione di Interfacce - Paolo Cignoni 24
}

4
Conclusioni
™Stiamo ancora sperimentando
™Mancano gli oggetti che si muovono
sull’anello
™Dobbiamo decidere meglio le specifiche
dell’app.
™L’animazione ora è gestita interamente
dentro la view. Non portabile…
™Butteremo via ancora varie volta quasi
tutto…

25 Nov 2002 Costruzione di Interfacce - Paolo Cignoni 25