#author("2019-05-22T11:08:08+09:00","default:qua","qua")
#author("2019-05-22T11:09:18+09:00","default:qua","qua")
#navi(Processing/3.ライブラリの利用)
* 3-3-3 Fisicaのジョイント [#ra197657]
Fisicaではバネや回転軸をジョイントで実現する。
** バネ [#af7bf875]
バネはFDistanceJointで作成する。
すでに2つの物体body1, body2が作られているものとする。
 FDistanceJoint spring;
 spring = new FDistanceJoint(body1, body2);
 world.add(spring);
で2つの物体の重心を結ぶバネが作成される。物体の重心以外の場所にバネを取り付ける場合には、
 spring.setAnchor1( x1, y1 );
 spring.setAnchor2( x2, y2 );
 spring.calculateLength();
で、物体1, 2のそれぞれの重心に対する位置(x1, y1), (x2, y2)を指定できる。
バネの強さは、バネ定数ではなく、単振動の振動数fで設定する。
 spring.setFrequency( f );
fが大きいほど強いバネになる。また、
 spring.setDamping( b );
で振動の減衰率を設定できる。
次の例はバネで結ばれた2物体の一方を固定して吊り下げた状況をシミュレートする。
 import fisica.*;
 FWorld world;
 FBox b1, b2;
 FDistanceJoint sp;
 
 void setup(){
   size( 400, 400 );
   Fisica.init( this );
   world = new FWorld();
 
   /* 箱1(静止している) */
   b1 = new FBox( 20, 20 );
   b1.setStatic( true );
   b1.setPosition( 200, 10 );
   world.add( b1 );
   /* 箱2(静止している) */
   b2 = new FBox( 20, 20 );
   b2.setPosition( 200, 100 );
   b2.setDamping( 0 );
   world.add( b2 );
   /* バネ */
   sp = new FDistanceJoint( b1, b2 );
   sp.setAnchor1( 0, 10 );
   sp.setAnchor2( 0, -10 );
   sp.calculateLength();
   sp.setFrequency( 0.5 );
   sp.setDamping( 0 );
   sp.setStroke( 255 );
   sp.setStrokeWeight( 3 );
   world.add( sp );
 }
 
 void draw(){
   background( 0 );
   world.step();
   world.draw();
 }

** 軸の周りの回転 [#d8363346]

回転軸はFRevoluteJointで作成する。
すでに2つの物体body1, body2が作られているものとする。
 FRevoluteJoint rev;
 rev = new FRevoluteJoint(body1, body2, x, y);
 world.add(rev);
で2つの物体が点(x,y)を中心とする回転軸で接続される。
次の例は「振り子」を作る。マウスで球を動かすと振動する。

 import fisica.*;
 FWorld world;
 FBox box;
 FCircle ball;
 FRevoluteJoint r;
 
 void setup(){
   size( 400, 400 );
   size( 400, 200 );
   smooth();
   Fisica.init( this );
   world = new FWorld();
   box = new FBox( 20, 20 );
   box.setStatic( true );
   box.setPosition( 200, 10 );
   world.add( box );
   ball = new FCircle( 20 );
   ball.setPosition( 200, 100 );
   ball.setDamping( 0 );
   world.add( ball );
   r = new FRevoluteJoint( box, ball, 200, 20 );
   r.setStroke( 255 );
   r.setStrokeWeight( 3 );
   world.add( r );
 }
 
 void draw(){
   background( 0 );
   world.step();
   world.draw();
 }

トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS