Construirem una sínia de quatre cistelles a partir d'una estructura de creu i amb una base en forma triangular. Per a tot l'exercici utilitzarem únicament primitives geomètriques per tal de concentrar-nos en el funcionament, més que en la geometria.
Pas1:
Començarem per definir dues creus, que seran l'estructura principal que
sustentarà les cistelles:
...
...
...
PROTO Creu [ field SFVec3f posicio 0 0 0 ]
{
Transform{
translation IS posicio
children [
Shape{
geometry Box { size 12 0.5 0.2 }
appearance Appearance { material Material { diffuseColor 0 0 1 } }
}
Shape{
geometry Box { size 0.5 12 0.2 }
appearance Appearance { material Material { diffuseColor 0 0 1 } }
}
]
}
}
DEF Estructura Transform {
children [
Creu{ posicio 0 0 1 }
Creu{ posicio 0 0 -1 }
]
}
|
Això, el que fa, és definir un prototipus Creu, el qual està format per dues caixes de color blau. Aquest prototipus l'utilitzem després al definir la nostra Estructura global, creant dues creus paral.leles i separades per una distància de 2 unitats. Resultat Pas1.
Pas2:
Continuarem per definir el que serà el motor de la sínia:
...
...
...
DEF motorSinia TimeSensor {
cycleInterval 3
loop TRUE
}
DEF rotaSinia OrientationInterpolator {
key [ 0, 1 ]
keyValue [ 0 0 1 0, 0 0 1 -1.57 ] # 90 graus o PI/2
}
...
...
...
ROUTE motorSinia.fraction_changed TO rotaSinia.set_fraction
ROUTE rotaSinia.value_changed TO Estructura.rotation
|
Això, el que fa, és definir un TimeSensor enomenat motorSinia que va fent bucles de 3 segons (cycleInterval = 3). També definim un OrientationInterpolator enomenat rotaSinia que ens interpola des de 0 (zero) graus de rotació fins a 90 graus (o PI/2 radians o -1.57) al voltant de l'eix Z i en la direcció negativa. Finalment definim les rutes que encaminaran els esdeveniments d'entrada i de sortida per tal d'anar movent l'Estructura. Aquestes rutes fan que el pas del temps de motorSinia vagi modificant l'avanç de l'interpolador rotaSinia. Així mateix, l'avenç de l'interpolador fa que roti la nostra Estructura. Resultat Pas2.
Nota: Tan sols es fa una rotació de 90 graus per que la sínia té quatre braços i per tant al haver-la rotat 90 graus torna a estar en una situació totalment anàloga a la inicial.
Pas3:
Ara afegirem les cistelles fent-les amb cons:
...
...
...
PROTO Cistella [
exposedField SFRotation rotacio 1 0 0 0
field SFVec3f posicio 0 0 0
]
{
Transform {
translation IS posicio
children
Transform {
center 0 1.5 0
rotation IS rotacio
children Shape {
geometry Cone {
bottomRadius 0.8
height 3
}
appearance Appearance { material Material { diffuseColor 0 1 0 } }
}
}
}
}
...
...
...
DEF Estructura Transform {
children [
Creu{ posicio 0 0 1 }
Creu{ posicio 0 0 -1 }
DEF C1 Cistella { posicio 0 4.5 0 }
DEF C2 Cistella { posicio 6 -1.5 0 }
DEF C3 Cistella { posicio 0 -7.5 0 }
DEF C4 Cistella { posicio -6 -1.5 0 }
]
}
|
Això, el que fa, és definir un prototipus Cistella, el qual està format per un con de color verd, que pot ser rotat segons un pivot situat en el seu vértex superior i que pot ser traslladat a un punt posicio. Un cop definit aquest prototipus, l'utilitzem per a crear les quatre cistelles C1, C2, C3 i C4 que van col.locades cada una en un braç de la creu que hem creat abans. Resultat Pas3.
Ara veiem com les cistelles comencen ben col.locades, però en ser arrossegades per la rotació de l'Estructura a la que pertanyen, van quedant malament. En rotar la Creu, elles haurien de compensar aquest moviment.
Pas4:
Així doncs, per que les cistelles sempre presentin una situació vertical, cal que facin una
rotació dels mateixos graus que l'Estructura, però de signe invers. Aquesta rotació
a més, ha de ser feta respecte el punt de pivotatge (el vertex superior dels cons). És per
això que en la definició de la Cistella, es defineix el center. Vejam
doncs, que hem d'afegir per que això funcioni:
...
...
...
DEF rotaCistella OrientationInterpolator {
key [ 0, 1 ]
keyValue [ 0 0 1 0, 0 0 1 1.57 ]
}
...
...
...
ROUTE motorSinia.fraction_changed TO rotaCistella.set_fraction
ROUTE rotaCistella.value_changed TO C1.rotacio
ROUTE rotaCistella.value_changed TO C2.rotacio
ROUTE rotaCistella.value_changed TO C3.rotacio
ROUTE rotaCistella.value_changed TO C4.rotacio
|
Això, el que fa, és definir un altre OrientationInterpolator enomenat rotaCistella que aprofitarà el TimeSensor enomenat motorSinia que haviem definit abans. L'interpolador nou, fa el mateix que el d'abans (rotaSinia) però en el sentit invers. Tot seguit definim les rutes necessàries per a rotar les cistelles. Primer fem que el pas del temps de motorSinia vagi modificant l'avanç de l'interpolador rotaCistella. Així mateix, l'avenç de l'interpolador fa que roti cada Cistella: C1, C2, C3 i C4. Resultat Pas4.
Pas5:
Finalment només cal afegir una base la qual deixem la seva comprensió al lector:
...
...
...
PROTO TriangleBase [ field SFVec3f posicio 0 0 0 ]
{
Transform {
translation IS posicio
children [
Transform { # Peu de la base
translation 0 -10.4 0
children Shape{
geometry Box { size 12 0.5 0.2 }
appearance Appearance { material Material { diffuseColor 1 0 0 } }
}
}
Transform { # Laterals de la base
translation 0 -6 0
children [
Transform {
center 0 6 0
rotation 0 0 1 0.5236 # 30 graus o PI/6
children Shape{
geometry Box { size 0.5 12 0.2 }
appearance Appearance { material Material { diffuseColor 1 0 0 } }
}
}
Transform {
center 0 6 0
rotation 0 0 1 -0.5236 # 30 graus o PI/6
children Shape{
geometry Box { size 0.5 12 0.2 }
appearance Appearance { material Material { diffuseColor 1 0 0 } }
}
}
]
}
]
}
}
...
...
...
DEF Base Group {
children [
TriangleBase{ posicio 0 0 1.5 }
TriangleBase{ posicio 0 0 -1.5 }
]
}
...
...
...
|