2010-11-14 14 views
5

Quiero mostrar modelos de diferentes tamaños en una vista, de modo que todo el modelo esté visible dentro de la pantalla.
¿Cuál es la mejor manera de hacerlo? He intentado escalar (usando glScale) el modelo usando esta fórmulaEncajar modelo 3D dentro de una ventana

scaleFactor = (screenSize/(maxModelSize * constant)) 

donde el tamaño es la altura o anchura, dependiendo de lo que es más grande.
constante es 1/(length of one screen pixel in OpenGL units)
Hay dos problemas con este:
1. después de hacer algunas transformaciones, quiero ser capaz de volver a esta escala inicial (modelo se escala para ajustarse a la ventana) usando la identidad. Actualmente, la identidad de llamada llevará el modelo a sus dimensiones originales (antes de la escala de "fijación").
2. La "constante" es algo que obtuve por ensayo y error, me parece un método incorrecto. También sospecho que no es una constante en absoluto, y depende de la resolución de la pantalla y Dios sabe qué más.

+0

"Después de hacer algunas transformaciones, quiero ser capaz de volver a esta escala inicial (modelo es escalado para ajustarse a la ventana) usando Identity. La identidad de llamada actual traerá el modelo a sus dimensiones originales (antes de la escala de "fijación"). Esto me sugiere que está escalando la matriz ModelView. ¿Tal vez deberías intentar escalar la matriz de proyección en su lugar? En otras palabras, crea una cámara más grande, no un modelo más pequeño. – Zecc

Respuesta

9

Section 8.070:

El siguiente es de una publicación por de Dave Shreiner sobre la configuración de un sistema de visión básica:

En primer lugar, calcular una esfera delimitador para todos los objetos en la escena. Esto debería proporcionarle dos bits de información : el centro de la esfera (sea (c.x, c.y, c.z) ese punto) y su diámetro (llámalo "diam").

A continuación, seleccione un valor para el plano de recorte zNear . Las pautas generales son para elegir algo más grande que, pero cerca de 1.0. Por lo tanto, digamos que se establece

zNear = 1.0; zFar = zNear + diam; 

Estructura de su matriz de llama en este orden (para una proyección ortográfica ):

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(); 

Este enfoque debería centrar sus objetos en el centro de la ventana y estírelos para ajustarlos (es decir, es asumiendo que está usando una ventana con relación de aspecto = 1.0). Si la ventana de no es cuadrada, calcular la izquierda, derecha, abajo y arriba, como antes, y puesto en la siguiente lógica antes de la llamada a glOrtho():

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

El código anterior debe coloque los objetos apropiadamente en su escena. Si tiene la intención de manipular (es decir, rotar, etc.), debe agregarle una transformación de visualización .

Una visión típica transformar saldrá a la la matriz modelview y podría ser así:

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

¿Qué pasa con el caso donde la proyección es perspectiva? – elect

Cuestiones relacionadas