#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(); }