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
