Proyecciones
Proyecciones
• La matriz de proyección especifica el tamaño y forma del volumen de visualización
glMatrixMode(GL_PROJECTION); // reseteamos la matriz glLoadIdentity(); // actualizamos la matriz glOrtho(0,200,0,100,1,-1);
y (0,100,1)
(200,0,-1) x z
•
La matriz de transformación a ventana mapea la foto final sobre el área de pantalla especificada
glViewport(0, 0, 250,250);
250
250
Orden de las matrices
x y z w
Mm
Matriz de modelado
xm ym zm wm
Mp
Matriz de proyección
xp yp zp wp
Mv
Matriz de mapeo
xv yv zv wv
P’ = Mv · Mp · Mm · P
void CALLBACK EscalaVentana(GLsizei w, GLsizei h) { // Matriz de mapeo de ventana glViewport(0, 0, w, h); // Matriz de proyección glMatrixMode(GL_PROJECTION); glLoadIdentity();glOrtho(0,250,0,250,1,-1);
Mv
Matriz de mapeo
Mp
Matriz de proyección
}
void CALLBACK DibujaEscena() { // Matriz de modelado glClear (GL_COLOR_BUFFER_BIT); glMatrixMode (GL_MODELVIEW); glLoadIdentity(); glRotatef(angulo,0,1,0); glTranslatef(-70,0,0); ... }
Mm
Matriz de modelado
Proyección paralela / perspectiva
• Proyección paralela
•
Proyección perspectiva
Proyección perspectiva enOpenGL
• • El ojo siempre está en el origen La dirección de vista es la que une el ojo con el centro de la ventana
void glFrustum(GLdouble x1, GLdouble x2, GLdouble y1, GLdouble y2, GLdouble z1, GLdouble z2);
( , , z2)
y
(x1, y2, z1)
z
(0,0,0) (x2, y1, z1)
x
Proyección perspectiva usando la GLU
• • • Es otra forma alternativa de especificar el volumen de visualización Elojo sigue estando en el origen La dirección de vista coincide con el eje z
void gluPerspective(GLdouble angulo, GLdouble aspecto, GLdouble z1, GLdouble z2);
Z = z2
y
Z = z1
angulo
z
(0,0,0)
h w
x
aspecto = w / h
void CALLBACK EscalaVentana(GLsizei w, GLsizei h) { // Evita una división por cero if (h == 0) h = 1; // Ajusta la vista a las dimensiones de la ventanaglViewport(0, 0, w, h); // Reinicia la matriz de proyección glMatrixMode(GL_PROJECTION); glLoadIdentity(); // Establece el volumen de trabajo aspecto = (GLfloat) w / h; gluPerspective (60,aspecto,1,400); }
Transformación de vista
• Una vez definido el volumen de visualización, el ojo se encuentra en el origen, mirando en la dirección negativa del eje z
y y' z
(0,0,0)
z' x'
(ox,oy,oz)
x •Para obtener la proyección desde otra posición y desde otra dirección de vista, hay que especificar una transformación de vista
Transformación de vista en OpenGL
• Para definir la transformación de vista se usa:
void gluLookAt(GLdouble ox, GLdouble oy, GLdouble oz, GLdouble cx, GLdouble cy, GLdouble cz, GLdouble vx, GLdouble vy, GLdouble vz);
y =
(cx, cy, cz)
z
(ox, oy, oz)
xEjemplo: Implementación de un navegador 3D
Brújula
Radar
Vista 3D
Panel de vista
void PanelVista_Resize(TObject *Sender) { GLsizei w = PanelVista->Width; GLsizei h = PanelVista->Height; GLdouble aspecto; // Mapeo de la ventana glViewport(0, 0, w, h); // Inicialización de la matriz de proyección glMatrixMode(GL_PROJECTION); glLoadIdentity(); aspecto = (GLdouble) w/h;gluPerspective(35.0, aspecto, 1, 2000); // Inicialización de la matriz de modelado glMatrixMode(GL_MODELVIEW); glLoadIdentity(); }
// estructura de datos del tanque y del robot struct OBJETO { GLfloat x,z; // posiciones x y z del objeto Gldouble ori; // ángulo de orientación del objeto } tanque, robot, viewer;
void PanelVista_Paint(TObject *Sender) { glPushMatrix(); glClear(GL_COLOR_BUFFER_BIT); //Transformación de vista gluLookAt (viewer->x, 5.0f, viewer->z, viewer->x+cos(viewer->ori), 5, viewer->z-sin(viewer->ori), 0.0f, 1.0f, 0.0f); // dibujamos todos los objetos RenderWorld(); glPopMatrix(); }
// Dibuja la escena completa void RenderWorld() { // Dibuja todo en verde glColor3f(0,255,0); // Dibuja el suelo DrawGround(); // Coloca los objetos PlacePyramids(); PlaceSlabs(); PlacePillers();...
Regístrate para leer el documento completo.