「physics.js」による仮想物理実験室
「ニュートンのゆりかご」のつくり方
本項では、物理シミュレーション環境構築用HTML5フレームワーク「physics.js」を用いて制作した「ニュートンのゆりかご」のシミュレーション方法を解説します。ニュートンのゆりかごとは、運動量保存則と力学的エネルギー保存則の可視化用の実験装置として考案されました。 図1はニュートンのゆりかごの実行結果です。運動するひとつの球体が球体列に衝突すると、一番反対側の球体が衝突時と同じ速度で打ち出されます。
(図1)ニュートンのゆりかごの例
「ニュートンのゆりかご」のつくり方
「ニュートンのゆりかご」は、支柱となる箱と球体間に2点間距離固定拘束力を定義、球体同士に衝突相互作用を定義、すべての球体に重力を定義します。 球体を並べる際に初期状態として接触(2球間の距離がそれぞれの半径の和に等しい)している場合には衝突計算時の連立方程式が解けないため、わずかばかり離して配置しています。
【プログラムソース1】3次元オブジェクトの例(NewtonsCradle.html)
//////////////////////////////////////////////////////////////////// PHYSICS.physLab.balls = []; PHYSICS.physLab.boxes = []; for( var i = 0; i<6; i++ ){ //球オブジェクトの準備 PHYSICS.physLab.ball[ i ] = new PHYSICS.Sphere({ (省略) //初期位置 position: { x: -3+i*1.0001, y: 0, z: 2 }, (省略) }); //球オブジェクトを登場 PHYSICS.physLab.objects.push( PHYSICS.physLab.balls[ i ] ); //箱オブジェクトの準備 PHYSICS.physLab.boxes[ i ] = new PHYSICS.Box({ ~ 省略 ~ }); //箱オブジェクトを登場 PHYSICS.physLab.objects.push( PHYSICS.physLab.boxes[ i ] ); } //初速度の設定 PHYSICS.physLab.balls[ 0 ].velocity.set( -10, 0, 0 ); //////////////////////////////////////////////////////////////////// //相互作用の準備 //////////////////////////////////////////////////////////////////// //球体同士の2点間距離固定拘束力 for( var i = 0; i<6; i++ ){ //2点間距離固定拘束力の定義 PHYSICS.physLab.setInteraction( PHYSICS.physLab.balls[ i ], PHYSICS.physLab.boxes[ i ], PHYSICS.FixedDistanceConnection, { radius :0.02 } ); //重力の設定 (省略) ); //衝突力相互作用の定義 for( var i=0; i<6; i++ ){ for( var j=i+1; j<6; j++ ){ //衝突力の定義 PHYSICS.physLab.setInteraction( PHYSICS.physLab.balls[ i ], PHYSICS.physLab.balls[ j ], PHYSICS.SolidCollision, //衝突力の定義 { Er : 1.0, //並進反発係数 } ); } } //仮想物理実験室のスタートメソッドの実行 PHYSICS.physLab.startLab();