2012-06-12 4 views
1

J'utilise OpenGL dans Qt via le QGLWidget, et j'essaie d'implémenter une interaction de base avec la souris et le clavier. Par exemple, les touches fléchées du clavier seront utilisées pour «faire un panoramique» sur la scène, la molette de la souris pour zoomer sur la scène et la souris pour faire pivoter le modèle.OpenGL - comment déplacer la scène en réponse à la saisie de la souris à l'aide de gluLookAt

J'ai trouvé comment implémenter le panoramique et le zoom, mais j'ai du mal à implémenter la rotation.

C'est ce que j'ai jusqu'à présent:

void MyGLWidget::paintGL() { 
    glLoadIdentity(); 
    gluLookAt(0+camDelta[0],0+camDelta[1],-100+camDelta[2],centerCoords[0]+lookAtDelta[0],centerCoords[1]+lookAtDelta[1],centerCoords[2]+lookAtDelta[2],0,1,0); 
    // draw stuff here 
} 

Donc, fondamentalement, je mets les gluLookAt premiers paramètres, puis j'ai ajouté deux tableaux, float camDelta[3] et float lookAtDelta[3], pour suivre l'évolution de la position de la caméra et où il est regarder en réponse à l'interaction de l'utilisateur avec la scène.

Pour la molette de la souris, je fais:

void MyGLWidget::wheelEvent(QWheelEvent *event) { 
    camDelta[2] += (event->delta()/8.0/15.0) * WHEEL_DELTA; 
    lookAtDelta[2] += (event->delta()/8.0/15.0) * WHEEL_DELTA; 
    updateGL(); 
} 

De même dans MyGLWidget::keyPressEvent, je modifie le deltas' pour le panoramique gauche et à droite champ [0] et la deltas' [1] pour le panoramique de haut en bas. Donc, ma question est, comment puis-je implémenter quelque chose de similaire pour soutenir la rotation avec la souris? Je suis un peu confus, parce que je devine que je vais devoir changer d'une façon ou d'une autre non seulement où la caméra regarde mais aussi le vecteur haut, mais je n'ai pas vraiment une idée claire sur la façon de le faire.

+0

Salut Houbysoft, je suis également pour la fonctionnalité panoramique dans Android [je dois déplacer le GLSurfaceview en utilisant événement tactile]. Si vous avez une idée maintenant, SVP donner un exemple de code. il serait utile pour moi de compléter mon travail .. mon exemple de code ici.http: //www.mediafire.com/? 09f9q51xnqhq2l7.which – harikrishnan

Répondre

3

Ce que j'ai fait pour ce genre de choses s'appelle le modèle de caméra orbitale.

Vous gardez une trace de la position cible de la caméra (ou regardez), et 3 autres paramètres: azimut, déclinaison (ou inclinaison) et distance (ou rayon). L'azimut est la rotation de la caméra autour de la cible horizontalement (comme si la cible était sur le sol et que vous la faisiez en cercle tout en la regardant). La déclinaison est la rotation verticale. La distance est, bien, la distance entre la cible et la caméra.

Ils sont également appelés coordonnées sphériques:

http://mathworld.wolfram.com/SphericalCoordinates.html

Vous voulez que les équations comme ceci:

x = r * sin(phi) * cos(theta) 
y = r * sin(phi) * sin(theta) 
z = r * cos(phi) 

Où r est la distance, thêta est l'azimut et phi est la déclinaison . Ceci vous donne le décalage pour passer de la position de recherche de la caméra à la position de la caméra.

Alors, voici ce que vous faites. Gardez la position cible de la caméra, mais pas la position de la caméra. Lorsque vous effectuez un panoramique sur la caméra, déplacez la position cible. Lorsque vous faites pivoter la caméra, ajustez l'azimut et la déclinaison. Lorsque vous effectuez un zoom sur l'appareil photo, ajustez la distance. Ensuite, à chaque image avant d'appeler gluLookAt, calculez la position de la caméra en utilisant la formule ci-dessus. Vous venez d'ajouter x, y et z à la position cible.

+0

Salut ALan, je suis également à la recherche de fonctionnalités de panoramique dans Android. [Je dois déplacer GLSurfaceview utilisant un événement tactile]. Si vous avez une idée maintenant, SVP donner un exemple de code. il serait utile pour moi d'accomplir ma tâche. Je suis en lutte ici. mon exemple de code ici.http: //www.mediafire.com/? 09f9q51xnqhq2l7.which – harikrishnan

0

La meilleure approche pour cela est d'utiliser des quaternions. Comme les nombres complexes sont assez utiles pour tourner en 2D, les quaternions sont parfaits pour la rotation 3D.

La rotation standard autour de l'axe x, y, z peut fonctionner, elle se comportera de manière étrange et non comme prévu.

Vous pouvez obtenir un tutoriel bien tout cela à:. http://content.gpwiki.org/index.php/OpenGL:Tutorials:Using_Quaternions_to_represent_rotation

+0

Salut lvan, je suis également à la recherche de la fonctionnalité de panoramique dans Android. [J'ai besoin de déplacer le GLSurfaceview en utilisant l'événement tactile]. Si vous avez une idée maintenant, SVP donner un exemple de code. il serait utile pour moi d'accomplir ma tâche. Je suis en lutte ici. mon exemple de code ici.http: //www.mediafire.com/? 09f9q51xnqhq2l7.which – harikrishnan

Questions connexes