3-3-2 Fisicaで扱う物体

Fisicaで扱う物体には、剛体(FBody)、弾性体(FBlob)、これらをつなぐジョイント(FJoint)が用意されている。

剛体

剛体には線分(FLine)、球(FCircle)、箱(FBox)、多角形(FPoly)がある。

弾性体

部品の設定

bodyはいずれかの物体を表す。

次の例は床に置かれた2つの球をシミュレートする。左の球の上でマウスをクリックすると右向きの力積が加えられる。

import fisica.*;

FWorld world;
FCircle ball1, ball2;

void setup(){
  size(600,300);
  Fisica.init(this);
  world = new FWorld();
  world.setEdges();
  world.setEdgesFriction( 0 );
  ball1=new FCircle(40);
  ball1.setDamping( 0 );
  ball1.setDensity( 2 );
  ball1.setFriction( 0.1 );
  ball1.setRestitution( 1 );
  ball1.setPosition( 50, 274.5 );
  ball1.setGrabbable( false );
  ball1.setFill( 128, 255, 128 );
  world.add( ball1 );

  ball2=new FCircle(40);
  ball2.setDamping( 0 );
  ball2.setDensity( 4 );
  ball2.setFriction( 0.1 );
  ball2.setRestitution( 1 );
  ball2.setPosition( 200, 274.5 );
  ball2.setGrabbable( false );
  ball2.setFill( 255, 128, 128 );
  world.add( ball2 );
}

void mouseClicked(){
  if( dist( mouseX, mouseY, ball1.getX(), ball1.getY() )<20 ){
    ball1.addImpulse( ball1.getMass()*100, 0 );
  }
}


void draw(){
  background(0);
  world.step();
  world.draw();
}

また、上のプログラムのdraw()の部分を次のように書き換えると、2つの球が接触すると右側の球の色がしばらく(0.5秒ほど)青くなる。

int counter = 0;
void draw(){
  background(0);
  world.step();
  if( ball1.isTouchingBody( ball2 ) ){
    counter = 30;
  }
  if( counter>0 ){
    ball1.setFill( 0, 0, 255 );
    counter --;
  } else {
    ball1.setFill( 255 );
  }  
  world.draw();
}

ここで、counterという変数が青く表示する時間を保持している。

  if( ball1.isTouchingBody( ball2 ) ){
    counter = 30;
  }

の部分で2つの球が接触するとcounterを30にセットする。以降、counterは青く表示する時間をカウントダウンし、0になると白で表示するようにする。


トップ   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS