A lo largo del curso hemos investigado diferentes formas de interactuar con los objetos. Al principio estudiamos un movimiento programado directamente en 3DStudio. Conseguimos mover objetos aparentemente de manera aleatoria, pero que respondían a un bucle cerrado.
(IMAGEN AJEDREZ)
Sin embargo los movimientos introducidos en nuestro modelo de trabajo actual han sido escritos en lenguaje VRML.
Podemos interactuar con objetos, por ejemplo, empujándolos a voluntad sobre un plano. Para ello restringimos su movimiento coartando ejes.
En el objeto del avión hemos coartado dos ejes por lo que sólo tenemos permitido desplazarlo en una dirección. El pato puede moverse en el plano x,z correspondiente al plano del suelo. Además se deben definir unas coordenadas límite para no perder de vista el objeto.
Group {
children [
Transform {
children [
DEF SENSOR2 PlaneSensor {
maxPosition 1 0
minPosition -40 0
}
DEF SLIDER2 Transform {
children [
Shape { # AVION
(AQUÍ VA EL CÓDIGO DEL MODELO)
]
}
]
}
Transform {
rotation 0 0 0 1.57
children [
]
}
]
}
ROUTE SENSOR2.translation_changed TO SLIDER2.translation
Si comparamos con el código del pato:
DEF SENSOR PlaneSensor {
maxPosition 200 100 200
minPosition -400 -10 400
}
DEF SLIDER Transform {
children [
Hemos investigado el movimiento de un objeto asociado a la geometría de otro, consiguiendo desplazar el pato sobre una cinta de moebius siguiendo el puntero del ratón.

El único movimiento automático en nuestro modelo es el que llevan a cabo los dos globos aerostáticos situados en el exterior.
Describen este movimiento como un bucle en el que definimos las coordenadas de un punto inicial, uno intermedio y uno final, en este caso coincidiendo con el inicial. El comando de interpolación de posición se encarga de definir los puntos intermedios. La velocidad se define asignando el número de vueltas que se desean en un intervalo de tiempo estándar.
En nuestro modelo cada globo describe trayectorias verticales a distinta velocidad.
Los comandos de tiempo van al inicio, pero la descripción del movimiento está asociada a cada modelo.
#Tiempo G2
DEF TIMER TimeSensor {
cycleInterval 10
loop TRUE
}
#Tiempo G1
DEF TIMER1 TimeSensor {
cycleInterval 8
loop TRUE
}
#Interpolación de posición para GLOBO2
Transform {
rotation 0 1 0 4.18
children [
# DirectionalLight {
# ambientIntensity 0.75
# }
DEF POSINT PositionInterpolator {
key [ 0, 0.5, 1]
keyValue [ 1 20 -10,
1 2 -10,
1 20 -10 ]
}
DEF POSTGT Transform {
translation 0 3 -10
children [
Shape { # GLOBO2
(AQUÍ VA EL CÓDIGO DEL MODELO)
]
}
]
}
ROUTE TIMER.fraction_changed TO POSINT.set_fraction
ROUTE POSINT.value_changed TO POSTGT.set_translation
#FIN Interpolación de posición para GLOBO2
#INICIO Interpolación de posición para GLOBO1
Transform {
rotation 0 1 0 4.18
children [
#DirectionalLight {
#ambientIntensity 0.75
#}
DEF POSINT1 PositionInterpolator {
key [0, 0.5, 1]
keyValue [ 1 20 -10,
1 2 -10,
1 20 -10 ]
}
DEF POSTGT1 Transform {
translation 0 3 -10
children [
Shape { # GLOBO1
(AQUÍ VA EL CÓDIGO DEL MODELO)
]
}
]
}
ROUTE TIMER1.fraction_changed TO POSINT1.set_fraction
ROUTE POSINT1.value_changed TO POSTGT1.set_translation
#FIN Interpolación de posición para GLOBO1