El nivel de detalle (o LOD: Level Of Detail) es una técnica imprescindible en gráficos 3D generados en tiempo real, para poder mantener la velocidad de refresco de pantalla sin gastar tiempo inútilmente. De lo que se trata es de tener modelos simplificados (en diferentes grados) de un mismo objeto. Entonces se escoge cual de los modelos se muestra en cada momento según la distáncia a la que está del observador. Esto se hace por que no tiene sentido dibujar un objeto muy complejo con centenares de polígonos si este objeto ocupa 3x3 pixels en pantalla. Si no tuviéramos modelos simplificados estaríamos malgastando tiempo en dibujar a pleno detalle una cosa que finalmente no se apreciaría.
La manera en que se trabaja al aplicar el LOD, es a base de definir espacios o rangos delante del observador y asignar uno de los modelos del nivel de detalle adecuado para ser visto en aquella distáncia. El node que el VRML implementa para conseguir este efecto es precisamente el node LOD.
El siguiente ejemplo nos muestra el efecto de irnos acercando a una silla.
Conforme nos vamos acercando el modelo va ganando en definición.
|
Ejemplo1: Definición
de una silla en niveles de detalle.
LOD {
range [ 10 15 20 ]
level [
Group { # Niell 1 (máximo nivel): dos cajas y cuatro cilindros
children [
Transform { # Respaldo
translation 0 3.5 -1.75
children Shape {
geometry Box { size 3.5 3 0.5 }
appearance Appearance { material Material { diffuseColor 0.8 0.6 0 } }
}
}
Shape { # Asiento
geometry Box { size 3.5 0.5 3.5 }
appearance Appearance { material Material { diffuseColor 0.8 0.6 0 } }
}
Transform { # Pata posterior izquierda
translation -1.75 0 -1.75
children Shape {
geometry Cylinder { radius 0.25 height 10 }
appearance Appearance { material Material { diffuseColor 0.8 0 0.2 } }
}
}
Transform { # Pata posterior derecha
translation 1.75 0 -1.75
children Shape {
geometry Cylinder { radius 0.25 height 10 }
appearance Appearance { material Material { diffuseColor 0.8 0 0.2 } }
}
}
Transform { # Pata frontal izquierda
translation -1.75 -2.5 1.75
children Shape {
geometry Cylinder { radius 0.25 height 5 }
appearance Appearance { material Material { diffuseColor 0.8 0 0.2 } }
}
}
Transform { # Pata frontal derecha
translation 1.75 -2.5 1.75
children Shape {
geometry Cylinder { radius 0.25 height 5 }
appearance Appearance { material Material { diffuseColor 0.8 0 0.2 } }
}
}
]
}
Group { # Nivel 2: seis cajas
children [
Transform { # Respaldo
translation 0 3.5 -1.75
children Shape {
geometry Box { size 3.5 3 0.5 }
appearance Appearance { material Material { diffuseColor 0.8 0.6 0 } }
}
}
Shape { # Asiento
geometry Box { size 3.5 0.5 3.5 }
appearance Appearance { material Material { diffuseColor 0.8 0.6 0 } }
}
Transform { # Pata posterior izquierda
translation -1.75 0 -1.75
children Shape {
geometry Box { size 0.5 10 0.5 }
appearance Appearance { material Material { diffuseColor 0.8 0 0.2 } }
}
}
Transform { # Pata posterior derecha
translation 1.75 0 -1.75
children Shape {
geometry Box { size 0.5 10 0.5 }
appearance Appearance { material Material { diffuseColor 0.8 0 0.2 } }
}
}
Transform { # Pata frontal izquierda
translation -1.75 -2.5 1.75
children Shape {
geometry Box { size 0.5 5 0.5 }
appearance Appearance { material Material { diffuseColor 0.8 0 0.2 } }
}
}
Transform { # Pata frontal derecha
translation 1.75 -2.5 1.75
children Shape {
geometry Box { size 0.5 5 0.5 }
appearance Appearance { material Material { diffuseColor 0.8 0 0.2 } }
}
}
]
}
Group { # Nivel 3: dos cajas
children [
Transform { # Respaldo
translation 0 2.5 -1.75
children Shape {
geometry Box { size 4 5 0.5 }
appearance Appearance { material Material { diffuseColor 0.8 0.6 0 } }
}
}
Transform { # Asiento
translation 0 -2.5 0
children Shape {
geometry Box { size 4 5 4 }
appearance Appearance { material Material { diffuseColor 0.8 0.6 0 } }
}
}
]
}
Shape { # Nivel 4 (más bajo): una caja
geometry Box { size 4 10 4 }
appearance Appearance { material Material { diffuseColor 0.8 0.6 0 } }
}
]
}
|
Las partes del node LOD son las siguientes. En primer lugar encontramos el field range donde definimos las particiones de distancia donde se verá cada nivel de modelo. Querremos definir cuatro (4) modelos diferentes y para esto definimos tres (3) valores. El primer valor nos indica que se ha de ver el modelo más detallado si el observador está a menos de 10 unidades del objeto. El segundo valor nos indica que se ha de ver el segundo nivel de detalle si el observador está a menos de 15 unidades ( y a más de 10 unidades) del objeto. El tercer valor nos indica que se ha de ver el tercer nivel de detalle si el observador está a menos de 20 unidades ( y a más de 15 unidades) del objeto. Finalmente, no es necesario poner un cuarto valor por que ya se deduce que se ha de ver el cuarto nivel de detalle si el observador está a más de 20 unidades del objeto.
El segundo elemento que encontramos es el field level que es donde indicamos las diferentes versiones del objeto en orden de mayor a menor detalle.
Evidentemente, los rangos que hemos tomado en este ejemplo no producen un efecto
suave de cambio, y son solamente como ejemplo didáctico. Para que os
hagais una idea de como son los cuatro elementos, aquí los podréis
ver todos uno al lado del otro: 4nivels.wrl.
Ejercicios propuestos:
|