2010-08-16 4 views
2

Je rencontre des problèmes avec un appareil photo que j'essaie d'utiliser dans mon programme. Quand je change le camera_target de l'appel gluLookAt, tout mon terrain tourne au lieu de tourner la caméra comme elle le devrait.Rotation de l'appareil photo (OpenGL)

Voici une partie de ma méthode render:

camera->Place(); 

    ofSetColor(255, 255, 255, 255); 

//draw axis lines 
//x-axis 
glBegin(GL_LINES); 
glColor3f(1.0f,0.0f,0.0f); 
glVertex3f(0.0f,0.0f,0.0f); 
glVertex3f(100.0f, 0.0f,0.0f); 
glEnd(); 

//y-axis 
glBegin(GL_LINES); 
glColor3f(0.0f,1.0f,0.0f); 
glVertex3f(0.0f,0.0f,0.0f); 
glVertex3f(0.0f, 100.0f,0.0f); 
glEnd(); 

//z-axis 
glBegin(GL_LINES); 
glColor3f(0.0f,0.0f,1.0f); 
glVertex3f(0.0f,0.0f,0.0f); 
glVertex3f(0.0f, 0.0f,100.0f); 
glEnd(); 

glColor3f(1,1,1); 

terrain->Draw(); 

Et Pivoter et place de méthodes de ma classe de la caméra:

void Camera::RotateCamera(float h, float v){ 
hRadians += h; 
vRadians += v; 

cam_target.y = cam_position.y+(float)(radius*sin(vRadians)); 
cam_target.x = cam_position.x+(float)(radius*cos(vRadians)*cos(hRadians)); 
cam_target.z = cam_position.z+(float)(radius*cos(vRadians)*sin(hRadians)); 

cam_up.x = cam_position.x-cam_target.x; 
cam_up.y = ABS(cam_position.y+(float)(radius*sin(vRadians+PI/2))) ; 
cam_up.z = cam_position.z-cam_target.z; 
} 

void Camera::Place() { 
//position, camera target, up vector 
gluLookAt(cam_position.x, cam_position.y, cam_position.z, cam_target.x, cam_target.y, cam_target.z, cam_up.x, cam_up.y, cam_up.z); 
} 

Le problème est que tout le terrain se déplace autour de la caméra , alors que la caméra devrait juste tourner.

Merci pour toute aide!

EDIT - Trouvé quelques didacticiels et en tenant compte des réponses ici, je fais une meilleure classe de la caméra. Merci les gars

+0

Dans opengl - Je pensais que la caméra était fixe et vous avez fait pivoter le terrain? – naiad

+0

Je pensais que le gluLookAt s'occuperait de ça. – paintstripper

+7

En Russie soviétique, la caméra tourne VOUS! – James

Répondre

1

Du POV du terrain, oui, la caméra tourne. Mais, puisque votre vue est à partir du POV de la caméra, lorsque vous faites pivoter la caméra, il semble que le terrain tourne. C'est le comportement que gluLookAt() est destiné à produire. S'il y a autre chose que vous attendiez, vous devrez faire pivoter uniquement la géométrie que vous voulez faire pivoter, et ne pas essayer de faire pivoter en utilisant gluLookAt().

Mise à jour 1: Sur la base de la discussion ci-dessous, essayez ceci:

void Camera::RotateCamera(float h, float v) 
{ 
    hRadians += h; 
    vRadians += v; 

    cam_norm.x = cos(vRadians) * sin(hRadians); 
    cam_norm.y = -sin(vRadians); 
    cam_norm.z = cos(vRadians) * sin(hRadians); 

    cam_up.x = sin(vRadians) * sin(hRadians); 
    cam_up.y = cos(vRadians); 
    cam_up.z = sin(vRadians) * cos(hRadians); 
} 

void Camera::Place() 
{ 
    //position, camera target, up vector 
    gluLookAt(cam_pos.x, cam_pos.y, cam_pos.z, 
      cam_pos.x+cam_norm.x, cam+pos.y+cam_norm.y, camp_pos.z+cam_norm.z, 
      cam_up.x, cam_up.y, cam_up.z); 
} 

Séparer la caméra normale (la direction de la caméra est à la recherche) de la position vous permet de changer indépendamment la position, panoramique et d'inclinaison. .. c'est-à-dire, vous pouvez changer la position sans avoir à recalculer les vecteurs normal et haut.

Avertissement: Ceci est non testé, tout ce que je pouvais faire sur le dos d'une feuille de papier. Il suppose un système de coordonnées droitier et que la rotation panoramique est appliquée avant l'inclinaison.

Mise à jour 2: Dérivée algèbre linéaire plutôt que la géométrie ... encore une fois, non testé, mais j'ai plus de confiance dans ce domaine.

+0

Je pensais que c'était censé donner un "panoramique" avec l'appareil photo dans une position, pas en orbite autour de la cible. Comment vais-je faire cela? – paintstripper

+0

Bon, je vois ce que vous dites maintenant. En supposant qu'il n'y a pas d'autres transformations sur le terrain, et que vous êtes en orbite autour du terrain, votre position de caméra change. Regardez dans votre code les endroits où votre position de caméra change ou où il y a d'autres transformations qui pourraient déplacer le terrain. Votre appel à gluLookAt() semble être correct, compte tenu de ce que vous avez posté. – andand

+0

@Paintstripper: Une autre chose, la façon dont j'utilise généralement gluLookAt() pour une classe de caméra est de lui donner une position (X, Y, Z) et une orientation (Y, P, R) (pour le lacet, le tangage et le roulis , bien que vous puissiez utiliser Rx, Ry et Rz pour la rotation autour de X, Y et Z respectivement). J'applique ensuite les rotations respectives pour le vecteur normal (0, 0, 1) et le vecteur haut (0, 1, 0). Encore une fois, je ne vois rien d'intrinsèquement mauvais dans la façon dont vous l'avez fait, bien que je puisse utiliser une meilleure compréhension de vos pensées pour le calcul de cam_up.y. – andand

0

Eh bien, la rotation de la caméra ou en orbite autour du terrain autour de la caméra regarde essentiellement les mêmes. Si vous souhaitez orbiter la caméra autour d'un point de terrain fixe, vous devez modifier la position de la caméra, pas la cible.

0

devrait-il pas être ?: Peut-être

 
cam_up.x = cam_target.x - cam_position.x; 

cam_up.y = ABS(cam_position.y+(float)(radius*sin(vRadians+PI/2))) ; 

cam_up.z = cam_target.z - cam_position.z; 

vous devez normaliser cam_up aussi bien. HTH