単位
- メートル→ピクセル
- 秒→1フレーム
波動方程式
(1/s2) * (d2u / dt2) = Δu
d2u/dt2
- 波の高さの時間における変化の変化
- 位置の変化=速度
- 速度の変化 = 加速度 →波の上下運動の加速度
Δu
ラプラス演算をデジタルで表現すると
位置の変化量
- (u[x-1]-u[x])
- (u[x]-u[x+1])
位置の変化量の変化量
二次元なら
0 1 0 1 -4 1 0 1 0 の形、ラプラシアン!
つまり
波面の高さにラプラシアンフィルタをかけた値に、適当な係数をかけて、波面の上下動の加速度にしてやれば良い
コード
// 波のアップデート処理 function updateWave() { for (var x = 0; x < MAX; x++) { // 現在の波の高さにラプラシアンフィルタをかけ、 // それを加速度とする。 var nL = x-1; var nR = x+1; if(nL<0)nL=MAX-1; if(nR>MAX-1)nR=0; var accel = pos[nL] - 2 * pos[x] + pos[nR]; // 伝播速度を掛ける accel *= k; // 現在の速度に加速度を足し、さらに減衰率を掛ける vel[x]= (vel[x] + accel) * attenuation; //ためしに、戻る方向のベクトル vel[x] += (0-pos[x])/speed; } for (var x = 0; x < MAX; x++) { pos[x] += vel[x]; } }