25 Nov 2002Costruzione di Interfacce - Paolo Cignoni1 Costruzione di Interfacce Lezione 21 Trackball

Slides:



Advertisements
Presentazioni simili
Capitolo 4 Trasformazioni Geometriche
Advertisements

Differenze nei vari linguaggi di Elisa Trifirò e Barbara Tacchino
1 Astrazioni sui dati : Specifica ed Implementazione di Tipi di Dato Astratti in Java.
MultiSet, Liste Ordinate
Le gerarchie di tipi.
LIP: 19 Aprile Contenuto Soluzione Compitino Tipo di dato MultiSet, estensione con sottoclasse.
Cinematica diretta Un manipolatore è costituito da un insieme di corpi rigidi (bracci) connessi in cascata tramite coppie cinematiche (giunti). Si assume.
Cinematica del braccio di un robot
GLUT & OpenGL Ing. Tommaso Coviello Politecnico di Bari
Robotica & Automazione di Processo Robotics Toolbox per MATLAB
Gerarchie di Oggetti Tutti i sistemi avanzati di grafica (PHIGS, OpenGL, DirectDraw, …) permettono di definire un modello come una gerarchia di oggetti.
Un manipolatore è costituito da un insieme di corpi rigidi (bracci) connessi in cascata tramite coppie cinematiche (giunti) a formare una catena cinematica.
Cinematica differenziale
Costruzione di Interfacce Lezione 11 Dal Java al C++ parte 2
11 Dicembre 2002Costruzione di Interfacce - Paolo Cignoni1 Costruzione di Interfacce Lezione 27 Xml for dummies Parte 2
Costruzione di Interfacce Lezione 6 Esercitazione Trasformazioni
Sistemi Multimediali II Marco Tarini Università dellInsubria Facoltà di Scienze MFN di Varese Corso di Laurea in Informatica Anno Accademico 2004/05 prove.
Costruzione di Interfacce Lezione 4 Sistemi di riferimento e trasformazioni
25 Nov 2002Costruzione di Interfacce - Paolo Cignoni1 Costruzione di Interfacce Lezione 22 Estensioni Opengl, Multitexturing,
Computer Graphics Marco Tarini Università dellInsubria Facoltà di Scienze MFN di Varese Corso di Laurea in Informatica Anno Accademico 2005/06 prove generali.
Costruzione di Interfacce Lezione 13 Clipping e HSR
Costruzione di Interfacce Lezione 5 Trasformazioni Affini
Costruzione di Interfacce - Paolo Cignoni1 Costruzione di Interfacce Lezione 27 Estensioni Opengl, Multitexturing,
Costruzione di Interfacce Lezione 10 Dal Java al C++ parte 1
Costruzione di Interfacce - Paolo Cignoni1 Costruzione di Interfacce Lezione 26 XML read e write / Gl Selection e picking
1 Costruzione di Interfacce Primi passi in OpenGL
Costruzione di Interfacce Lezione 7 Shading
Costruzione di Interfacce Lezione 4 Nozioni di geometria per la grafica
Costruzione di Interfacce Lezione 4 Geometria per la grafica
Costruzione di Interfacce Lezione 18 Qt Tutorial 2
Costruzione di Interfacce Lezione 19 Qt Tutorial Designer
Costruzione di Interfacce Lezione 5 Trasformazioni Affini
Costruzione di Interfacce Lezione 20 Qt + Opengl
Costruzione di Interfacce Lezione 12 C++STL
22 Nov 2002Costruzione di Interfacce - Paolo Cignoni1 Costruzione di Interfacce Lezione 22 Texturing
Costruzione di Interfacce - Paolo Cignoni1 Costruzione di Interfacce Lezione 24 Scene Graphs e Xml for dummies
6 Dicembre 2002Costruzione di Interfacce - Paolo Cignoni1 Costruzione di Interfacce Lezione 25 anatomia di uno screen saver
Costruzione di Interfacce - Paolo Cignoni1 Costruzione di Interfacce Lezione 25 Xml for dummies Parte 2
Costruzione di Interfacce - Paolo Cignoni1 Costruzione di Interfacce Lezione 30 MMeditor e collision detection
Costruzione di Interfacce Lezione 15 Rendering Locale e Globale
Costruzione di Interfacce Lezione 16 Qt
1 Costruzione di Interfacce Primi passi in OpenGL
2 Dicembre 2002Costruzione di Interfacce - Paolo Cignoni1 Costruzione di Interfacce Lezione 23 Scene Graphs, Object Loading
Costruzione di Interfacce Lezione 8 Rasterizzazione
Rotazione di un corpo rigido attorno ad un asse fisso
Università degli Studi di Roma
INFORMATICA GRAFICA – SSD ING-INF/05 Sistemi di elaborazione delle informazioni a.a. 2007/2008 Esercitazione OpenGL.
1 Ereditarietà Una classe può essere derivata da una classe esistente usando la sintassi: public, protected e private specificano il tipo di accesso ai.
Lavorare con le matrici in OGL
LAVORO INTERDISCIPLINARE DI GEOMETRIA ED ARTE Classi prime
Il Piano Cartesiano .
Daniele Santamaria – Marco Ventura
Le trasformazioni Daniele Marini.
Trasformazioni in OGL Daniele Marini.
Corso Di Programmazione Grafica aa 2007/2008
Corso di Programmazione Grafica e Laboratorio Daniele Marini
Trasformazioni Daniele Marini.
Trasformazioni in OGL Daniele Marini Davide Gadia Marco Ronchetti Davide Selmo Corso Di Programmazione Grafica aa2005/2006.
Corso Di Programmazione Grafica
Rotazioni e quaternioni
Corso Di Programmazione Grafica aa2006/2007
Corso di Programmazione Grafica e Laboratorio Daniele Marini
Le trasformazioni Daniele Marini Corso Di Programmazione Grafica aa 2005/2006.
Vettori dello spazio bidimensionale (R 2)
INSEGUITORE SOLARE CON ARDUINO
Costruzione di Interfacce - Paolo Cignoni1 Costruzione di Interfacce Lezione 29 ancora MMeditor,
25 Nov 2002Costruzione di Interfacce - Paolo Cignoni1 Costruzione di Interfacce Lezione 21 Trackball, Generazione TexCoords
Costruzione di Interfacce - Paolo Cignoni1 Costruzione di Interfacce Lezione 25 Xml for dummies Parte 2
Daniele Marini Con contributi di Maurizio Rossi
a’ = f(a) Definizione e proprietà
Transcript della presentazione:

25 Nov 2002Costruzione di Interfacce - Paolo Cignoni1 Costruzione di Interfacce Lezione 21 Trackball

25 Nov 2002Costruzione di Interfacce - Paolo Cignoni2 Ripulire I dati principali dellapp QTMoebius erano contenuti nella classe CIMoebius chi possedeva loggetto? soluzione brutta e pasticciata: una variabile globale dentro un cpp. Diamo il possesso delloggetto al main form la CIGLWidget deve solo avere un puntatore alloggetto da rendere. le var private SideNum e twist non servono piu gli slot non servono piu qui.

25 Nov 2002Costruzione di Interfacce - Paolo Cignoni3 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 2002Costruzione di Interfacce - Paolo Cignoni4 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 dellanello dalla initializeGL() aggiungere un puntatore pubblico a CIMoebiusRing nella classe.

25 Nov 2002Costruzione di Interfacce - Paolo Cignoni5 designer ristabilire le giuste connessioni togliere quelle dagli spinbox a glwidget e metterle alla rebuild ring

25 Nov 2002Costruzione di Interfacce - Paolo Cignoni6 MainForm scrivere limplementazione 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(); }

25 Nov 2002Costruzione di Interfacce - Paolo Cignoni7 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 2002Costruzione di Interfacce - Paolo Cignoni8 Euler Angle Una rotazione viene espressa come una serie di tre rotazioni sui tre assi. Deriva dal modo con cui si descrive lorientamento di un aereo Yaw Pitch Roll Intuitivo per piccoli valori di pitch e roll

25 Nov 2002Costruzione di Interfacce - Paolo Cignoni9 Euler Angle Problema ordine rotazione Il risultato dipende dallordine 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 2002Costruzione di Interfacce - Paolo Cignoni10 Gimbal lock nelle interfacce Capita ad esempio quando cerco di far specificare gli euler angle interattivamente allutente: Up/down: rot asse x Left/right: rot asse y Pgup/pgdn: rot asse z Si incarta.

25 Nov 2002Costruzione di Interfacce - Paolo Cignoni11 Axis/angle Approccio OpenGL Si specifica unasse di rotazione e un angolo di rotazione Molto generico Poco intuitivo Quale lasse di rotazione per girare la testa in modo da guardare in basso a destra?

25 Nov 2002Costruzione di Interfacce - Paolo Cignoni12 Quaternioni Cosè un quaternione? Un estensione dei numeri complessi, Spesso rappresentato come una coppia scalare-vettore:

25 Nov 2002Costruzione di Interfacce - Paolo Cignoni13 Quaternioni Magnitudine Normalizzazione a quaternione unitario

25 Nov 2002Costruzione di Interfacce - Paolo Cignoni14 Somma e prodotto Dati due quaternioni Si definisce Identità somma prodotto

25 Nov 2002Costruzione di Interfacce - Paolo Cignoni15 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 2002Costruzione di Interfacce - Paolo Cignoni16 Conversioni Da quaternione a matrice Da quaternione ad axis/angle

25 Nov 2002Costruzione di Interfacce - Paolo Cignoni17 Conversioni Da axis angle a quaternioni Da euler angle a quaternion

25 Nov 2002Costruzione di Interfacce - Paolo Cignoni18 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;

25 Nov 2002Costruzione di Interfacce - Paolo Cignoni19 Trackball Come si mappa il movimento del mouse in una rotazione? Si immagina una sfera circoscritta alloggetto 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 larco di cerchio sulla superficie sferica delimitato da p1 e p2

25 Nov 2002Costruzione di Interfacce - Paolo Cignoni20 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 lultimo quaternione calcolato, si ottiene leffetto di spinning.

25 Nov 2002Costruzione di Interfacce - Paolo Cignoni21 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 laltra

25 Nov 2002Costruzione di Interfacce - Paolo Cignoni22 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 2002Costruzione di Interfacce - Paolo Cignoni23 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 2002Costruzione di Interfacce - Paolo Cignoni24 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(); }

25 Nov 2002Costruzione di Interfacce - Paolo Cignoni25 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 2002Costruzione di Interfacce - Paolo Cignoni26 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 2002Costruzione di Interfacce - Paolo Cignoni27 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 2002Costruzione di Interfacce - Paolo Cignoni28 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(); }