2010-11-14 5 views
5

Je souhaite afficher des modèles de différentes tailles dans une vue, de sorte que le modèle entier soit visible à l'intérieur de l'écran.
Quelle est la meilleure façon de le faire? Je essayé de mise à l'échelle (à l'aide glScale) le modèle en utilisant cette formuleAjuster le modèle 3D à l'intérieur d'une fenêtre

scaleFactor = (screenSize/(maxModelSize * constant)) 

où la taille est la hauteur ou la largeur, en fonction de ce qui est plus grand.
Constant est 1/(length of one screen pixel in OpenGL units)
Il y a deux problèmes:
1. Après avoir fait quelques transformations, je veux être en mesure de revenir à cette échelle initiale (modèle est redimensionnée à la taille fenêtre) à l'aide d'identité. L'identité en cours d'appel amènera le modèle à ses dimensions d'origine (avant l'échelle de "fixation").
2. La "constante" est quelque chose que j'ai obtenu par essais et erreurs, je me sens mal méthode. Je soupçonne également que ce n'est pas une constante du tout, et dépend de la résolution de l'écran et dieu sait quoi d'autre.

+0

« Après avoir fait quelques transformations, je veux être en mesure de revenir à cette échelle initiale (modèle L'identité d'appel en cours ramène le modèle à ses dimensions d'origine (avant l'échelle de "fixation"). " Cela me suggère que vous mettez à l'échelle la matrice ModelView. Peut-être devriez-vous essayer de mettre à l'échelle la matrice de projection à la place? En d'autres termes, faites un appareil photo plus grand, pas un modèle plus petit. – Zecc

Répondre

9

Section 8.070:

Ce qui suit est d'un affichage par Dave Shreiner sur la mise en place d'un système de visualisation de base:

En premier lieu, calculer une sphère de délimitation pour tous les objets de votre scène. Cela devrait vous fournir deux bits de informations: le centre de la sphère (Soit (c.x, c.y, c.z) être ce point) et son diamètre (appelons-le "diam").

Ensuite, choisissez une valeur pour le plan de découpe zNear . Les directives générales sont pour choisir quelque chose de plus grand que, mais proche de 1.0. Alors, disons que vous définissez

zNear = 1.0; zFar = zNear + diam; 

Structurez votre matrice appelle dans cet ordre (pour une projection orthographiques ):

GLdouble left = c.x - diam; 
GLdouble right = c.x + diam; 
GLdouble bottom c.y - diam; 
GLdouble top = c.y + diam; 
glMatrixMode(GL_PROJECTION); 
glLoadIdentity(); 
glOrtho(left, right, bottom, top, zNear, zFar); 
glMatrixMode(GL_MODELVIEW); 
glLoadIdentity(); 

Cette approche devrait centrer vos objets au milieu de la fenêtre Et étirez-les pour s'adapter (c'est-à-dire, en supposant que vous utilisez une fenêtre avec le rapport d'aspect = 1.0).

GLdouble aspect = (GLdouble) windowWidth/windowHeight; 
if (aspect < 1.0) { 
    // window taller than wide 
    bottom /= aspect; 
    top /= aspect; 
} else { 
    left *= aspect; 
    right *= aspect; 
} 

Le code ci-dessus devrait: Si votre fenêtre est pas carrée, gauche calculer, droite, en bas et en haut, comme ci-dessus, et mettre dans la logique suivante avant l'appel à glOrtho() positionnez les objets dans votre scène de manière appropriée. Si vous avez l'intention de manipuler (par exemple, pivoter, etc.), vous devez ajouter une transformation de visualisation .

Une vision typique de transformation se poursuivra la matrice MODELVIEW et pourrait ressembler comme ceci:

GluLookAt (0., 0., 2.*diam, c.x, c.y, c.z, 0.0, 1.0, 0.0); 
+0

Qu'en est-il du cas où la projection est en perspective? – elect

Questions connexes