Por estos días les puedo contar que he conseguido dicho movimiento o vaivén apreciable desde la vista cabina. Este era el gran desafío que tenía, por cuanto el movimiento o animación externa era algo que ya tenía más o menos claro.
El efecto se produce gracias a la animación plana de la cabina y mediante la creación dedicada de un control (en este caso llamado "Vaiven") mediante el cual se logra, dependiendo de la velocidad, el movimiento de un lado a otro gracias al código escrito en el fichero LUA de simulación que por medio de algunos cálculos y rutinas bastante simples da velocidad y dirección al vaiven de cabina. Un arreglo con la función random entrega también algo de azar al movimiento.
Este movimiento corresponde al uso de una sola animación, pero he descubierto que es posible usar varias animaciones para los distintos sentidos de movimiento y que pueden actuar simultáneamente creando un verdadero conjunto de movimiento combinado. Pronto agregaré a este efecto pequeños "saltitos" o movimientos verticales que aparecerán al azar variando en intensidad, duración y alcance. Un bonito efecto que también pudiera lograrse con código es la inclinacion hacia abajo de la cabina cuando el tren desacelera fuertemente. En fin, las posibilidades que da la programación de los scripst en lenguaje LUA permiten hacer lo que a uno se le ocurra, practicamente.
Por ahora, este sistema lo pienso aplicar en mi automotor AES y confío que aquello pueda darle un valor agregado al trabajo total.
Acá les dejo un video para que puedan apreciar el efecto.
Y acá el código completo para que le echen un vistazo. Cada instrucción está con su respectivo comentario para que se logre entender mejor. En todo caso cualquier duda me dicen y yo les explico con más detalles.
- Código: Seleccionar todo
------------------------------------------------------------
-- Setup
------------------------------------------------------------
-- Called when the engine script is initialised
------------------------------------------------------------
function Setup ()
-- Declara las variables.
gPos = 0
gCondi = true
gIncremento = 0
gSpeed = 0
gTopeIzq = 0
gTopeDer = 0
end
------------------------------------------------------------
-- Update
------------------------------------------------------------
-- Called every frame to update the simulation
------------------------------------------------------------
-- Parameters:
-- inteval = time since last update
------------------------------------------------------------
function Update (inteval)
-- Para fines de DEBUG: Entrega los datos de las variables en el archivo salida.txt
--io.output("salida.txt")
--io.write ( "velocidad = ", gSpeed )
--io.write ( "Incremento = ", gIncremento)
--io.write ( "Posicion = ", gPos)
--io.write ( "Condicion = ", gCondi)
-- Pone la velocidad actual en la variable "gSped"
gSpeed = Call( "*:GetControlValue", "SpeedometerKPH", 0)
--------------------------------------------------------
-- Trasforma el dato a enteros
gSpeed = math.floor(gSpeed)
---------------------------
-- Dividimos por 120 para adaptar al tamaño de datos necesarios
gIncremento = gSpeed / 120
--------------------------
-- Establece al azar los límites derecho e izquierdo del movimiento
gTopeIzq = math.random(10, 70)
gTopeDer = math.random(10, 70)
-- Establece la dirección del movimiento
if gPos < (gTopeIzq * (-1)) then
gCondi = false
end
if gPos > gTopeDer then
gCondi = true
end
-- Crea el incremento en la velocidad del movimiento, da valor a la variable "gPos"
---------------------------------
if gCondi == true then
gPos = gPos - gIncremento
end
if gCondi == false then
gPos = gPos + gIncremento
end
-- Establece el frame actual del movimiento dando el dato "gPos" al control "Vaiven"
Call( "*:SetControlValue", "Vaiven", 0, gPos )
end
Saludos.