Nivel de Detalle (LOD)

Tutorial de VRML97

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:

Casa
Diseñar una casa en 5 niveles de detalle y definir el comportamiento con el node LOD.
Comentarios
  • Utilizar tan solo primitivas para modelar las partes.
Mundo Misterioso
Diseñar un objeto que tenga un cierto comportamiento como por ejemplo que crezca o se reduzca o rote, y haced que el cambio de comportamiento se active en función de la distancia del observador al objeto. Será como si el objeto reflejase la inmovilidad o movilidad del observador.
Comentarios
  • Utilizar tan solo primitivas para modelar las partes.
  • No utilizar Interpoladores ni Sensores de Tiempo.
  • Aprovechar el prototipage de objetos.
Solución propuesta: misteri.wrl.




< Anterior | Menú ^ | Siguiente >