2011-11-12 3 views
2

Vous avez intégré ce tutoriel de caméra http://www.swiftless.com/tutorials/opengl/camera2.html et vous avez un peu de mal à centrer la caméra dans la skybox.Position de la caméra OpenGL et skybox

En utilisant ce code ci-dessous fait mon appareil photo dans la boîte:

void reshape(int w, int h) 
{ 
    glViewport(0, 0, (GLsizei) w, (GLsizei) h); 
    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    if (w <= h) 
     glOrtho(-1.0, 1.0, -1.0*(GLfloat)h/(GLfloat)w, 
       1.0*(GLfloat)h/(GLfloat)w, -10.0, 10.0); 
    else 
     glOrtho(-1.0*(GLfloat)w/(GLfloat)h, 
       1.0*(GLfloat)w/(GLfloat)h, -1.0, 1.0, -10.0, 10.0); 
    glMatrixMode(GL_MODELVIEW); 
} 

Pour dessiner le skybox, je suivais ce tutoriel: http://sidvind.com/wiki/Skybox_tutorial J'ai essayé de traduire des objets plus près de la caméra, mais n » Je ne travaille pas comme prévu. Maintenant, je ne suis pas sûr de ce que je dois faire.

Appréciez toute aide.

Répondre

2

Premièrement: N'appliquez pas la projection dans le gestionnaire de remodelage. Sinon, des choses simples semblent impossibles (comme faire une skybox). Deuxièmement: Pour qu'une skybox fonctionne, vous devez utiliser la même projection que pour le rendu du reste de la scène. Ce que vous devez changer est la traduction de la vue du modèle à 0, tout en gardant l'orientation de la caméra.

Pour ce faire, définissez la dernière colonne de la matrice modelview sur (0,0,0,1).

Cela fait donc votre code de rendu comme ceci:

void render_skybox() 
{ 

    push_modelview(); 
    set_modelview_column(3, 0, 0, 1); 
    draw_skybox(); 
    pop_modelview(); 

} 

void render() 
{ 
    set_viewport(); 
    set_projection(); 

    apply_camera_transform(); 

    render_skybox(); 
    render_scene(); 
} 
+0

Alors, que devrait être dans Reshape()? J'ai ajouté mon affichage() pour que vous puissiez voir ce que je fais. – user985351

+0

@ user985351: Croyez-le ou non, en utilisant GLUT, je n'utilise pas du tout de reshape. Au lieu de cela j'utilise glutGet (GLUT_WINDOW_WIDTH) et glutGet (GLUT_WINDOW_HEIGHT) dans l'affichage pour obtenir cette information. – datenwolf