Introducció
En aquest tema, explorarem els conceptes fonamentals d'il·luminació i ombrejat en gràfics 3D. La il·luminació és essencial per donar realisme a les escenes 3D, mentre que l'ombrejat determina com la llum interacciona amb les superfícies dels objectes. Aprendrem sobre diferents models d'il·luminació, tipus de fonts de llum i tècniques d'ombrejat.
Conceptes Clau
Models d'Il·luminació
-
Il·luminació Ambiental:
- Proporciona una llum uniforme a tota l'escena.
- No té direcció específica.
- Simula la llum dispersa en l'ambient.
-
Il·luminació Difusa:
- Depèn de l'angle entre la llum i la superfície.
- Produeix un efecte suau i realista.
- Utilitza la llei de Lambert.
-
Il·luminació Especular:
- Crea reflexos brillants.
- Depèn de l'angle de visió i l'angle de la llum.
- Utilitza el model de Phong.
Tipus de Fonts de Llum
-
Llum Puntual:
- Emana des d'un punt específic en totes direccions.
- Exemples: bombeta, focus.
-
Llum Direccional:
- Té una direcció específica però no un punt d'origen definit.
- Exemples: llum solar.
-
Llum de Punt:
- Emana des d'un punt i es dispersa en un angle concret.
- Exemples: llum de focus.
Tècniques d'Ombrejat
-
Ombrejat de Gouraud:
- Calcula la il·luminació als vèrtexs i després interpola els colors a través de la superfície.
- Més ràpid però menys precís.
-
Ombrejat de Phong:
- Interpola les normals dels vèrtexs i calcula la il·luminació per cada píxel.
- Més precís però més costós computacionalment.
-
Ombrejat de Blinn-Phong:
- Variant del model de Phong.
- Utilitza una aproximació diferent per calcular la il·luminació especular.
Exemples Pràctics
Exemple 1: Il·luminació Difusa
# Exemple de codi en Python utilitzant PyOpenGL per il·luminació difusa from OpenGL.GL import * from OpenGL.GLUT import * from OpenGL.GLU import * def init(): glEnable(GL_DEPTH_TEST) glEnable(GL_LIGHTING) glEnable(GL_LIGHT0) # Configuració de la llum difusa light_diffuse = [1.0, 1.0, 1.0, 1.0] light_position = [1.0, 1.0, 1.0, 0.0] glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse) glLightfv(GL_LIGHT0, GL_POSITION, light_position) def display(): glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) glutSolidTeapot(1.0) glFlush() glutInit() glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH) glutInitWindowSize(500, 500) glutCreateWindow(b'Il·luminació Difusa') init() glutDisplayFunc(display) glutMainLoop()
Exemple 2: Ombrejat de Phong
# Exemple de codi en Python utilitzant PyOpenGL per ombrejat de Phong from OpenGL.GL import * from OpenGL.GLUT import * from OpenGL.GLU import * def init(): glEnable(GL_DEPTH_TEST) glEnable(GL_LIGHTING) glEnable(GL_LIGHT0) # Configuració de la llum light_diffuse = [1.0, 1.0, 1.0, 1.0] light_position = [1.0, 1.0, 1.0, 0.0] glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse) glLightfv(GL_LIGHT0, GL_POSITION, light_position) # Configuració de l'ombrejat de Phong glShadeModel(GL_SMOOTH) def display(): glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) glutSolidTeapot(1.0) glFlush() glutInit() glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH) glutInitWindowSize(500, 500) glutCreateWindow(b'Ombrejat de Phong') init() glutDisplayFunc(display) glutMainLoop()
Exercicis Pràctics
Exercici 1: Implementar Il·luminació Especular
Objectiu: Afegir il·luminació especular a l'exemple d'il·luminació difusa.
Instruccions:
- Modifica el codi de l'exemple d'il·luminació difusa.
- Afegeix una configuració per a la llum especular.
- Afegeix una configuració per al material especular de l'objecte.
Solució:
def init(): glEnable(GL_DEPTH_TEST) glEnable(GL_LIGHTING) glEnable(GL_LIGHT0) # Configuració de la llum difusa light_diffuse = [1.0, 1.0, 1.0, 1.0] light_position = [1.0, 1.0, 1.0, 0.0] glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse) glLightfv(GL_LIGHT0, GL_POSITION, light_position) # Configuració de la llum especular light_specular = [1.0, 1.0, 1.0, 1.0] glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular) # Configuració del material especular material_specular = [1.0, 1.0, 1.0, 1.0] material_shininess = [50.0] glMaterialfv(GL_FRONT, GL_SPECULAR, material_specular) glMaterialfv(GL_FRONT, GL_SHININESS, material_shininess) glutInit() glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH) glutInitWindowSize(500, 500) glutCreateWindow(b'Il·luminació Especular') init() glutDisplayFunc(display) glutMainLoop()
Errors Comuns i Consells
-
Oblidar activar GL_LIGHTING:
- Assegura't d'activar
glEnable(GL_LIGHTING)
per permetre la il·luminació.
- Assegura't d'activar
-
Configuració incorrecta de les normals:
- Les normals han d'estar correctament definides per a cada vèrtex per obtenir resultats d'il·luminació precisos.
-
No configurar el material:
- Configura adequadament les propietats del material per obtenir els efectes desitjats d'il·luminació especular i difusa.
Conclusió
En aquesta secció, hem après sobre els fonaments de la il·luminació i l'ombrejat en gràfics 3D. Hem explorat diferents models d'il·luminació, tipus de fonts de llum i tècniques d'ombrejat, i hem vist exemples pràctics de com implementar-los. Amb aquests coneixements, estem preparats per crear escenes 3D més realistes i visualment atractives.
Matemàtiques 3D
Mòdul 1: Fonaments d'Àlgebra Lineal
- Vectors i Espais Vectorials
- Matrius i Determinants
- Sistemes d'Equacions Lineals
- Autovalors i Autovectors
Mòdul 2: Transformacions Lineals
- Definició i Propietats
- Matrius de Transformació
- Rotacions, Translacions i Escalats
- Composició de Transformacions