横軸が時間。
水色の点が、公式で計算した落下距離。
赤い線が、chipmunk の計算した落下距離。
オレンジの点が、公式で計算した落下速度。
青い線が、chipmunk の計算した落下速度。
-- 物理エンジンを使う 1 -- バージョン 3.2 で Nspire に導入された 2D 物理エンジン chipmunk を使って自由落下運動のシミュレーションを行う。 -- アニメにはせずに値だけ取得してグラフで確認してみる。 require "physics" H = platform.window:height() dt = 0.02 Time = 0 velX = 0 velY = 0 posX = 0 posY = 0 gravity = 9.8 timer.start(dt) space = physics.Space() -- space という名前の物理演算空間を作る。 space:setGravity(physics.Vect(0, gravity)) -- 作った空間 space に重力加速度を設定する。ここでは y 軸方向にのみ 9.8 unit/sec^2 の重力加速度をかける。ベクトルで設定する。 newBody = physics.Body(100, 0) -- newBody という名前の物体を作る。引数は(質量, 慣性モーメント)。慣性モーメントは本来はヘルパールーチン physics.misc.momentFor~ で計算するが、ここでは関係ないので適当な値にする。 newBody:setVel(physics.Vect(velX, velY)) -- 物体 newBody のベロシティをセットする。 newBody:setPos(physics.Vect(posX, posY)) -- 物体 newBody の位置をセットする。 space:addBody(newBody) -- 物体 newBody を空間 space へ投入する。 t = {}; v = {}; p = {} -- nspire でのグラフ化用。 function on.timer() space:step(dt) table.insert(t, Time); table.insert(v, velY); table.insert(p, posY) -- nspire でのグラフ化用 var.store("t", t); var.store("v", v); var.store("p", p) -- nspire でのグラフ化用 print(Time, velY, gravity * Time, posY, (gravity * Time^2)/2) -- コンソールでの確認用(左から「時間」「落下速度(chipmunk)」「落下速度(公式計算値)」「落下距離(chipmunk)」「落下距離(公式計算値)」) Time = Time + dt -- 経過時間の確認用 vel = newBody:vel() -- 空間 space に投入した物体 newBody のベロシティ(chipmunk の計算したベロシティ)を取得して、 velY = vel:y() -- その y 成分を取得する。 pos = newBody:pos() -- 空間 space に投入した物体 newBody の位置(chipmunk の計算した変位量)を取得して、 posY = pos:y() -- その y 成分を取得する。 if posY > H then timer.stop() end end