• Non ci sono risultati.

Costruzione di Interfacce Lezione 21

N/A
N/A
Protected

Academic year: 2021

Condividi "Costruzione di Interfacce Lezione 21 "

Copied!
5
0
0

Testo completo

(1)

25 Nov 2002 Costruzione di Interfacce - Paolo Cignoni 1

Costruzione di Interfacce Lezione 21

Trackball [email protected] http://vcg.isti.cnr.it/~cignoni

25 Nov 2002 Costruzione di Interfacce - Paolo Cignoni 2

Ripulire

™I dati principali dell’app QTMoebius erano contenuti nella classe CIMoebius

™chi possedeva l’oggetto?

™soluzione brutta e pasticciata: una variabile globale dentro un cpp.

™Diamo il possesso dell’oggetto al main form

™la CIGLWidget deve solo avere un puntatore

all’oggetto da rendere.

™le var private SideNum e twist non servono piu’

™gli slot non servono piu’ qui.

25 Nov 2002 Costruzione di Interfacce - Paolo Cignoni 3

Aggiungere al mainform

™Tutto dal designer

™nell Object explorer

™aggiungere CIMoebius.h negli include delle

definition

™aggiungere CIMoebius ring tra i membri

privati della classe Mainform

™aggiungere rebuildRing() tra gli slot

25 Nov 2002 Costruzione di Interfacce - Paolo Cignoni 4

CIGLWidget

™togliere dal cpp la var globale pp

™togliere gli slot dal .h e

™togliere le var twist e sidenum

™e la loro init dal costruttore.

™togliere la parte di creazione dell’anello dalla initializeGL()

™aggiungere un puntatore pubblico a CIMoebiusRing nella classe.

25 Nov 2002 Costruzione di Interfacce - Paolo Cignoni 5

designer

™ristabilire le giuste connessioni

™togliere quelle dagli spinbox a glwidget

™e metterle alla rebuild ring

25 Nov 2002 Costruzione di Interfacce - Paolo Cignoni 6

MainForm

™

scrivere l’implementazione della rebuild ring

void MainForm::rebuildRing() {

CIMoebius::myShape s;

s.BuildNGon(SideNumSpinBox->value(),1);

ring.GenerateMoebiusRing(s,36,3, TwistSpinBox->value()*

360/SideNumSpinBox->value());

GLView->update();

}

void MainForm::init() {

GLView->ring=˚

emit rebuildRing();

}

(2)

25 Nov 2002 Costruzione di Interfacce - Paolo Cignoni 7

Interfacce di rotazione

™Come può un utente specificare una rotazione tramite un interfaccia?

™Due modalità:

™Diretta: specifica valori numerici esatti

™Interattiva: tramite movimenti del mouse

™Come rappresento una rotazione?

™Euler Angle

™Axis/angle

™Quaternions

25 Nov 2002 Costruzione di Interfacce - Paolo Cignoni 8

Euler Angle

™Una rotazione viene espressa come una serie di tre rotazioni sui tre assi.

™Deriva dal modo con cui si descrive l’orientamento di un aereo

™Yaw

™Pitch

™Roll

™Intuitivo per piccoli valori di pitch e roll

25 Nov 2002 Costruzione di Interfacce - Paolo Cignoni 9

Euler Angle

™Problema ordine rotazione

™Il risultato dipende dall’ordine in cui

faccio le tre rotazioni

™Problema Gimbal Lock

™In alcune situazioni le rotazioni fatte

su un asse possono coprire quelle su un altro asse

™Se il pitch è a 90

gradi yaw e roll si possono annullare a vicenda.

™

25 Nov 2002 Costruzione di Interfacce - Paolo Cignoni 10

Gimbal lock nelle interfacce

™Capita ad esempio quando cerco di far specificare gli euler angle

interattivamente all’utente:

™Up/down: rot asse x

™Left/right: rot asse y

™Pgup/pgdn: rot asse z

™Si incarta.

25 Nov 2002 Costruzione di Interfacce - Paolo Cignoni 11

Axis/angle

™Approccio OpenGL

™Si specifica un’asse di rotazione e un angolo

di rotazione

™Molto generico

™Poco intuitivo

™Qual’e l’asse di rotazione per girare la testa in modo da guardare in basso a destra?

25 Nov 2002 Costruzione di Interfacce - Paolo Cignoni 12

Quaternioni

™Cos’è un quaternione?

™Un estensione dei numeri complessi,

™Spesso rappresentato come una coppia scalare-vettore:

− 1

=

=

=

⋅ +

+ +

= w xi yj zk dove i i j j k k q

[ ] w , dove ( x , y , z )

q =

v v

=

(3)

25 Nov 2002 Costruzione di Interfacce - Paolo Cignoni 13

Quaternioni

™Magnitudine

™Normalizzazione a quaternione unitario

2 2 2

2

x y z

w

q = + + +

q q q =

25 Nov 2002 Costruzione di Interfacce - Paolo Cignoni 14

Somma e prodotto

™Dati due quaternioni

™Si definisce

™Identità

™somma

™prodotto

k z j y i x w q e k z j y i x w

q

1

=

1

+

1

+

1

+

1 2

=

2

+

2

+

2

+

2

[

1 2 1 2 1 2 1 2 1 2

]

2

1

q = w w

v

v

,

v

w + w

v

+

v

×

v

q

[

1 2 1 2

]

2

1

+ q = w + w ,

v

+

v

q

[ 0 , ( 0 , 0 , 0 ) ]

+

= q

I

[ 1 , ( 0 , 0 , 0 ) ]

= q

I

[

1

,

1

]

2

[

2

,

2

]

1

(

1

,

1

,

1

)

2

(

2

,

2

,

2

)

1

w e q w dove x y z e x y z

q =

v

=

v v

=

v

=

25 Nov 2002 Costruzione di Interfacce - Paolo Cignoni 15

Quaternioni e rotazioni

™Ogni quaternione unitario corrisponde ad una rotazione in 3d

™La moltiplicazione tra due quaternioni corrisponde alla composizione delle due rotazioni

25 Nov 2002 Costruzione di Interfacce - Paolo Cignoni 16

Conversioni

™Da quaternione a matrice

™Da quaternione ad axis/angle

 

 

− +

− +

+

2 2 2 2 2 2

2 2 1 2 2 2 2

2 2 2 2 1 2 2

2 2 2 2 2 2 1

y x wx yz wy xz

wx xy z x wz xy

wy xz wz xy z x

[ ] w , axis / e angle 2 arccos( w )

q =

v

=

v v

=

25 Nov 2002 Costruzione di Interfacce - Paolo Cignoni 17

Conversioni

™Da axis angle a quaternioni

™Da euler angle a quaternion )

cos(

)) sin(

), sin(

), sin(

( ] , [

) , , (

2

2 2 2 θ

θ θ θ

θ

=

=

=

=

=

w

a a a

w q

angle e a a a axis

z y x

z y x

v v

z y x

c c

z

b y b

a x a

q q q q q q q

=

=

=

=

))]

sin(

, 0 , 0 ( ), [cos(

)]

0 ), sin(

, 0 ( ), [cos(

)]

0 , 0 ), (sin(

), [cos(

2 2

2 2

2 2

25 Nov 2002 Costruzione di Interfacce - Paolo Cignoni 18

Evitare il gimbal lock

™

Euler angle è molto intuitivo per piccole rotazioni: se ruoto di angoli piccoli quello che ottengo è esattamente quello che mi aspetto

™

Soluzione:

™Tenere la rotazione come un quaternione

™Ad ogni pressione di tasto generare un quaternione corrispondente al piccolo euler angle

™Ad es. se premo left genero un quaternione

™Comporre il risultato con moltiplicazione tra quaternioni e tenere il risultato come base;

)]

0 ), sin(

, 0 ( ), [cos(

2δ 2δ

y

=

q

(4)

25 Nov 2002 Costruzione di Interfacce - Paolo Cignoni 19

Trackball

™Come si mappa il movimento del mouse in una rotazione?

™Si immagina una sfera circoscritta

all’oggetto con cui si vuole interagire

™Ogni drag del mouse definisce due

punti p1 e p2(inizio e fine del drag) sulla sfera

™Si considera la rotazione che

descrive l’arco di cerchio sulla superficie sferica delimitato da p1 e p2

25 Nov 2002 Costruzione di Interfacce - Paolo Cignoni 20

Trackball

™La rotazione così calcolata viene trasformata in un quaternione e composta con la trasf corrente

™Se una volta rilasciato il mouse, si continua comporre con l’ultimo

quaternione calcolato, si ottiene l’effetto di spinning.

25 Nov 2002 Costruzione di Interfacce - Paolo Cignoni 21

Rotazioni senza trackball

™si mappa il movimento di drag del mouse in x e y in rotazioni in y e x.

™occorre uno stato delle rotazione nella CIGLWidget

™la rotazione specificata deve

ovviamente essere relativa a dove ho iniziato a fare il dragging

™notare come funziona bene per piccole rotazioni ma se una delle due rot supera 90 gradi diventa difficile controllare l’altra

25 Nov 2002 Costruzione di Interfacce - Paolo Cignoni 22

CIGLWidget.h

void mousePressEvent(QMouseEvent*e);

void mouseMoveEvent(QMouseEvent*e);

void mouseReleaseEvent(QMouseEvent*e);

private:

// posizione iniziale del dragging del mouse int sx,sy;

// variazione della rotazione float drx,dry;

// rotazione corrente sui due assi float rotx, roty;

25 Nov 2002 Costruzione di Interfacce - Paolo Cignoni 23

CIGLWidget.cpp

void CIGLWidget::mousePressEvent(QMouseEvent*e) {

sx=e->x();

sy=e->y();

update();

}

void CIGLWidget::mouseMoveEvent(QMouseEvent*e) {

drx=(float(e->y()-sy)/size().height())*180.0f;

dry=(float(e->x()-sx)/size().width())*180.0f;

update();

}

void CIGLWidget::mouseReleaseEvent(QMouseEvent*e) {

rotx+=drx;

roty+=dry;

drx=0;

dry=0;

update();

} 25 Nov 2002 Costruzione di Interfacce - Paolo Cignoni 24

CIGLWidget::paintGL()

void CIGLWidget::paintGL() {

glMatrixMode (GL_MODELVIEW);

glClear(GL_COLOR_BUFFER_BIT |GL_DEPTH_BUFFER_BIT );

glLoadIdentity();

gluLookAt(2,5,12,0,0,0,0,1,0);

glColor3f(1,.4,.4);

QString tmp;

glRotatef(roty+dry,0,1,0);

glRotatef(rotx+drx,1,0,0);

ring->m.Draw();

}

(5)

25 Nov 2002 Costruzione di Interfacce - Paolo Cignoni 25

CITrackball

™Classe che implementa una trackball

™Di solito è un oggetto della glview

™Interfaccia fondamentale nella glview

™Si deve gestire

Mousedown/mouseup/Mousemove

™Avere un membro dove tenere la mat di

rotazione corrente

™Comunicare Resize alla trackball

25 Nov 2002 Costruzione di Interfacce - Paolo Cignoni 26

CITrackball

class CIGLWidget {

// Gestione trackball CITrackball m_tb;

Matrix44f m_matRot;

};

void CIGLWidget ::init() {

tb.Init(size.width(),size.height());

matRot.SetIdentity();

}void CIGLWidget::resizeGL( int w, int h ) {

tb.Resize( w,h );

}

25 Nov 2002 Costruzione di Interfacce - Paolo Cignoni 27

CITrackball

void CIGLWidget::mousePressEvent(QMouseEvent*e) {tb.MouseDown( e->x(), e->y(), 0 );

update();

}

void CIGLWidget::mouseMoveEvent(QMouseEvent*e) {tb.CalcRotMatrix( rot, e->x(), e->y());

update();

}

void CIGLWidget::mouseReleaseEvent(QMouseEvent*e) {tb.MouseUp( e->x(), e->y());

update();

}

25 Nov 2002 Costruzione di Interfacce - Paolo Cignoni 28

CITrackBall

void CIGLWidget::paintGL() {

glMatrixMode (GL_MODELVIEW);

glClear(GL_COLOR_BUFFER_BIT |GL_DEPTH_BUFFER_BIT );

glLoadIdentity();

gluLookAt(2,5,12,0,0,0,0,1,0);

glColor3f(1,.4,.4);

QString tmp;

glMultMatrix(rot);

ring->m.Draw();

}

Riferimenti

Documenti correlati

™Libreria di classi container, algoritmi, iteratori che mette a disposizone in forma astratta e generica (basata su template) la maggior parte degli algoritmi e strutture

™si usa le matrici di Opengl stesse per trasformare i vertici come vogliamo. ™utilizziamo due classi accessorie point3 e matrix44 per trasformare punti con matrici in

™the signature of a signal must match the signature of the receiving slot. ™signals and slots can take any number of arguments of

 CSGNode: generico nodo dello scene graph, lo faccio come classe

17 Ott 2003 Costruzione di Interfacce - Paolo Cignoni 2}. Sempre

™CSGNode: generico nodo dello scene graph, lo faccio come classe astratta;. Costruzione di Interfacce - Paolo

™ Restituisce la posizione del punto indicato dal mouse nel sistema di riferimento definito al momento in cui sono state prese le matrici model e proj. ™ ATTENZIONE A QUANDO

™ Che contengono tutti i token e I tipi delle funzioni di fino a opengl1.4 e tutte le estensioni esistenti.. Costruzione di Interfacce - Paolo