Proyecciones

Solo disponible en BuenasTareas
  • Páginas : 5 (1120 palabras )
  • Descarga(s) : 0
  • Publicado : 1 de febrero de 2012
Leer documento completo
Vista previa del texto
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)

x Ejemplo: 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();...
tracking img