Controlar rotación con movimiento armónico simple en 3ds Max
El problema que describes suele venir por dos causas principales: las unidades de tiempo en 3ds Max y la confusión entre grados y radianes. En 3ds Max el valor interno de tiempo que devuelve el controlador es en ticks, no en segundos, y 1 segundo = 4800 ticks (es decir ticksPerSecond = 4800).
Además, las funciones trigonométricas de MAXScript (sin, cos, ...) esperan ángulos en radianes, y los controladores de rotación trabajan normalmente con valores en radianes también. Si mezclas grados sin convertir o usas el tiempo en ticks como si fueran segundos obtienes movimientos demasiado rápidos o ruidos extraños.
Usa esta formulación clara y estable: define la amplitud en grados (para que te resulte cómoda), define la frecuencia en Hz (veces por segundo) y la fase en grados; convierte a radianes donde haga falta y convierte el tiempo a segundos usando ticksPerSecond. Por ejemplo, en un Float Script (aplicado a la componente Y de la rotación) puedes poner:
Código:
a_deg = 20.0
f_hz = 0.5
phase_deg = 0.0
s = time / ticksPerSecond
omega = 2 * 3.141592653589793 * f_hz
angle = degToRad a_deg * sin(omega * s + degToRad phase_deg)
angle
Con eso la variable a_deg es la amplitud en grados, f_hz la frecuencia en hercios y phase_deg la fase inicial en grados. La salida angle es en radianes, lista para la rotación.
Si quieres que la oscilación se vaya amortiguando, multiplica por una exponencial de decaimiento, por ejemplo para tener un amortiguamiento d por segundo:
Código:
d = 0.5
angle = degToRad a_deg * exp(-d * s) * sin(omega * s + degToRad phase_deg)
Asegúrate de que el controlador de rotación sea del tipo apropiado (por ejemplo Euler XYZ) y que sólo estés controlando el eje que deseas con el Float Script; no mezcles keyframes manuales en la misma propiedad que el script o producirás discontinuidades.
Si notas jitter a frecuencias bajas, incrementa los Solver Iterations o usa una muestra temporal más fina: el problema no es la fórmula sino el muestreo/limitación del tiempo en la evaluación si hay otros controladores o constraints en la jerarquía. Por último, para depurar imprime o visualiza s, omega*y etc. para comprobar que el tiempo está en segundos y que la frecuencia está en Hz.
Si quieres, te doy la versión lista para pegar en el Float Script con variables fáciles de editar (amplitud en grados, frecuencia en Hz, fase en grados y amortiguamiento).
|Agradecer cuando alguien te ayuda es de ser agradecido|