概述

#

SpringDescription 的公式已更改,以糾正之前的錯誤,此更改會影響質量值非 1 的欠阻尼彈簧(阻尼比小於 1)。在此更改之前建立的彈簧在升級後可能會表現出不同的回彈行為。

背景

#

SpringDescription 類描述了阻尼彈簧的行為,使 Flutter 小部件能夠根據提供的引數進行逼真的動畫。阻尼彈簧的物理特性已被廣泛研究和記錄。有關阻尼的概述,請參閱 Wikipedia: Damping

此前,Flutter 計算欠阻尼彈簧行為的公式存在錯誤,如 Issue 163858 中所述。此錯誤影響了所有阻尼比小於 1 且質量非 1 的彈簧。因此,動畫未能與預期的現實世界物理現象相匹配,並且在臨界阻尼點(阻尼比正好為 1)附近的表現出現不連續。具體來說,在使用 SpringDescription.withDampingRatio 時,微小的差異,例如阻尼比為 1.0001 與 0.9999,導致動畫產生顯著差異。

該問題已在 PR Fix SpringSimulation formula for underdamping 中得到糾正,該 PR 更新了底層計算。因此,之前受影響的動畫現在表現不同,儘管框架沒有報告明確的錯誤。

遷移指南

#

僅當彈簧的阻尼比小於 1 且質量非 1 時,才需要遷移。

要恢復之前的動畫行為,請相應地更新您的彈簧引數。您可以使用提供的 JSFiddle for migration 來計算所需的引數調整。詳細的公式和解釋將在接下來的部分中給出。

預設建構函式

#

如果 SpringDescription 是使用預設建構函式、質量 m、剛度 k 和阻尼 c 構建的,則應使用以下公式進行更改:

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

遷移前的程式碼

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

遷移後的程式碼

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

.withDampingRatio 建構函式

#

如果 SpringDescription 是使用 .withDampingRatio 建構函式、質量 m、剛度 k 和比率 z 構建的,則首先計算阻尼:

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

然後應用上述公式。可選地,您可以使用以下方法將結果轉換回阻尼比:

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

遷移前的程式碼

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

遷移後的程式碼

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

時間線

#

已合併到版本:3.31.0-0.1.pre
穩定版本:3.32

參考資料

#

API 文件

相關問題

  • Issue 163858,此處發現了錯誤並可找到更多上下文。

相關 PR

工具