La configuration d'un appareil photo en OpenGL

J'ai travaillé sur un moteur de jeu pour un certain temps. J'ai commencé avec des Graphismes en 2D avec juste SDL, mais j'ai été peu à peu évoluer vers des fonctionnalités 3D en utilisant OpenGL. La plupart de la documentation que j'ai vu sur "la manière de faire les choses," utiliser GLUT, dont je ne suis pas à l'aide.

La question est de savoir comment puis-je créer un "appareil photo" dans OpenGL que je pouvais déplacer dans un environnement 3D et de bon affichage des modèles 3D ainsi que des sprites (par exemple, un sprite qui a une position fixe et rotation). Quelles sont les fonctions devrais-je être inquiet pour l'installation d'une caméra dans OpenGL caméra et dans quel ordre doivent-ils être appelé?

Voici quelques informations menant à pourquoi j'ai envie d'une caméra.

Pour dessiner un simple sprite, j'ai créer un GL texture à partir d'une surface SDL et je dessine sur l'écran les coordonnées de (SpriteX-CameraX) et (SpriteY-CameraY). Cela fonctionne bien, mais si on se déplace vers réelles des modèles 3D ne fonctionne pas tout à fait droit. L'emplacement des caméras est une coutume vecteur de la classe (c'est à dire n'utilisant pas les bibliothèques standard) avec X, Y, Z entiers composants.

J'ai un cube 3D composé de triangles et par lui-même, je peux le dessiner et de le faire tourner et je peux déplacer le cube (bien que de façon un peu maladroite) en passant par la position de la caméra lorsque je dessine le modèle et l'aide que les composants de l'emplacement de vecteur pour calculer les modèles de la position. Problèmes devenu évident avec cette approche, quand je vais pour faire pivoter le modèle. L'origine du modèle n'est pas le modèle lui-même, mais semble être à l'origine de l'écran. Quelques recherches sur google m'indique que je dois enregistrer la position du modèle, le faire tourner sur l'origine, puis restaurer le modèle de son origal emplacement.

Au lieu de passer dans l'emplacement de mon appareil photo et de calcul où les choses doivent être établis dans la Fenêtre d'affichage par calcul de nouveaux sommets, j'ai pensé que je voudrais créer un OpenGL "caméra" pour le faire pour moi, donc tous j'aurais besoin de faire est de passer dans les coordonnées de mon Appareil photo de l'objet dans l'OpenGL caméra et il serait de traduire le point de vue automatiquement. Cette tâche semble être très facile si vous utilisez GLUT mais je ne suis pas sûr de savoir comment mettre en place une caméra juste en utilisant OpenGL.

EDIT #1 (d'après certains commentaires):
À la suite de certaines suggestion, voici la mise à jour de la méthode qui est appelée tout au long de mon programme. Son été mis à jour afin de créer une perspective et vue sur les matrices. Tout le dessin qui se passe avant que cela s'appelle. Et un ensemble de méthodes est exécutée lors de l'OpenGL exécute (moins l'échange de mémoire tampon). X,y,z les coordonnées sont directement une instance de l'Appareil et de son emplacement vecteur. Si la caméra était à l' (256, 32, 0) 256, 32 et 0 serait passé dans la méthode de mise à Jour. Actuellement, z est définie à 0 comme il n'existe aucun moyen de modifier cette valeur à l'heure actuelle. Le modèle 3D dessinée est un ensemble de sommets/triangles + les normales à la position X=320, Y=240, Z=-128. Lorsque le programme est exécuté, c'est ce qui est établi dans REMPLIR mode, puis dans LIGNE mode et un autre dans REMPLIR après le mouvement, quand je bouge la caméra un peu vers la droite. Il aime comme peuvent Normales peut être la cause, mais je pense qu'il a plus à voir avec moi, manquant de quelque chose d'extrêmement important ou pas complètement à la compréhension de la de PRÈS et de LOIN paramètres pour glFrustum réellement faire.

Avant j'ai mis en place ces changements, j'ai été en utilisant glOrtho et le cube rendu correctement. Maintenant, si je passe aux glOrtho, une face rend (en Vert) et la rotation est assez bizarre, probablement en raison de la traduction. Le cube a 6 couleurs différentes, une pour chaque côté. Rouge, Bleu, Vert, Cyan, Blanc et Violet.

int VideoWindow::Update(double x, double y, double z)
{
    glMatrixMode( GL_PROJECTION );
    glLoadIdentity();

    glFrustum(0.0f, GetWidth(), GetHeight(), 0.0f, 32.0f, 192.0f);


    glMatrixMode( GL_MODELVIEW );

    SDL_GL_SwapBuffers();  
    glLoadIdentity();
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    glRotatef(0, 1.0f, 0.0f, 0.0f);
    glRotatef(0, 0.0f, 1.0f, 0.0f);
    glRotatef(0, 0.0f, 0.0f, 1.0f);
    glTranslated(-x, -y, 0);

    return 0;
}

EDIT FINAL:
Le problème s'est avéré être un problème de Près et de Loin les arguments de glFrustum et la valeur Z de glTranslated. Alors que changer les valeurs de a fixé, je vais probablement pour en savoir plus sur la relation entre les deux fonctions.

OriginalL'auteur Dalin Seivewright | 2009-11-04