Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
25 Nov 2002 Costruzione di Interfacce - Paolo Cignoni 1 25 Nov 2002 Costruzione di Interfacce - Paolo Cignoni 2
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
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 )
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);
25 Nov 2002 Costruzione di Interfacce - Paolo Cignoni 21 25 Nov 2002 Costruzione di Interfacce - Paolo Cignoni 22
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…