FREQUENTLY ASKED QUESTIONS ========================== VI LABORATORIO DI GRAFICA INTERATTIVA - 12 dicembre 2002 ===================================== 1) Nel testo della prima tappa, dove spiega che cosa fare nella mouse callback e che cosa nella funzione di ridisegno della work area prospettica, si dice che la zona di selezione va ristretta nella mouse callback. In realta' questo va fatto nella funzione di ridisegno perche' bisogna farlo subito dopo l'azzeramento (load identity) della matrice di proiezione. Per questo occorre far sapere alla funzione di ridisegno le coordinate (x,y) del punto attorno a cui restringere: si puo' fare mettendole in una variabile globale. 2) Riguardo al modo in cui deve ruotare la scena intera (oggetto/i ed assi) nella vista prospettica, e' importante che - il movimento orizzontale del mouse corrisponda a rotazione attorno all'asse perpendicolare al pavimento della scena (anche se tale pavimento puo' non essere in posizione orizzontale nell'immagine corrente - dipende infatti da dove sta il punto di vista in questo momento) - il movimento verticale del mouse corrisponda in ogni caso (indipendentemente da dove e' ora il punto di vista) a rotazione attorno a un asse orizzontale cioe' parallelo alla larghezza della finestra dello schermo. A tal fine bisogna prima ruotare attorno all'asse perpendicolare al pavimento della scena (asse y della scena) e poi attorno all'asse x (che non e' piu' l'asse x della scena originale ma quello che appare come asse x - cioe' orizzontale - all'utente che guarda lo schemo). Nel codice OpenGL avremo quindi (siccome le trasformazioni vanno scritte in ordine inverso): glRotatef(...angolo...,1,0,0); glRotatef(...angolo...,0,1,0); 3) Riguardo al modo in cui deve ruotare il singolo solido (ad assi fermi) nella vista prospettica, non preoccupatevi per ora di capire attorno a che asse deve ruotare. Basta che ruoti, introdurremo piu' avanti dei comandi per controllarne la rotazione in modo piu' intuitivo. E' importante pero' che ruoti su se stesso, tenendo fermo il suo baricentro (il solido ruota restando nello stesso posto) e non attorno all'origine degli assi della scena (nel qual caso ruotando si sposta da una parte all'altra dell'immagine). 4) Anche quando scalo il singolo solido, deve tenere fermo il suo baricentro (cambiare dimensione restando collocato nello stesso posto) e non l'origine degli assi della scena (nel qual caso rimpicciolendo si avvicinerebbe all'origine e ingrandendo si allontanerebbe). 5) Quando ruoto tutta la scena (solido/i e assi) nella la vista prospettica, le altre tre viste devono restare ferme. L'idea e' che ho una telecamera e la ruoto attorno alla scena, non che ruoto la scena. In questo le altre tre viste, inquadrate da una telecamera fissa, non subiscono variazioni. 6) Riguardo alle coordinate del punto cliccato e alla restrizione della zona di selezione. Abbiamo detto che la y del punto cliccato che arriva a Glut e' contata con y=0 in alto, quindi per trovare la y da passare a OpenGL bisogna fare la differenza dall'altezza della viewport. E' proprio l'altezza della viewport intera, non della viewport ristretta alla work area, perche' Glut non sa che abbiamo partizionato la finestra. Invece da alcune prove sembra che la viewport che passiamo alla gluPickMatrix debba essere quella ristretta alla work area.