物理モデル
物理モデルとは、モノが落ちたり、ぶつかったりする現実世界の物理法則をシミュレートしたモデルで、以前Algodooというソフトを紹介しました。
Processingでもこのようなことができるライブラリを見つけましたので、今回試してみました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 |
import fisica.*; FWorld world; FLine line1, line2; FBox box1; FCircle ball1, ball2; void setup(){ size(400, 300); smooth(); Fisica.init(this); world = new FWorld(); line1 = new FLine(0, 59, 250, 100); line1.setStroke(0,0,255); line1.setRestitution(1.0); line1.setName("line1"); line2 = new FLine(100, 220, 300, 170); line2.setStroke(0,255,255); line2.setRestitution(1.0); line2.setName("line2"); box1 = new FBox(30, 80); box1.setName("box1"); box1.setFill(255,255,0); box1.setStroke(255); ball1 = new FCircle(50); ball1.setPosition(200, 0); ball1.setName("ball1"); ball1.setFill(255,0,0); ball1.setStroke(255); ball2 = new FCircle(50); ball2.setPosition(100, 0); ball2.setName("ball2"); ball2.setFill(0,255,0); ball2.setStroke(255); world.setGravity(0, 100); world.setEdges(); world.add(ball1); world.add(ball2); world.add(box1); world.add(line1); world.add(line2); } void draw(){ background(255); world.step(); world.draw(); } void contactStarted(FContact c) { print(c.getBody1().getName() + ":"); println(c.getBody2().getName()); } void mousePressed(){ line2.setPosition(100, -50); line2.setRotation(radians(20)); println(ball1.getX() + ":" + ball1.getY()); } |
コードのほとんどが初期設定、つまりプログラムが動き出すまでにモノ(オブジェクト)の状態、ふるまい(属性)を決めるものです。
特徴的なものとしたては、setRestitution()は、ぶつかったときの跳ね返り具合、setGravity()はこの世界の重力の向きと強さといったところです。
contactStarted()は、ぶっかったときに呼ばれる関数です。
ぶつかったとき、オブジェクトを消すなどをします。
あと、マウスをクリックしたときに二つ目のラインの向きを変えてみました
オブジェクトの座標も取得できることから、データ生成に活用できそうです。
初期条件だけで、オブジェクトに複雑な動きをさせることができるのが、物理モデルの面白いところです。
新型コロナの影響で、私のプログラミング教室も休講となっていますが、この休みを有効活用して新しいことにチャレンジしてみてはいかがてしょうか?
Category: 未分類