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
Vous devez vous connecter pour publier un commentaire.
Vous avez besoin d'une matrice de vue, et une matrice de projection. Vous pouvez le faire de deux façons:
De charge de la matrice de vous-même, à l'aide de
glMatrixMode()
etglLoadMatrixf()
, après l'utilisation de votre propre bibliothèque de calculer les matrices.Utiliser des combinaisons de
glMatrixMode(GL_MODELVIEW)
etglTranslate()
/glRotate()
pour créer votre matrice de vue, etglMatrixMode(GL_PROJECTION)
avecglFrustum()
pour créer votre matrice de projection. Rappelez - vous, votre matrice de vue est le négatif de la traduction de votre position de la caméra (Comme c'est l'endroit où vous devez déplacer les monde à par rapport à la caméra d'origine), ainsi que toutes les rotations appliquées (tangage/lacet).Espère que cette aide, si j'avais plus de temps je ferais de vous un bon exemple!
En fait la question est vraiment avec les valeurs que je chercher pour le Proche et le Lointain arguments pour glFrustum ainsi que la valeur de Z est passé dans glTranslated. Merci.
OriginalL'auteur tsalter
Que vous avez à faire à l'aide de la matrice de pile pour objet de hiérarchie,
mais la caméra est à l'intérieur de la hiérarchie de sorte que vous avez à mettre la transformation inverse sur la pile avant de dessiner les objets openGL utilise uniquement la matrice de la 3D à la caméra.
OriginalL'auteur fa.
Si vous n'avez pas vérifié alors cherchez peut-être à la suite du projet permettrait d'expliquer en détail ce "tsalter", a écrit dans son post.
Caméra de OGL SDK (CodeColony)
Aussi regarder le livre Rouge pour les explication sur l'affichage et comment le modèle-vue et la projection de la matrice va vous aider à créer une caméra. Il commence par une bonne comparaison entre les résultats réels de la caméra et de ce qui correspond à l'API OpenGL. Chapitre 3 - Visualisation
OriginalL'auteur Ketan