KITASENJU DESIGN BLOG

memo, html, javascript, unity

波動方程式を解く

www.nicovideo.jp

単位

波動方程式

(1/s2) * (d2u / dt2) = Δu

d2u/dt2

  • 波の高さの時間における変化の変化
  • 位置の変化=速度
  • 速度の変化 = 加速度 →波の上下運動の加速度

Δu

  • ラプラス演算子(知らないとわからん!)
  • Δu=d2/dx2u + d2/dy2u
  • 位置の二階微分
  • 波面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];
        }
}
"FOOTER"