Movimiento cola random en mel

Blat - 06/09/2007 11:13
Hola a todos, hice una expresión para automatizar el movimiento de una cola de un dinosaurio con un delay, pero sin el random queda muy rígida y poco natural, mi pregunta es:
Como se hace para controlar el comando Rand en el tiempo?
Por ejemplo, me gustaría que el Rand se activará cada x frame o mejor en un tiempo random entre x y z.

Aquí pongo la expresión:
Float $cambio.
$cambio=Rand(11,13).
$minus02 = (`getattr -t (frame- Tail1_j.rotatey`).
$minus03 = (`getattr -t (frame-20) tail1_j.rotatey`).
$minus04 = (`getattr -t (frame-36) tail1_j.rotatey`).
$minus05 = (`getattr -t (frame-56) tail1_j.rotatey`).
$minus06 = (`getattr -t (frame-79) tail1_j.rotatey`).
$minus07 = (`getattr -t (frame-100) tail1_j.rotatey`).
$minus08 = (`getattr -t (frame-113) tail1_j.rotatey`).
$minus09 = (`getattr -t (frame-123) tail1_j.rotatey`).
$minus10 = (`getattr -t (frame-135) tail1_j.rotatey`).

Tail2_j.rotatey = $minus02.

Tail3_j.rotatey = $minus03.

Tail4_j.rotatey = $minus04.

Tail5_j.rotatey = $minus05.

Tail6_j.rotatey = $minus06.

Tail7_j.rotatey = $minus07.

Tail8_j.rotatey = $minus08.

Tail9_j.rotatey = $minus09.

Tail10_j.rotatey = $minus10.

Tail1_j.rotatey = sin (time*(3)*$cambio). Gracias a todos.
LaUrA-28 - 04/01/2026 01:20
Para controlar el comando Rand en el tiempo y que se active en intervalos variables, necesitas modificar la lógica de tu expresión. El problema actual es que Rand(11,13) se evalúa en cada frame, generando un valor nuevo constantemente y causando un parpadeo aleatorio incontrolado.

La solución es crear un sistema que cambie el valor de $cambio solo en momentos específicos, no en cada fotograma. Puedes lograrlo usando la función noise o construyendo un temporizador personalizado.

Una forma efectiva y moderna es usar la función noise de MEL, que genera un ruido Perlin, ofreciendo una secuencia aleatoria pero suave y continua en el tiempo, lo cual es ideal para movimientos naturales. Reemplaza la línea donde defines $cambio con esto: $cambio = 12 + (noise(time 0.1) [/i] 2);. Esto creará un valor que oscila suavemente alrededor de 12, con una variación aproximada de ±2. Puedes ajustar el 0.1 para cambiar la velocidad de la variación y el 2 para la intensidad.

Si necesitas un cambio más abrupto en intervalos aleatorios, debes implementar un temporizador. Declara una variable global para mantener el valor y el momento del próximo cambio. La idea es usar un contador de tiempo (como time) y cambiar $cambio cuando este tiempo supere un umbral, para luego establecer un nuevo umbral aleatorio.

Aquí tienes un esquema de cómo integrarlo en tu expresión:

global float $cambio_valor;
global float $proximo_cambio;

if (time >= $proximo_cambio) {
$cambio_valor = rand(11, 13);
$proximo_cambio = time + rand(0.5, 3.0); // Cambia cada 0.5 a 3 segundos
}

Tail1_j.rotatey = sin(time
3 [/i] $cambio_valor);

Debes inicializar las variables globales fuera de la expresión, quizás en un script de inicialización o verificando si existen. Para una solución más limpia dentro de una sola expresión, puedes simularlo con funciones de frame y un poco de aritmética, pero es más complejo.

La recomendación actual es usar noise por su simplicidad y resultados naturales. Para un control de tiempo más preciso, considera usar un nodo de ruido (como noise) en el Editor de nodos de expresión de Maya, o incluso plantear la animación secundaria con herramientas como MASH o nCloth para simulación dinámica, que dan resultados muy orgánicos. Para MEL, la función noise es la mejor opción directa.