freefly camera problème souris [c++ / qt] - C++ - Programmation
Marsh Posté le 30-03-2010 à 18:11:06
Bonjour,
Je ne m'y connais pas en Qt, mais je dirais que la gestion de la souris n'a rien a faire dans la fonction Paint!
Si tu as une fonction qui gère les mouvements de la souris (comme glutMouseFunc(mouse) avec la GLUT), enregistre sa position dans une variable globale (pour qu'elle soit accessible de ta fonction qui remet le monde a jour) et remet la a sa place de suite.
Marsh Posté le 30-03-2010 à 20:01:04
ça change rien.
à mon avis c'est vraiment le QCursor::setPos() qui interfère avec le mouvement de la souris, mais je sais pas comment changer ça...
Marsh Posté le 31-03-2010 à 12:44:48
Citation : |
En faite je trouve ta gestion de la souris bizarre:
Si j'ai bien compris, tu n'initialises pas la souris au centre au début et tu ne l'y replaces que lorsqu'elle s'approche trop du centre!
Je crois que ce qu'il faut faire a chaque boucle:
1- positionner la souris au milieu de la fenetre
2- calculer deltax et deltay, correspondant a la nouvelle position de la souris - la position au centre de la fenetre
3- repositionner la souris au centre de la fenetre
4- utiliser deltax et deltay pour gerer la camera
Marsh Posté le 03-04-2010 à 14:26:07
c'est ce que je voulais faire au début, mais ça marche pas : rien ne bouge, deltaX et deltaY sont toujours égal à 0. je pense que c'est du à la façon dont Qt gère la souris...
Marsh Posté le 03-04-2010 à 14:56:07
"c'est ce que je voulais faire au début, mais ça marche pas : rien ne bouge, deltaX et deltaY sont toujours égal à 0. je pense que c'est du à la façon dont Qt gère la souris... "
Je pourrais pas tester mais je voudrais bien voir le code...
Marsh Posté le 08-04-2010 à 15:18:39
voilà ça devait être à peu près ça :
Citation : void COGLSpace::paintGL() |
en fait c'est la même chose sans tester si la souris est encore dans la fenêtre avant de la reseter...
Marsh Posté le 08-04-2010 à 16:07:31
En fait on utilise une fonction idle qui est appelée quand il n'y a aucun autre message à traiter. Ci dessous est une partie d'un programme utilisant la glut montrant le principe: lorsque le programme n'a pas de message à traiter, motion() est appelée et recalcule l'angle de la caméra en fonction de la position de la souris. A la fin on demande une mise à jour de l'affichage (et donc appel indirect a display() ). Le curseur de la souris (visible) saute une peu mais l'animation est fluide.
Par contre, le repositionnement souris est fait par les fonctions de l'api windows directement. Et toi es tu sous windows, linux? fais tu ton programme pour qu'il soit indépendant du système? Si non essai la gestion de la souris avec api native?
Code :
|
Marsh Posté le 13-04-2010 à 15:00:48
merci pour ta réponse, je suis sur mac osx mais je sais pas a priori sur quel système le soft va être utilisé donc il doit impérativement être multiplateforme, d'où l'utilisation de Qt.
Marsh Posté le 30-03-2010 à 12:39:15
salut, j'essaie de faire un camera free fly en qt, ça marche presque mais un détail bug encore:
quand je fais un QCursor::setPos(x, y) pour pas que ma souris atteigne le bord de l'écran, il semble que ça interrompt le mouvement de la souris et du coup le déplacement accuse un accoup. Est-ce que quelqu'un à une idée pour régler ce problème??
voilà le code en cause :
void COGLSpace::paintGL()
{
glMatrixMode( GL_PROJECTION );
glLoadIdentity( );
gluPerspective(21.5, 1.0 ,0.001,10000);
glEnable(GL_DEPTH_TEST);
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
glMatrixMode( GL_MODELVIEW );
glLoadIdentity( );
// QPoint globalCursorPos = QCursor::pos();
QPoint localCursorPos = this->mapFromGlobal(QCursor::pos());
double newX = localCursorPos.x();
double newY = localCursorPos.y();
double relativeX = newX - m_mouseX;
std::cout << newX << " - " << m_mouseX << " = " << relativeX << "\n";
double relativeY = newY - m_mouseY;
std::cout << newY << " - " << m_mouseY << " = " << relativeY << "\n";
m_fpsCamera->updateDir(relativeX, relativeY);
if(width()/4 < newX && newX < (3*width())/4 && height()/4 < newY && newY < (3*height())/4){
m_mouseX = newX;
m_mouseY = newY;
}else{
setMouseTracking(false);
QCursor::setPos(this->mapToGlobal(QPoint(width()/2, height()/2)));
setMouseTracking(true);
this->grabMouse();
m_mouseX = width()/2;
m_mouseY = height()/2;
}
m_fpsCamera->updatePos(m_fpsCameraMoves);
// m_fpsCamera->updateDir(m_relativeX, m_relativeY);
const double* cameraPosition = m_fpsCamera->getPosition();
const double* cameraDirection = m_fpsCamera->getDirection();
// std::cout << "in paint gl pos = " << cameraPosition[0] << "/"
// << cameraPosition[1] << "/" << cameraPosition[2] << "\n";
// std::cout << "in paint gl dir = " << cameraDirection[0] << "/"
// << cameraDirection[1] << "/" << cameraDirection[2] << "\n";
gluLookAt(cameraPosition[0], cameraPosition[1], cameraPosition[2],
cameraPosition[0]+cameraDirection[0], cameraPosition[1]+cameraDirection[1], cameraPosition[2]+cameraDirection[2],
0, 0, 1);
glLineWidth(3.0);
glBegin(GL_LINES);
glColor3f(1.0f,0.0f,0.0f); // red x axis
glVertex3f(0.0,0.0,0.0);
glVertex3f(0.1,0.0,0.0);
glColor3f(0.0f,1.0f,0.0f); // green y axis
glVertex3f(0.0,0.0,0.0);
glVertex3f(0.0,0.1,0.0);
glColor3f(0.0f,0.0f,1.0f); // blue z axis
glVertex3f(0.0,0.0,0.0);
glVertex3f(0.0,0.0,0.1);
glEnd();
if ( m_pOGLTiles != NULL )
{
glPushMatrix();
glTranslatef(-m_cloudCenter[0], -m_cloudCenter[1], -m_cloudCenter[2]);
displayCloud( m_pOGLTiles );
if ( m_bPickState ){
if ( m_iID > -1 && m_iID < m_pOGLTiles->m_iNbrPoints ){
displayPickObjects();
}
}
glPopMatrix();
}
glFlush();
}
merci d'avance pour vos réponses!