物理エンジンを使う 1

横軸が時間。

水色の点が、公式で計算した落下距離。
赤い線が、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