Practica 4 GC - Completo
Practica 4 GC - Completo
Fecha de entrega:
Domingo 08 - Septiembre - 2024
Equipo:
Contenido
Objetivos: ................................................................................................................................................................... 3
Cuestionario ............................................................................................................................................................... 3
Ejercicio 1: Trabajar sobre un proyecto ya creado, solo hay que realizar lo que se pide y si quieren lo pueden
mejorar con algún otro cuerpo geométrico. ............................................................................................................. 6
Ejercicio 2: Modifique la primitiva. Para el usuario. ................................................................................................ 11
Ejercicio 3: Modifique o complemente el código del piso o suelo a cuadros para agregar un carro en 2D. ........... 13
Ejercicio 4: Modifique o complemente el código del piso o suelo a cuadros para agregar una pelota que rebota.
................................................................................................................................................................................. 18
Ejercicio 5.- Esfera dentro de una caja. En este ejercicio, tienen que sacar la pelota ............................................ 23
cunado se abra la tapa de la caja. ............................................................................................................................ 23
Conclusiones individuales ........................................................................................................................................ 26
Ramirez Gomez Jordy Ariel 2202003390 ............................................................................................................. 26
Miguel Angel Ruiz Ruiz 2202000639 ................................................................................................................... 27
Contreras Torres Vania Alejandra 2203001309................................................................................................... 27
Ledesma Juarez Maria Elena 2193059980 .......................................................................................................... 27
Referencias ............................................................................................................................................................... 28
3
Objetivos:
Cuestionario
1. Investigue y reporte cómo se habilita el sistema de luces de OpenGL. Esto
es, que hacen las subrutinas glEnable() y los argumentos GL_LIGHTING
Y GL_LIGHTxx.
● Luz ambiente: Es una luz que no viene de una dirección específica y se dispersa
igualmente por todo el ambiente. Esta luz minimiza las sombras porque ilumina
todos los objetos por igual, sin importar su orientación.
● Reflexión difusa: Es la propiedad de los materiales para reflejar la luz en muchas
direcciones. No depende del punto de vista y es el resultado de la luz
dispersándose en muchas direcciones cuando choca con una superficie rugosa.
La reflexión difusa ocurre cuando la luz choca con una superficie y se dispersa en múltiples
direcciones. Esto hace que la superficie parezca igualmente iluminada desde cualquier ángulo
de visión, característica común en materiales como papel, tela o madera no barnizada.
0. Investigue y reporte el término “reflexión especular de la luz”.
Es lo que se produce cuando la luz se refleja en una superficie lisa y el reflejo depende
del ángulo de visión. Esto crea efectos como el brillo o los destellos en superficies
como metal o agua.
4
La función glMaterialfv() se utiliza para definir las propiedades del material que
afectan a cómo se renderiza bajo iluminación.
GLfloat ambient[] = {0.1f, 0.1f, 0.1f, 1.0f}; // Componente RGBA del
material ambiente
glMaterialfv(GL_FRONT, GL_AMBIENT, ambient);
Donde GL_AMBIENT: Define la reflectividad ambiente del material.
GLfloat diffuse[] = {0.8f, 0.8f, 0.8f, 1.0f}; // Componente RGBA del material
difuso
glMaterialfv(GL_FRONT, GL_DIFFUSE, diffuse);
Donde GL_DIFFUSE: Define la reflectividad difusa del material.
GLfloat specular[] = {1.0f, 1.0f, 1.0f, 1.0f}; // Componente RGBA del material
especular
glMaterialfv(GL_FRONT, GL_SPECULAR, specular);
GLfloat shininess = 50.0f; // Brillo del material
glMaterialf(GL_FRONT, GL_SHININESS, shininess);
Donde:
a. GL_SPECULAR: Define la reflectividad especular del material.
b. GL_SHININESS: Define el brillo de los reflejos especulares.
6
Ejercicio 1: Trabajar sobre un proyecto ya creado, solo hay que realizar lo que se pide y
/* los valores de los materiales se van a sumar para tener una totalidad, que antes se
multiplico a la luz
ambiente+difuso + especular*/
//Cuadric
GLUquadricObj* quadobj;
7
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
}
8
gluDeleteQuadric(quadobj);*/
}
GL_SMOOTH.
Imagen 3. Tras modificar el codigo anterior, generamos un cilindro extra que parece estar
más al fondo.
esta manera. El cilindro del fondo aparenta estar más oscuro, pues en teoría está más
alejado.
Ejercicio 3: Modifique o complemente el código del piso o suelo a cuadros para agregar
un carro en 2D.
#include <iostream>
#include <GL/glut.h>
float pos = 0;
int gr = 0;
void rueda_d() {
glPushMatrix();
glColor3f(0, 0, 0);
glTranslatef(1.5f, 0.0f, 0.0f);
glRotatef(gr, 0.0f, 0.0f, 1.0f);
glutSolidSphere(1.0f, 20, 20);
glPopMatrix();
}
void rueda_t() {
glPushMatrix();
glColor3f(0, 0, 0);
glTranslatef(5.5f, 0.0f, 0.0f);
glRotatef(gr, 0.0f, 0.0f, 1.0f);
glutSolidSphere(1.0f, 20, 20);
glPopMatrix();
}
void ventanas() {
glPushMatrix();
glColor3f(0, 0, 0);
glTranslatef(1.2f, 2.0f, 0.01f);
glBegin(GL_TRIANGLES);
glVertex3f(0.0f, 0.0f, 0.0f);
14
void techo() {
glPushMatrix();
glTranslatef(1.0f, 2.0f, 0.0f);
glBegin(GL_TRIANGLES);
glVertex3f(1.0f, -1.0f, 0.0f);
glVertex3f(-1.0f, -1.0f, 0.0f);
glVertex3f(1.0f, 1.0f, 0.0f);
glEnd();
glBegin(GL_QUADS);
glVertex3f(1.0f, 0.0f, 0.0f);
glVertex3f(3.0f, 0.0f, 0.0f);
glVertex3f(3.0f, 1.0f, 0.0f);
glVertex3f(1.0f, 1.0f, 0.0f);
glEnd();
glBegin(GL_TRIANGLES);
glVertex3f(3.0f, 0.0f, 0.0f);
glVertex3f(4.0f, 0.0f, 0.0f);
glVertex3f(3.0f, 1.0f, 0.0f);
glEnd();
glPopMatrix();
}
15
void coche() {
glColor3f(1, 0, 0);
glTranslatef(pos, 1.0f, 0.0f);
glBegin(GL_QUADS);
glVertex3f(0.0f, 0.0f, 0.0f);
glVertex3f(7.0f, 0.0f, 0.0f);
glVertex3f(7.0f, 2.0f, 0.0f);
glVertex3f(0.0f, 2.0f, 0.0f);
glEnd();
}
// Initialization routine.
void setup(void) {
glClearColor(1.0, 1.0, 1.0, 0.0);
glEnable(GL_DEPTH_TEST); // Enable depth testing.
// Turn on OpenGL lighting.
glEnable(GL_LIGHTING);
// Drawing routine.
void drawScene(void)
{
int i;
float z;
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
gluLookAt(0.0, 5.0, 30.0, 0.0, 10.0, 0.0, 0.0, 1.0, 0.0);
coche();
techo();
ventanas();
rueda_d();
rueda_t();
glutSwapBuffers();
}
17
// Main routine.
int main(int argc, char** argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH);
glutInitWindowSize(500, 500);
glutInitWindowPosition(100, 100);
glutCreateWindow("Coche sobre suelo a cuadros");
glutDisplayFunc(drawScene);
glutReshapeFunc(resize);
setup();
glutMainLoop();
return 0;
}
18
Ejercicio 4: Modifique o complemente el código del piso o suelo a cuadros para agregar
#include <iostream>
#include <GL/glut.h>
//#include <GL/freeglut.h>
using namespace std;
// Globals.
static float latAngle = 0.0; // Latitudinal angle.
static float longAngle = 0.0; // Longitudinal angle.
static int isAnimate = 0; // Animated?
static int animationPeriod = 70; // Time interval between frames.
// Draw ball flying around torus.
void drawBall(void){
glPushMatrix();
19
glEnable(GL_CULL_FACE);
glCullFace(GL_BACK);
glEnable(GL_BLEND); // Enable blending.
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); // Specify blending
parameters.
}
// Drawing routine.
void drawScene(void)
{
int i = 0;
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
gluLookAt(0.0, 5.0, 25.0, 0.0, 10.0, 0.0, 0.0, 1.0, 0.0);
// Blend checkered plane (the floor) onto the reflection.
glShadeModel(GL_FLAT); // Flat shading to get the checkered pattern.
for (float z = 100.0; z > -100.0; z -= 5.0)
{
glBegin(GL_TRIANGLE_STRIP);
for (float x = -100.0; x < 100.0; x += 5.0)
{
if (i % 2) glColor4f(0.0, 0.0, 0.0, 0.5); // Low alpha for blending.
else glColor4f(1.0, 1.0, 1.0, 0.5); // Low alpha for blending.
glNormal3f(0.0, 1.0, 0.0);
glVertex3f(x, 0.0, z - 5.0);
glVertex3f(x, 0.0, z);
i++;
}
glEnd();
i++;
}
glShadeModel(GL_SMOOTH); // Restore smooth shading.
// Draw real ball and torus.
drawBall();
glutSwapBuffers();
}
// OpenGL window reshape routine.
void resize(int w, int h)
{
glViewport(0, 0, w, h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glFrustum(-5.0, 5.0, -5.0, 5.0, 5.0, 100.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
// Keyboard input processing routine.
void keyInput(unsigned char key, int x, int y)
{
switch (key)
{
case 27:
exit(0);
break;
case ' ':
if (isAnimate) isAnimate = 0;
21
else
{
isAnimate = 1;
animate(1);
}
break;
default:
break;
}
}
// Callback routine for non-ASCII key entry.
void specialKeyInput(int key, int x, int y)
{
if (key == GLUT_KEY_DOWN) animationPeriod += 5;
if (key == GLUT_KEY_UP) if (animationPeriod > 5) animationPeriod -= 5;
glutPostRedisplay();
}
// Routine to output interaction instructions to the C++ window.
void printInteraction(void)
{
cout << "Interaction" << endl;
cout << "Press space to toggle between animation on and off." << endl
<< "Press the up/down arrow keys to speend up/slow down animation." << endl;
}
// Main routine.
int main(int argc, char** argv)
{
printInteraction();
glutInit(&argc, argv);
//glutInitContextVersion(4, 3);
//glutInitContextProfile(GLUT_COMPATIBILITY_PROFILE);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH);
glutInitWindowSize(500, 500);
glutInitWindowPosition(100, 100);
glutCreateWindow("Pelota rebotando sobre suelo a cuadros");
glutDisplayFunc(drawScene);
glutReshapeFunc(resize);
glutKeyboardFunc(keyInput);
glutSpecialFunc(specialKeyInput);
//glewExperimental = GL_TRUE;
//glewInit();
setup();
glutMainLoop();
}
22
Imagen 6. Muestra una esfera que simula ser una pelota rebotando sobre un suelo a
cuadros.
23
Ejercicio 5.- Esfera dentro de una caja. En este ejercicio, tienen que sacar la pelota
cunado se abra la tapa de la caja.
#include <iostream>
#include <GL/glut.h>
using namespace std;
// Global variables
static int step = 0; // Steps in open/closing the box lid.
static float spherePosition = 0.0; // Position of the sphere (0.0 means inside the box).
// Initialization routine
void setup(void) {
glClearColor(1.0, 1.0, 1.0, 0.0);
glEnable(GL_DEPTH_TEST); // Enable depth testing.
// Drawing routine
void drawScene(void) {
float matAmbAndDif1[] = { 0.9, 0.0, 0.0, 1.0 };
float matAmbAndDif2[] = { 0.0, 0.9, 0.0, 1.0 };
float matSpec[] = { 1.0, 1.0, 1.0, 1.0 };
float matShine[] = { 50.0 };
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
gluLookAt(0.0, 3.0, 3.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
glutSwapBuffers();
}
// Main routine
int main(int argc, char** argv) {
printInteraction();
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH);
glutInitWindowSize(500, 500);
glutInitWindowPosition(100, 100);
glutCreateWindow("Esfera dentro una caja");
glutDisplayFunc(drawScene);
glutReshapeFunc(resize);
glutKeyboardFunc(keyInput);
glutSpecialFunc(specialKeyInput);
setup();
glutMainLoop();
return 0;
}
26
Imagen 7. Muestra
Conclusiones individuales
1. Iluminación Realista
El sistema de iluminación de OpenGL permite simular cómo la luz interactúa con las superficies de los
objetos. Al configurar luces en una escena, los desarrolladores pueden emular diversas condiciones de
iluminación, desde luces direccionales y puntuales hasta luces spot, lo que ayuda a crear una experiencia
visual más inmersiva y realista.
2. Propiedades de Materiales
Los materiales definen cómo un objeto refleja la luz. Las propiedades de materiales, como el color
ambiental, difuso, especular y la brillantez (shininess), controlan cómo la luz se dispersa en la superficie
del objeto. Estos parámetros permiten ajustar cómo se ve un objeto bajo diferentes condiciones de
iluminación y desde diferentes ángulos de visión.
Al completar esta práctica, adquirí un entendimiento profundo del sistema de iluminación en OpenGL y
cómo influye en la apariencia de los objetos 3D. Aprendí a configurar luces y definir materiales mediante
las funciones glLight() y glMaterial(), lo que me permitió observar cómo las propiedades ópticas, como
la luz ambiente, difusa y especular, afectan la visualización de las superficies. Implementar la atenuación
de la luz según la distancia fue clave para mejorar el realismo de la escena. Además, la comparación entre
los modos de sombreado GL_FLAT y GL_SMOOTH me permitió entender mejor cómo OpenGL maneja
la interpolación de colores, mientras que los ejercicios prácticos con objetos dinámicos, como la pelota y
el carro, consolidaron mis habilidades para crear entornos 3D más realistas y complejos.
En resumen, OpenGL proporciona poderosas funciones para gestionar la iluminación, color y materiales
en entornos 3D. La capacidad de habilitar la iluminación, establecer colores y definir propiedades de
materiales permite crear representaciones visuales realistas y detalladas en aplicaciones gráficas 3D. Al
comprender y aplicar adecuadamente las sintaxis básicas proporcionadas, los desarrolladores pueden
lograr resultados visuales impresionantes y personalizados en sus proyectos OpenGL.
Durante esta práctica, logré un entendimiento profundo del manejo de iluminación y materiales en
OpenGL. Esta tecnología es fundamental para la creación de escenas 3D realistas. A través de la
configuración de luces y el ajuste de propiedades de los materiales, como la luz ambiente, difusa y
especular, pude observar cómo cada aspecto influye directamente en la representación visual de los
objetos en una escena tridimensional.
En conjunto, estos conocimientos me proporcionan las herramientas necesarias para crear gráficos 3D
más sofisticados y cercanos a la realidad, lo cual me será útil en futuros proyectos. Implementar la
atenuación de luz para objetos cercanos y lejanos fue un reto interesante, ya que permitió visualizar el
impacto que tiene la distancia en la iluminación y mejorar la percepción de profundidad.
28
Referencias
acodigo. https://acodigo.blogspot.com/2016/04/modelo-de-iluminacion-phong-tutorial.html