「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();





