Python 数学公式构建海洋不明生物(好像是水母)动画 - 简谐振动
Python 数学公式构建海洋不明生物(好像是水母)动画 - 简谐振动
flyfish
效果展示与源码
可以先欣赏下海洋不明生物(好像是水母)的动画
代码绘制效果如下图
哎,咱先不说那些公式啊,先说个直观感受——你看那动画里的水母,一荡一荡的,不像硬邦邦的机器,倒真像在水里飘着,触手还轻轻颤,这股“活劲儿”哪儿来的?跟咱们小时候玩的弹簧玩具、家里挂的钟摆,是一个底层逻辑,叫啥“简谐振动”。
一、简谐振动(SHM)
简谐振动(Simple Harmonic Motion,简称SHM)是自然界最基础的周期性运动形式,也是水母动画中“振动感”的理论根源。它描述了物体在平衡位置附近的往复运动。
Harmonic 的意思
日常语境:形容关系、声音、色彩等的和谐感,比如 “harmonic relationship”(和谐的关系)、“harmonic sounds”(悦耳协调的声音)。
抽象语境:强调 “规律性、协调性”,比如 “harmonic balance”(调和平衡)
不同场景
领域 | 含义 | 典型搭配/例子 |
---|---|---|
日常/通用 | 和谐的、协调的 | harmonic atmosphere(和谐氛围) |
物理学 | 谐波的、谐频的(周期性振动成分) | harmonic motion(谐运动)、harmonics(谐波) |
音乐 | 泛音的、和声的 | harmonic series(泛音列)、harmony(和声) |
数学 | 调和的、谐波函数 | harmonic sequence(调和序列) |
1. 定义
简谐振动的本质是线性恢复力作用下的往复运动:当物体偏离平衡位置时,会受到一个与位移成正比、方向相反的“恢复力”,这个力会将物体拉回平衡位置,进而引发周期性振荡。
关键物理条件:恢复力满足胡克定律(Hooke’s Law),数学表达式为:
F=−kxF = -kxF=−kx
其中,FFF 是恢复力,kkk 是刚度常数(反映“恢复能力”强弱),xxx 是物体偏离平衡位置的位移,负号表示力的方向与位移相反(始终指向平衡位置)。
基本特征:
- 周期性:运动重复循环,完成一次完整振荡的时间(周期)固定。
- 对称性:从平衡位置到两侧最大位移(振幅)的距离相等。
- 加速度特性:加速度始终与位移反向且成正比(a=−ω2xa = -ω²xa=−ω2x,ωωω 为角频率),确保运动的往复性。
- 周期独立性:理想情况下,周期与振幅无关(例如小角度单摆,无论摆幅大小,周期基本不变)。
2. 参数
简谐振动的运动规律可通过二阶线性微分方程推导,其解为正弦或余弦函数,这也是动画中“平滑振动”的数学基础。
(1)微分方程与通解
根据牛顿第二定律(F=maF = maF=ma),结合胡克定律可推导出简谐振动的微分方程:
d2xdt2+ω2x=0\frac{d²x}{dt²} + ω²x = 0dt2d2x+ω2x=0
其中,ω=kmω = \sqrt{\frac{k}{m}}ω=mk 称为角频率(mmm 为物体质量),反映振动的“快慢”。
方程的通解(即位移随时间的变化规律)为:
x(t)=Asin(ωt+φ)x(t) = A\sin(ωt + φ)x(t)=Asin(ωt+φ) 或 x(t)=Acos(ωt+φ)x(t) = A\cos(ωt + φ)x(t)=Acos(ωt+φ)
两种形式本质一致(仅初相位相差 π2\frac{π}{2}2π),实际应用中可根据初始条件选择。
(2)参数解析
通解中的参数直接决定了振动的“形态”,也是动画中可调节效果的关键
参数符号 | 名称 | 物理含义 | 动画中作用 |
---|---|---|---|
AAA | 振幅 | 物体偏离平衡位置的最大距离(正数),反映振动的“强度”或“范围”。 | 控制抖动/脉冲的幅度(如水母抖动的剧烈程度,振幅越大,摆动越明显)。 |
ωωω | 角频率 | 单位时间内振动的角度变化(单位:弧度/秒),ω=2πf=2πTω = 2πf = \frac{2π}{T}ω=2πf=T2π。 | 控制振动的“快慢”(fff 为频率,TTT 为周期),ωωω 越大,振动越急促。 |
ttt | 时间 | 运动的时间累积,是振动随时间演变的变量。 | 动画中对应“帧数”(每帧对应固定时间间隔),确保振动的连续性。 |
φφφ | 初相位 | 振动的初始角度(单位:弧度,取值范围 000~2π2π2π),反映振动的“起始状态”。 | 避免多个物体振动同步(如两只水母的抖动错开),增加运动的自然感。 |
3. 振动持续
理想简谐振动是保守系统(无能量损耗),总能量始终守恒,这解释了振动为何能“持续往复”而不停止。
能量构成:
- 势能 UUU:由位移产生(如弹簧的弹性势能),U=12kx2U = \frac{1}{2}kx²U=21kx2,在最大位移处(x=±Ax=±Ax=±A)势能最大,动能为零。
- 动能 KKK:由速度产生,K=12mv2K = \frac{1}{2}mv²K=21mv2,在平衡位置(x=0x=0x=0)速度最大,动能最大,势能为零。
- 总能量 EEE:E=K+U=12kA2E = K + U = \frac{1}{2}kA²E=K+U=21kA2(恒定不变)。
现实中存在摩擦等能量损耗(阻尼),振动振幅会逐渐衰减(称为“阻尼振动”)。其是在微分方程中加入阻尼项 bmdxdt\frac{b}{m}\frac{dx}{dt}mbdtdx(bbb 为阻尼系数),动画中常用此原理实现“平滑转向”(如水母碰撞边界时抖动幅度减弱)。
二、从物理模型到振动效果
动画中的“振动”本质是对简谐振动的简化与适配——无需严格遵循物理定律,只需借用其“正弦函数平滑周期性”的特征,通过调节参数实现自然的视觉效果。
1. 动画中振动的逻辑
简谐振动的通解 x(t)=Asin(ωt+φ)x(t) = A\sin(ωt + φ)x(t)=Asin(ωt+φ) 可直接转化为动画中的“位置偏移公式”:
偏移量 = 振幅 × 正弦(角频率 × 时间 + 初相位) × 动态系数
其中“动态系数”是动画特有的扩展(如阻尼、转向衰减),用于增强真实感。这个公式的优势在于:
- 正弦函数输出范围为 [−1,1][-1,1][−1,1],偏移量可控且无跳变,视觉上平滑自然。
- 参数独立可调,可分别控制“强度”(振幅)、“快慢”(频率)、“起始状态”(相位),灵活度高。
2. 关键参数的动画映射
物理模型中的参数在动画中被具象化为可调节的“效果参数”
物理参数 | 动画映射参数 | 代码中对应变量示例 | 效果说明 |
---|---|---|---|
振幅 AAA | 抖动强度/脉冲幅度 | motionscalemotion_scalemotionscale、pulseamppulse_amppulseamp | motionscale=2motion_scale=2motionscale=2 表示抖动最大偏移2像素;pulseamppulse_amppulseamp 控制圆周运动的振荡范围。 |
频率 fff | 抖动速度/颜色变化速度 | pulsefreqpulse_freqpulsefreq、colorchangespeedcolor_change_speedcolorchangespeed | pulsefreq=0.2pulse_freq=0.2pulsefreq=0.2 表示每秒脉冲0.2次;colorchangespeed=1.0color_change_speed=1.0colorchangespeed=1.0 控制颜色脉动频率。 |
初相位 φφφ | 初始偏移 | phasephasephase | 随机生成 phasephasephase(000~2π2π2π),使两只水母抖动不同步。 |
阻尼系数 bbb | 转向衰减速度 | turnampdecayturn_amp_decayturnampdecay、minampmin_ampminamp | 转向时抖动幅度每帧衰减 0.050.050.05,最低至 0.20.20.2,避免运动突兀。 |
三、水母振动
水母动画的“振动感”是多层简谐振动的叠加,包括自身抖动、脉冲运动、转向平滑三大效果,每一层都基于上述原理实现。
1. 自身抖动(Jitter):模拟触手摆动
自身抖动是水母“活起来”的基础,通过在x、y方向分别叠加简谐振动,产生类似水中漂浮的颤动效果。
(1)实现公式
- x方向抖动:jitterx=sin(2t+φ)×motionscale×currentampjitter_x = \sin(2t + φ) × motion_scale × current_ampjitterx=sin(2t+φ)×motionscale×currentamp
- y方向抖动:jittery=cos(1.5t+φ)×motionscale×currentampjitter_y = \cos(1.5t + φ) × motion_scale × current_ampjittery=cos(1.5t+φ)×motionscale×currentamp
(2)参数解析与效果
- 频率差异:x方向用 2t2t2t(频率约 0.3180.3180.318 Hz),y方向用 1.5t1.5t1.5t(频率约 0.2390.2390.239 Hz),不同方向频率不同,模拟“无规则”的自然摆动(避免机械感)。
- 动态幅度:currentampcurrent_ampcurrentamp 是随转向变化的动态系数(初始1.0,转向时衰减到 minamp=0.2min_amp=0.2minamp=0.2,再逐渐恢复),实现“碰撞时收束、平稳后舒展”的真实感。
- 视觉效果:水母整体轻微颤动,触手部分因点的分布差异,摆动效果更明显。
2. 脉冲运动(Pulse):优化圆周轨迹
水母的基础运动是圆周运动,但纯圆形轨迹生硬,通过在“圆周角度”上叠加简谐振动,使轨迹产生微波浪状起伏。
(1)实现公式
- 计算角频率:w=2π×pulsefreqw = 2π × pulse_freqw=2π×pulsefreq(pulsefreq=0.2pulse_freq=0.2pulsefreq=0.2 为基础频率)
- 脉冲角度偏移:pulseadd=pulseampw×sin(wt)pulse_add = \frac{pulse_amp}{w} × \sin(wt)pulseadd=wpulseamp×sin(wt)
- 最终圆周角度:currentangle=baseangle+pulseaddcurrent_angle = base_angle + pulse_addcurrentangle=baseangle+pulseadd
(2)效果逻辑
- pulseamppulse_amppulseamp 基于圆周运动速度(如 circlespeed1×0.5circle_speed1 × 0.5circlespeed1×0.5),确保脉冲幅度与运动速度匹配。
- 当水母碰撞边界时,pulseamppulse_amppulseamp 反向(×=−1×=-1×=−1),模拟“反弹”时的脉冲方向变化,增强物理感。
3. 转向平滑:阻尼振动的应用
当水母接近画布边界时,需通过“转向”避免超出范围,此处借用阻尼振动原理,让抖动幅度平滑衰减再恢复,避免运动突兀。
(1)实现逻辑
- 边界检测:计算“拟议位置”(proposedx/yproposed_x/yproposedx/y),若接近边界(<margin+5<margin+5<margin+5 或 >canvassize−margin−5>canvas_size-margin-5>canvassize−margin−5),触发转向。
- 幅度衰减:设置 isturning=Trueis_turning=Trueisturning=True,currentampcurrent_ampcurrentamp 每帧减少 turnampdecay=0.05turn_amp_decay=0.05turnampdecay=0.05,直至 minamp=0.2min_amp=0.2minamp=0.2(转向时抖动减弱)。
- 恢复过程:转向结束后,currentampcurrent_ampcurrentamp 每帧增加 0.050.050.05,恢复至1.0(抖动强度复原)。
(2)目的
通过阻尼项模拟“能量损耗与恢复”,让转向过程从“急停反转”变为“缓慢收束再舒展”,符合真实生物的运动逻辑。
4. 颜色振动:视觉效果的延伸
除位置振动外,颜色变化也采用简谐振动原理,通过调节亮度实现“脉动感”,与位置振动形成呼应。
(1)实现公式
- 亮度系数:colorval=sin(colorfreq×t+φ)×0.5+0.5color_val = \sin(color_freq × t + φ) × 0.5 + 0.5colorval=sin(colorfreq×t+φ)×0.5+0.5(将正弦输出 [−1,1][-1,1][−1,1] 映射到 [0,1][0,1][0,1])
- 最终颜色:colors=basecolors×(0.6+0.4×colorval)colors = base_colors × (0.6 + 0.4×color_val)colors=basecolors×(0.6+0.4×colorval)
(2)效果解析
- colorfreqcolor_freqcolorfreq 控制颜色脉动速度(如第一只水母 1.01.01.0、第二只 0.80.80.8),与位置抖动频率错开,避免视觉单调。
- 亮度变化范围为基础亮度的 60%60\%60%~100%100\%100%,变化柔和不刺眼,增强水母的“生物感”。
借用简谐振动的正弦函数周期性,确保运动平滑无跳变(避免随机噪声的杂乱感)将物理参数(振幅、频率、相位)转化为直观的动画参数(抖动强度、速度、初始偏移),方便调节效果。位置抖动、轨迹脉冲、颜色脉动分别对应不同的简谐振动模型,叠加后形成丰富的自然运动。通过阻尼衰减(转向时幅度变化)、随机相位(多物体不同步)等细节,弥补理想物理模型的“机械感”。