2015-09-14 5 views
2

J'essaie de définir une bonne distance pour la vue complète d'un disque de particules et dans le même temps avoir une échelle de ligne valide qui représente la valeur actuelle de l'échelle du disque en tant que fonction de zoomer avec la souris.OpenGL - régler une bonne distance sans glScalef

La scène a les paramètres suivants:

w_width = 600; 
w_height = 600; 
g_nearPlane = 0.1f; 
g_farPlane = 1000.0f; 

je fais graphiques initialisation de la scène 3D avec l'échantillon de code suivant:

// Reset line scale value 
lineScaleValue = 100.0f; 
// Initialize View 
glViewport(0, 0, w_width, w_height); 

glMatrixMode(GL_PROJECTION); // Select The Projection Matrix 
glLoadIdentity(); // Reset The Projection Matrix 

// Perspective with angle set to 45 degrees 
gluPerspective(45.0f, (float) w_width/w_height, g_nearPlane, g_farPlane); 

glMatrixMode(GL_MODELVIEW); // Select The Modelview Matrix 
glLoadIdentity(); // Reset The Modelview Matrixi 

gluLookAt (0.0, 0.0, 3, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0); 
glScalef(0.03f, 0.03f, 0.03f); 

Les valeurs ci-dessus pour gluLookAt et glScalef ont été choisis environ, c'est-à-dire manuellement sans avoir un calcul précis.

Je voudrais avoir seulement une vue complète pour le disque (particules blanches). Pour cela, je connais le maximum et le minimum dans le plan (x, y) du disque: -25 < x <25 et -22 < y < 22.

de ce poste set z good distance, je pouvais le faire (avec FOV/2 = 45 degrés):

z_distance = 25*tan(pi/4) + dist = 50 

avec dist = 25 être en face du disque.

Alors puis-je faire directement dans mon exemple de code (au lieu de

gluLookAt (0.0, 0.0, 3, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0); 
    glScalef(0.03f, 0.03f, 0.03f); 

):

gluLookAt (0.0, 0.0, 50, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0); 

?

Merci

+0

Quelles sont les dimensions exactes du disque et à quelle position de l'espace mondial le dessinez-vous? – derhass

+0

les dimensions exactes du disque sont -25 youpilat13

Répondre

0

La distance optimale peut être calculée par la formule donnée dans le poste que vous avez déjà lié (ne sais pas comment vous êtes arrivé à l'équation de z_distance?):

visible_range = 2 * tan(fov/2) * distance 

Dans votre cas:

visible_range = 50 (-25 to 25) 
=> 
50 = 2 * tan(fov/2) * distance 
distance = 50/(2 * tan(fov/2)) = 25/tan(fov/2) 

Depuis le champ de vision de la moitié est en vous cas 45 ° et tan (45 °) = 1, la solution optimale est

distance = 25