2022-04-14
VRハッカソンで開発された、西山公園バンジージャンプVR体験。よりリアルなバンジージャンプ感を届けるために、シミュレーションしてみましょう。

JavaScriptの学習環境、ES-Jamを使って、まずは自由落下。 <div id=p></div> <div id=box></div> <style> #box { position: absolute; width: 10px; height: 10px; background: black; } </style> <script type="module"> let ot = new Date().getTime(); const M = 50; // kg 体重 const G = 9.8; // m/s2 重力加速度 const DT = 1 / 60; // sec 計算間隔 const DTM = 1000 / 60; // msec 計算間隔 let y = 0; let v = 0; setInterval(() => { const t = (new Date().getTime() - ot) / 1000; const f = M * G; const a = f / M; v += a * DT; y += v; box.style.top = y * 3; p.textContent = `t:${t} y:${y}`; }, DTM); </script> HTMLのDIV要素を黒い四角にして、絶対座標で動くようにして、60分の1秒毎に力(f)、加速度(a)、速度(v)、Y座標(y)を順に計算します。 (#boxのCSS styleに、border-radius: 5px; を加えるとボールにできます。imgタグに変えると好きの画像に!)

バンジージャンプの紐をバネとみなして、紐の長さと、ばね定数を適当に設定。ついでに、空気抵抗も加えてみました。 <div id=p></div> <div id=box></div> <style> #box { position: absolute; width: 10px; height: 10px; background: black; } </style> <script type="module"> let ot = new Date().getTime(); const M = 50; // kg 体重 const G = 9.8; // m/s2 重力加速度 const DT = 1 / 60; // sec 計算間隔 const DTM = 1000 / 60; // msec 計算間隔 const K1 = 10; // n/m ばね定数 const K2 = 0.24; // kg/m 空気抵抗係数 const L = 75; // m バンジーロープ長さ const D = 0.98; // 速度減衰率 let y = 0; let v = 0; setInterval(() => { const t = (new Date().getTime() - ot) / 1000; const f = M * G - (y > L ? K1 * (y - L) : 0) - K2 * v * v; const a = f / M; v += a * DT; v *= D; y += v; box.style.top = y * 3; p.textContent = `t:${t} y:${y}`; }, DTM); </script> 速度減衰の実装はいまいちですが、記憶にあるバンジージャンプに近い感じになりました。(定数K1/K2/L/D、f/vの計算追加)

落下には関係ありませんが、バネにはパラメータとして効く体重パラメータ(M)、地面スレスレに設定して、思わず重い人がジャンプすると大変な事になりますね。

飛び降りるのではなく、上にジャンプしたらどうなるか?横揺れを考慮するとどうなるか?
実際にバンジージャンプしなくても何度も安全に試せるのがシミュレーションのいいところ!

実際に飛ぶ前には、模型などで実験してシミュレーションの検証がオススメです。

Tweet
クリエイティブ・コモンズ・ライセンス
本ブログの記事や写真は「Creative Commons — CC BY 4.0」の下に提供します。記事内で紹介するプログラムや作品は、それぞれに記載されたライセンスを参照ください。
CC BY / @taisukef / アイコン画像 / プロフィール画像 / 「一日一創」画像 / RSS