Nivell de Detall (LOD)

Tutorial de VRML97

El nivell de detall (o LOD: Level Of Detail) és una tècnica imprescindible en gràfics 3D generats en temps real, per a poder mantenir la velocitat de refresc de pantalla sense gastar temps inutilment. Del que es tracta és de tenir models simplificats (en diferents graus) d'un mateix objecte. Llavors es tria quin dels models s'ensenya en cada moment segons la distància a la que està de l'observador. Això es fa per que no té sentit dibuixar un objecte molt complex amb centenars de polígons si aquest objecte ocupa 3x3 pixels a pantalla. Si no tinguéssim models simplificats estariem malgastant temps en dibuixar a plé detall una cosa que finalment no s'apreciaria.

La manera en que es treballa en aplicar el LOD, és a base de definir espais o rangs davant l'observador i assignar un dels models del nivell de detall adient per a ser vist en aquelles distàncies. El node que el VRML implementa per a assolir aquest efecte és precisament el node LOD.

El següent exemple ens mostra l'efecte d'anar-nos apropant a una cadira. Conforma ens anem apropant el model va guanyant en definicó.

Exemple1: Definició d'una cadira en nivells de detall.


LOD {
	range [ 10 15 20 ]
	level [
		Group { # Nivell 1 (maxim nivell): dues caixes i quatre cilindres
			children [
				Transform { # Respatller
					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 { # Seient
					geometry Box { size 3.5 0.5 3.5 }
					appearance Appearance { material Material { diffuseColor 0.8 0.6 0 } }
				}
				Transform { # Pota posterior esquerra
					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 { # Pota posterior dreta
					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 { # Pota frontal esquerra
					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 { # Pota frontal dreta
					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 { # Nivell 2: sis caixes
			children [
				Transform { # Respatller
					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 { # Seient
					geometry Box { size 3.5 0.5 3.5 }
					appearance Appearance { material Material { diffuseColor 0.8 0.6 0 } }
				}
				Transform { # Pota posterior esquerra
					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 { # Pota posterior dreta
					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 { # Pota frontal esquerra
					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 { # Pota frontal dreta
					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 { # Nivell 3: dues caixes
			children [
				Transform { # Respatller
					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 { # Seient
					translation 0 -2.5 0
					children Shape {
						geometry Box { size 4 5 4 }
						appearance Appearance { material Material { diffuseColor 0.8 0.6 0 } }
					}
				}
			]
		}
		Shape { # Nivell 4 (mes baix): una caixa
			geometry Box { size 4 10 4 }
			appearance Appearance { material Material { diffuseColor 0.8 0.6 0 } }
		}
	]
}

Les parts del node LOD són les següents. En primer lloc trobem el field range on definim les particions de distància on es veurà cada nivell de model. Voldrem definir quatre (4) models diferents i per això definim tres (3) valors. El primer valor ens indica que s'ha de veure el model més detallat si l'observador està a menys de 10 unitats de l'objecte. El segon valor ens indica que s'ha de veure el segon nivell de detall si l'observador està a menys de 15 unitats ( i a més de 10 unitats) de l'objecte. El tercer valor ens indica que s'ha de veure el tercer nivell de detall si l'observador està a menys de 20 unitats ( i a més de 15 unitats) de l'objecte. Finalment, no cal posar quart valor per que ja es dedueix que s'ha de veure el quart nivell de detall si l'observador està a més de 20 unitats de l'objecte.

El segon element que trobem és el field level que és on hi posem les diferents versions de l'objecte en ordre de més a menys detall.

Evidentment, els rangs que hem agafat no produeixen un efecte suau de canvi, i són solament a tall didactic. Per que us feu una idea de com son els quatre elements, aquí els podreu veure tots un al costat de l'altre: 4nivells.wrl.

Exercicis proposats:

Casa
Dissenyeu una casa en 5 nivells de detall i definiu el comportament amb el node LOD.
Comentaris
  • Utilitzeu tant sols primitives per a modelar les parts.
Món Misterios
Dissenyeu un objecte que tingui un cert comportament com que creixi o es redueixi o roti, i feu que el canvi de comportament s'activi en funció de la distància de l'observador a l'objecte. Serà com si l'objecte reflectís la immobilitat o mobilitat de l'observador.
Comentaris
  • Utilitzeu tant sols primitives per a modelar les parts.
  • No utilitzeu Interpoladors ni Sensor de Temps.
  • Aprofiteu el prototipatge d'objectes.
Solució proposada: misteri.wrl.




< Anterior | Menú ^ | Següent >