調整が良くないのか長く続きません。
調整が良くないのか長く続きません。
;; OBAQ 「ニュートンのゆりかご」;; スペースキーで動かし始める。; 調整がうまく行っていないのか途中でバラバラになってしまいます。;#include "obaq.as";内積#define global ctype DotProduct2D(%1,%2,%3,%4) (double(%1)*(%3) + double(%2)*(%4))#module; 振り子 pendulum; num : オブジェクトID; x,y : アンカー座標; distance : 距離; const_k : バネ定数; damping : 減衰#deffunc qAttach int p_num, double p_x, double p_y, double p_distance, double p_const_k, double p_dampingqgetreq@ rpr, REQ_PHYSICS_RATE ; 1フレームあたりの物理計算回数; オブジェクトの状態を取得qgetpos@ p_num, hx1, hy1, hr1qgetspeed@ p_num, vx, vy, vrqgetweight@ p_num, weiht, mt; オブジェクトからアンカーまでの距離ベクトルdx = p_x - hx1dy = p_y - hy1;cos -(dx,dy)と(vx,vy)とがなす角のcos値dd = sqrt(dx*dx + dy*dy)vv = sqrt(vx*vx + vy*vy)if (dd=0.0) | (vv=0.0) {c = 1.0} else {c = DotProduct2D( vx, vy, -dx, -dy ) / vv / dd};梁正規化ix = dx / ddiy = dy / dd; 減衰v = vv * cbvx = ix * -vbvy = iy * -vcvx = 0.0cvy = 0.0if bvx>0 {cvx = -p_dampingif (bvx - p_damping)<0 : cvx = -bvx} else {if bvx<0 {cvx = p_dampingif (bvx + p_damping)>0 : cvx = -bvx}}if bvy>0 {cvy = -p_dampingif (bvy - p_damping)<0 : cvy = -bvy} else {if bvy<0 {cvy = p_dampingif (bvy + p_damping)>0 : cvy = -bvy}}; バネ;バネの伸びdl = sqrt(dx*dx + dy*dy) - p_distance; a = x * k / mvx = ix * dl * p_const_k / weihtvy = iy * dl * p_const_k / weihtvx *= rpr ;加速度を速度に置き換えvy *= rprqspeed@ p_num, vx + cvx, vy + cvy, 0.0return#globalqreset ; OBAQの初期化; オブジェクト配置dim myball, 5repeat 5qaddpoly myball(cnt), 100, 60.0+10.0*cnt, 60.0, 0, 5.0,5.0, 0qweight myball(cnt), 6.0qdamper myball(cnt), 0.0, 0.0qinertia myball(cnt), 1.0qtype myball(cnt), 0x100loop;----------; 梁;----------; 硬いバネと大きな減衰で梁を表現します。; 梁長さlg = 30.0; バネ定数; 値が小さいほどバネが柔らかく、よく伸びるようになります。;k = 0.01k = 0.4; 減衰; 値が大きいほど振動が速く収まります。;cv = 0.0001cv = 0.2;----------; 環境;----------qgravity 0, 0.005; メインループqgetpos mybox, px,py,pr*mainredraw 0 ; 画面の更新を開始color 0,0,0:boxf ; 画面をクリアqexec ; OBAQによるオブジェクトの更新; 最初に動かすstick keyif key&16 : qspeed myball(0), -0.5color 255,255,255pos 50,50mes "スペースキーを押してください。";----------; 振り子;----------repeat 5qAttach myball(cnt), 60.0+10.0*cnt, 30.0, lg, k, cvloop; 紐を描画color 255,255,255repeat 5qgetpos myball(cnt), px,py,paqcnvaxis lpx, lpy, px, py, 0x = 60.0+10.0*cnty = 30.0qcnvaxis lx, ly, x, y, 0line lx, ly, lpx, lpyloopqdraw ; オブジェクトの描画redraw 1 ; 画面の更新を終了await 12 ; 一定時間待つgoto *main