欠阻尼彈簧公式已更改
概述
#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遷移前的程式碼
const spring = SpringDescription(
mass: 20.0,
stiffness: 10,
damping: 1,
);遷移後的程式碼
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)遷移前的程式碼
const spring = SpringDescription.withDampingRatio(
mass: 5.0,
stiffness: 6.0,
damping: 0.03,
);遷移後的程式碼
const spring = SpringDescription.withDampingRatio(
mass: 1,
stiffness: 1.87392,
ratio: 0.60017287468545,
);時間線
#已合併到版本:3.31.0-0.1.pre
穩定版本:3.32
參考資料
#API 文件
相關問題
- Issue 163858,此處發現了錯誤並可找到更多上下文。
相關 PR
工具