Saltar al contenido principal

Cambió la fórmula de resorte subamortiguado

La fórmula para `SpringDescription` cambió para corregir un error anterior, afectando a resortes subamortiguados (relación de amortiguamiento menor que 1).

Resumen

#

La fórmula para SpringDescription cambió para corregir un error anterior, afectando a resortes subamortiguados (relación de amortiguamiento menor que 1) con valores de masa distintos de 1. Los resortes creados antes de este cambio pueden mostrar comportamientos de rebote diferentes después de la actualización.

Contexto

#

La clase SpringDescription describe el comportamiento de resortes amortiguados, lo que permite que los widgets de Flutter se animen de manera realista según los parámetros proporcionados. La física de los resortes amortiguados está ampliamente estudiada y documentada. Para una descripción general del amortiguamiento, consulta Wikipedia: Damping.

Anteriormente, la fórmula de Flutter para calcular el comportamiento de un resorte subamortiguado era incorrecta, como se reportó en el Issue 163858. Este error afectaba a todos los resortes con una relación de amortiguamiento menor que 1 y una masa diferente de 1. En consecuencia, las animaciones no coincidían con la física esperada del mundo real, y el comportamiento alrededor del punto de amortiguamiento crítico (relación de amortiguamiento exactamente de 1) presentaba discontinuidades. Específicamente, al usar SpringDescription.withDampingRatio, pequeñas diferencias, como relaciones de amortiguamiento de 1.0001 frente a 0.9999, daban como resultado animaciones significativamente diferentes.

El problema se corrigió en el PR Fix SpringSimulation formula for underdamping, que actualizó el cálculo subyacente. Como resultado, las animaciones previamente afectadas ahora se comportan de manera diferente, aunque el framework no reporta errores explícitos.

Guía de migración

#

La migración es necesaria solo para resortes con relaciones de amortiguamiento menores que 1 y masas distintas de 1.

Para restaurar el comportamiento de animación anterior, actualiza los parámetros del resorte según corresponda. Puedes calcular los ajustes de parámetros requeridos usando el JSFiddle para migración proporcionado. En las siguientes secciones se incluyen fórmulas y explicaciones detalladas.

Constructor predeterminado

#

Si la SpringDescription se construyó con el constructor predeterminado con masa m, rigidez k y amortiguamiento c, entonces debe cambiarse con la siguiente fórmula:

new_m = 1
new_c = c * m
new_k = (4 * (k / m) - (c / m)^2 + (c * m)^2) / 4

Código antes de la migración:

dart
const spring = SpringDescription(
  mass: 20.0,
  stiffness: 10,
  damping: 1,
);

Código después de la migración:

dart
const spring = SpringDescription(
  mass: 1.0,
  stiffness: 100.499375,
  damping: 20,
);

Constructor .withDampingRatio

#

Si la SpringDescription se construyó con el constructor .withDampingRatio con masa m, rigidez k y relación z, primero calcula el amortiguamiento:

c = z * 2 * sqrt(m * k)

Luego aplica la fórmula anterior. Opcionalmente, puedes volver a convertir el resultado a relación de amortiguamiento con:

new_z = new_c / 2 / sqrt(new_m * new_k)

Código antes de la migración:

dart
const spring = SpringDescription.withDampingRatio(
  mass: 5.0,
  stiffness: 6.0,
  damping: 0.03,
);

Código después de la migración:

dart
const spring = SpringDescription.withDampingRatio(
  mass: 1,
  stiffness: 1.87392,
  ratio: 0.60017287468545,
);

Timeline

#

Lanzado en la versión: 3.31.0-0.1.pre
En versión estable: 3.32

Referencias

#

Documentación de la API:

Issues relevantes:

  • Issue 163858, donde se descubrió el error y se puede encontrar más contexto.

PRs relevantes:

Herramienta: