Prototipus, DEF i USE.

Tutorial de VRML97

PROTO

Quan es modelen objectes per a un entorn, ens podem trobar que necessitem definir un tipus d'objecte que serà utilitzat de formes diferents en diferents llocs de l'entorn. Per tal de poder definir un objecte genèric i poder utilitzar-lo amb paràmetres diferents en diferents llocs, VRML2.0 disposa dels prototipus .

Cal tenir clar que PROTO no és un node de VRML2.0, si no un mecanisme per a definir nous nodes. El que es fa al definir un prototipus, és definir un tipus d'objecte nou per a poder-lo utilitzar de la mateixa manera que utilitzem els node Box, node Sphere, node Material, node Appearance, etc. Vejam un exemple per antendre les diferents parts.

Exemple1: Definició d'un prototipus de Paraigües. Es defineix el nou tipus de node Paraigues.


PROTO Paraigues [
	field SFColor colorBasto 0.1 0.1 0
	field SFColor colorRoba 0 0.2 1
]
{
	Group {
		children [
			Shape {
				geometry Cylinder { height 3 radius 0.1 }
				appearance Appearance { material Material { diffuseColor IS colorBasto } }
			}
			Transform {
				translation 0 1.75 0
				children Shape {
					geometry Cone { height 0.5 bottomRadius 3 }
					appearance Appearance { material Material { diffuseColor IS colorRoba } }
				}
			}
		]
	}
}

Paraigues { } #Creem un objecte Paraigues amb els valors per defecte

Transform {
	translation 8 0 0
	children Paraigues { colorBasto 0.2 0 0 colorRoba 0 0.2 0.1 }
}

Transform {
	translation -8 0 0
	children Paraigues { colorBasto 0 0 0.3 colorRoba 0.4 0 0.1 }
}

Analitzem l'exemple. Comencem definint el prototipus amb la paraula PROTO. A continuació donem el nom que volem que tingui el nou tipus de node que definim, en aquest cas Paraigues. Llavors cal definir els paràmetres que podrem variar del nostre prototipus cada cop que en necessitem un. Nosaltres hem decidit que pel paraigües no podrem variar-ne les mesures però si el color de les seves parts. Per això definim dos fields, un pel color del bastó field SFColor colorBasto i un altre pel color de la roba que fa d'ombrela field SFColor colorRoba. Com que tots dos són colors, els hem definit de tipus SFColor (single-valued field color, camp de color univaluat). A cada un li donem el color per defecte per que si algú defineix un objecte de tipus Paraigues i no li dona valors als paràmetres, el VRML2.0 tingui uns colors per a utilitzar. Ara ja podem definir com seran els trets generals del nostre nou node Paraigues.

Per començar, utilitzem un nou node que és el node Group. Aquest node serveix per agrupar en un sol objecte, varis sub-objectes. Aquest node ens agruparà l'objecte bastó i l'objecte ombrela del nostre paraigües. Si no ho fessim i definissim l'objecte bastó i a continuació l'objecte ombrela, el prototipus estaria format per un bastó visible i una ombrela invisible. En la definició d'un prototipus es poden posar tants objectes com es vulguin, però sempre s'agafarà el primer per a determinar el tipus de node que s'està definint i per a visualitzar-lo. La resta d'objectes poden servir per moltes coses, però no seran visualitzats.

Així doncs, definim un cilindre que ens farà de bastó. Com es pot observar, la geometria de cilindre està fixada. En canvi, l'aparença és allò que volem variar. Per tant, definim una aparença amb un material i amb un color. La manera d'aconseguir que el color sigui el que nosaltres volguem, és utilitzant la paraula IS. Aquesta paraula fa que poguem definir que el field diffuseColor del nostre objecte sigui en realitat (IS) el field colorBasto que hem definit en els paràmetres. De manera anàloga es defineix la part de l'ombrela que definim mitjançant un con traslladat amunt per que engalzi bé amb el bastó.

Fins aquí hem definit el prototipus i com a tal, no és un objecte que existeixi. Si no posessim res més en l'arxiu de VRML2.0, i el carreguèssim en un browser, obtindriem una escena buida. Per això el que fem després és el que s'enomena instanciar un objecte a partir del prototipus. Pel sol fet de posar el nom del nou node (Paraigues), ja estem creant una instancia del prototipus. Com que a continuació, tan sols hi posem unes claus buides ({}), no estem definint paràmetres per aquest objecte en concret. En aquest cas s'utilitzen els paràmetres per defecte que hem definit dins del prototipus. També podem veure que l'objecte apareix en l'espai, en el lloc on ha estat definit.

Les altres dues instanciacions, es fan traslladant el paraigües a un costat i a l'altre del primer, i donant colors diferents dels colors per defecte. Ha de quedar clar que en instanciar els tres paraigües, obtenim tres objectes diferenciats i que si en modifiquem un, els altres no se'ns veuen alterats.

A continuació mostrem un exemple més complex.

Exemple2: Definició d'un prototipus de banquet. Es defineix el nou tipus de node Banquet.


PROTO Banquet [
	field SFColor colorPotes 1 1 0
	field SFColor colorSeient 0 0 1
	field SFVec3f proporcions 1 1 1
	field SFVec3f posicio 0 0 0
]
{
	PROTO Pota [
		field SFColor colorPota 1 1 0
		field SFVec3f posicio 0 0 0
	]
	{
		Transform {
			translation IS posicio
			children Shape {
				geometry Cylinder { radius 0.1 height 1 }
				appearance Appearance { material Material { diffuseColor IS colorPota } }
			}
		}
	}

	Transform {
		translation IS posicio
		scale IS proporcions
		children [
			Shape { # Seient
				geometry Box { size 1 0.2 1 }
				appearance Appearance { material Material { diffuseColor IS colorSeient } }
			}
			Pota { posicio 0.4 -0.6 0.4 colorPota IS colorPotes }
			Pota { posicio -0.4 -0.6 0.4 colorPota IS colorPotes }
			Pota { posicio -0.4 -0.6 -0.4 colorPota IS colorPotes }
			Pota { posicio 0.4 -0.6 -0.4 colorPota IS colorPotes }
		]
	}

}

Banquet { }#Creem un objecte Banquet amb els valors per defecte
Banquet { colorPotes 1 0.5 0 colorSeient 0.5 0 1 posicio -2 0 0 }
Banquet { colorPotes 0.5 1 0 colorSeient 1 0.5 0 posicio 2 0 0 }
Banquet { colorPotes 1 0 0.8 colorSeient 1 0.5 0 posicio 0 2 0 proporcions 3 1 1 }

En aquest exemple veiem un prototipus de banquet que es recolza en un prototipus de pota per a definir les seves quatre potes. Recordeu que PROTO no és un node i per tant, tot i ser el primer que es defineix dins del PROTO Banquet, no es pren en compte i el que defineix aquest prototipus és el node Transform que engloba les peces del banquet.

Cal fer notar com els noms de fields no se solapen entre el PROTO pare i el fill. És a dir, que per exemple, podem tenir com a field el nom posicio tant en un com en l'altre, i se sap perfectament a quin s'està fent referencia en cada moment, degut a l'àmbit on es troba.

DEF i USE

Quan el que volem és definir un objecte que s'utilitza a molts llocs i ens enfarfaga el codi de VRML pel fet de repetir i repetir una mateixa estructura, llavors podem utilitzar DEF i USE. Cal no confondre aquestes dues comandes amb PROTO. DEF i USE no defineixen un objecte genèric que s'instancia com a objecte particular en cridar-lo amb uns certs paràmetres. El que es fa és en realitat, donar nom a un cert node que després utilitzarem a molts llocs de la mateixa manera. Vejam un exemple:

Exemple3: Utilització de DEF i USE.


DEF VermellMeu Appearance {
	material Material {
		diffuseColor 0.8 0.2 0.4
	}
}

Transform {
	translation -2 0 0
	children Shape {
		geometry Box { size 3 3 3 }
		appearance USE VermellMeu
	}
}
Transform {
	translation 2 0 0
	children Shape {
		geometry Sphere { radius 2 }
		appearance USE VermellMeu
	}
}

Aquí veiem com hem DEFinit una aparença que després USEm en dos objectes diferents. El que hem fet és senzillament donar-li el nom VermellMeu a un tros de codi per després estalviar-nos d'escriure'l molts cops. I potser més que la feina que ens podem estalviar en escriure-ho, el que és de gran ajut, és si hem de fer un canvi al color de l'aparença, per que fent el canvi en un sol lloc (en el DEF), ja ho tenim fet a tots els llocs on ho fem servir (USE).

Per exemple, si volem que el nostre color VermellMeu en relitat sigui més vermell, només cal variar la seva DEFinició:

Exemple4: Modifiquem l'exemple anterior.


DEF VermellMeu Appearance {
	material Material {
		diffuseColor 1 0.2 0
	}
}

Transform {
	translation -2 0 0
	children Shape {
		geometry Box { size 3 3 3 }
		appearance USE VermellMeu
	}
}
Transform {
	translation 2 0 0
	children Shape {
		geometry Sphere { radius 2 }
		appearance USE VermellMeu
	}
}


Exercicis proposats:

Roda de Cotxe
Definiu un prototipus de roda de cotxe que pugui ser situada on es vulgui en l'espai, que es pugui orientar com es vulgui i que pugui girar com si rodés sobre el terra. Un cop definit, construiu un "cotxe" amb les quatre rodes, on les dues de davant estiguin com si el cotxe girés a l'esquerra.
Comentaris
  • Utilitzeu tan sols primitives per a modelar els objectes.
  • Utilitzeu transformacions individuals per a cada característica.
Solució proposada: roda.wrl.




< Anterior | Menú ^ | Següent >