Inviato 27 Dicembre 201212 anni Salve a tutti, sto realizzando un progetto di grafica tridimensionale(in Opengl)... IL problema, in questo caso, è che non riesco a scrivere le istruzioni giuste per la gestione del mouse(per effettuare il movimento della camera). Le istruzioni per la camera, tramite la tastiera sono le seguenti: typedef cml::vector3f vector3; typedef cml::matrix44f matrix44; vector3 camera_pos(0.0, 0.0, 0.0); // Posizione camera vector3 camera_at(0.0, 0.0, -10.0); // Punto in cui "guarda" la camera vector3 camera_up(0.0, 1.0, 0.0); // Vettore up...la camera è sempre parallela al piano vector3 camera_dir(0.0, 0.0, -0.1); // Direzione dello sguardo vector3 camera_side(1.0, 0.0, 0.0); // Direzione spostamento laterale bool moveLeft = false; bool moveRight = false; bool moveForward = false; bool moveBackward = false; bool rotateLeft = false; bool rotateRight = false; // La funzione idle continuerà a spostare la camera // fino a quando le variabili booleane sono a true void MOUSECAMERA::idle() { /*Per spostare la camera in avanti e indietro abbiamo bisogno di spostare la posizione della camera "pos" e la posizione del punto "at"*/ // Spostamento in avanti if(moveForward) { camera_pos = camera_pos + camera_dir * 2.2f; camera_at = camera_pos + camera_dir; } // Spostamento all'indietro if(moveBackward) { camera_pos = camera_pos - camera_dir * 2.2f; camera_at = camera_pos + camera_dir; } /*Per ruotare la camera abbiamo bisogno di ruotare il vettore direzione "dir" e aggiornare il punto "at" rispetto alla nuova direzione.*/ //// Ruota a sinistra if(rotateLeft) { camera_dir = rotate_vector(camera_dir, vector3(0.0, 1.0, 0.0), -0.2); camera_at = camera_pos + camera_dir; camera_side = cross(camera_dir, camera_up); camera_side.normalize(); } // Ruota a destra if(rotateRight) { camera_dir = rotate_vector(camera_dir, vector3(0.0, 1.0, 0.0), 0.2); camera_at = camera_pos + camera_dir; camera_side = cross(camera_dir, camera_up); camera_side.normalize(); } /*Per muovere la camera lateralmente bisogna spostare il punto "pos" in direzione "side" e spostare il punto "at" in direzione "side"*/ // Spostamento laterale destro if(moveRight) { camera_pos = camera_pos - 0.2*camera_side; camera_at = camera_pos + camera_dir; } // Spostamento laterale sinistro if(moveLeft) { camera_pos = camera_pos + 0.2*camera_side; camera_at = camera_pos + camera_dir; } glutPostRedisplay(); } void MOUSECAMERA::lookAtCamera(){ gluLookAt(camera_pos[0], camera_pos[1], camera_pos[2], camera_at[0], camera_at[1], camera_at[2], camera_up[0], camera_up[1], camera_up[2]); } // Cattura il rilascio dei tasti ed imposta // le variabili booleane a false void MOUSECAMERA::keyboardUp(unsigned char key, int x, int y) { switch ( key ) { case 'w': /* Spostati in avanti */ moveForward = false; break; case 's': /* Spostati all'indietro */ moveBackward = false; break; case 'x': /* Ruota la camera a sinistra */ rotateLeft = false; break; case 'q': /* Ruota la camera a destra */ rotateRight = false; break; case 'a': moveRight = false; break; case 'd': moveLeft = false; break; default: break; } } // Cattura la pressione dei tasti ed imposta // le variabili booleane a true void MOUSECAMERA::keyboard(unsigned char key, int x, int y) { switch ( key ) { case 27: /* Escape key */ exit ( 0 ); break; case 'w': /* Spostati in avanti */ moveForward = true; break; case 's': /* Spostati all'indietro */ moveBackward = true; break; case 'x': /* Ruota la camera a sinistra */ rotateLeft = true; break; case 'q': /* Ruota la camera a destra */ rotateRight = true; break; case 'a': /* Strafe a destra */ moveRight = true; break; case 'd': /* Strafe a sinistra */ moveLeft = true; break; case 'f': /* Fog on */ glEnable(GL_FOG); // glEnable(GL_LIGHTING); break; case 'g': /* Fog off */ glDisable(GL_FOG); // glDisable(GL_LIGHTING); break; default: break; } } void MOUSECAMERA::mouseMovement(int x, int y){ ?? } Per muovere la camera con il mouse, secondo voi come posso fare??? Ho fatto alcuni ragionamenti ma i risultati non sono quelli che voglio ottenere... Aiutatemi per favore... Grazie By Brutto90
Salve a tutti, sto realizzando un progetto di grafica tridimensionale(in Opengl)...
IL problema, in questo caso, è che non riesco a scrivere le istruzioni giuste per la gestione del mouse(per effettuare il movimento della camera).
Le istruzioni per la camera, tramite la tastiera sono le seguenti:
typedef cml::vector3f vector3;
typedef cml::matrix44f matrix44;
vector3 camera_pos(0.0, 0.0, 0.0); // Posizione camera
vector3 camera_at(0.0, 0.0, -10.0); // Punto in cui "guarda" la camera
vector3 camera_up(0.0, 1.0, 0.0); // Vettore up...la camera è sempre parallela al piano
vector3 camera_dir(0.0, 0.0, -0.1); // Direzione dello sguardo
vector3 camera_side(1.0, 0.0, 0.0); // Direzione spostamento laterale
bool moveLeft = false;
bool moveRight = false;
bool moveForward = false;
bool moveBackward = false;
bool rotateLeft = false;
bool rotateRight = false;
// La funzione idle continuerà a spostare la camera
// fino a quando le variabili booleane sono a true
void MOUSECAMERA::idle()
{
/*Per spostare la camera in avanti e indietro abbiamo bisogno di spostare la posizione della camera "pos"
e la posizione del punto "at"*/
// Spostamento in avanti
if(moveForward)
{
camera_pos = camera_pos + camera_dir * 2.2f;
camera_at = camera_pos + camera_dir;
}
// Spostamento all'indietro
if(moveBackward)
{
camera_pos = camera_pos - camera_dir * 2.2f;
camera_at = camera_pos + camera_dir;
}
/*Per ruotare la camera abbiamo bisogno di ruotare il vettore direzione "dir" e aggiornare il punto "at" rispetto
alla nuova direzione.*/
//// Ruota a sinistra
if(rotateLeft)
{
camera_dir = rotate_vector(camera_dir, vector3(0.0, 1.0, 0.0), -0.2);
camera_at = camera_pos + camera_dir;
camera_side = cross(camera_dir, camera_up);
camera_side.normalize();
}
// Ruota a destra
if(rotateRight)
{
camera_dir = rotate_vector(camera_dir, vector3(0.0, 1.0, 0.0), 0.2);
camera_at = camera_pos + camera_dir;
camera_side = cross(camera_dir, camera_up);
camera_side.normalize();
}
/*Per muovere la camera lateralmente bisogna spostare il punto "pos" in direzione "side" e spostare il
punto "at" in direzione "side"*/
// Spostamento laterale destro
if(moveRight)
{
camera_pos = camera_pos - 0.2*camera_side;
camera_at = camera_pos + camera_dir;
}
// Spostamento laterale sinistro
if(moveLeft)
{
camera_pos = camera_pos + 0.2*camera_side;
camera_at = camera_pos + camera_dir;
}
glutPostRedisplay();
}
void MOUSECAMERA::lookAtCamera(){
gluLookAt(camera_pos[0], camera_pos[1], camera_pos[2],
camera_at[0], camera_at[1], camera_at[2],
camera_up[0], camera_up[1], camera_up[2]);
}
// Cattura il rilascio dei tasti ed imposta
// le variabili booleane a false
void MOUSECAMERA::keyboardUp(unsigned char key, int x, int y)
{
switch ( key ) {
case 'w': /* Spostati in avanti */
moveForward = false;
break;
case 's': /* Spostati all'indietro */
moveBackward = false;
break;
case 'x': /* Ruota la camera a sinistra */
rotateLeft = false;
break;
case 'q': /* Ruota la camera a destra */
rotateRight = false;
break;
case 'a':
moveRight = false;
break;
case 'd':
moveLeft = false;
break;
default:
break;
}
}
// Cattura la pressione dei tasti ed imposta
// le variabili booleane a true
void MOUSECAMERA::keyboard(unsigned char key, int x, int y)
{
switch ( key ) {
case 27: /* Escape key */
exit ( 0 );
break;
case 'w': /* Spostati in avanti */
moveForward = true;
break;
case 's': /* Spostati all'indietro */
moveBackward = true;
break;
case 'x': /* Ruota la camera a sinistra */
rotateLeft = true;
break;
case 'q': /* Ruota la camera a destra */
rotateRight = true;
break;
case 'a': /* Strafe a destra */
moveRight = true;
break;
case 'd': /* Strafe a sinistra */
moveLeft = true;
break;
case 'f': /* Fog on */
glEnable(GL_FOG);
// glEnable(GL_LIGHTING);
break;
case 'g': /* Fog off */
glDisable(GL_FOG);
// glDisable(GL_LIGHTING);
break;
default:
break;
}
}
void MOUSECAMERA::mouseMovement(int x, int y){
??
}
Per muovere la camera con il mouse, secondo voi come posso fare???
Ho fatto alcuni ragionamenti ma i risultati non sono quelli che voglio ottenere...
Aiutatemi per favore...
Grazie
By Brutto90