Algodoo 初心者入門、簡単スクリプト

Algodoo物理エンジン

物理シュミレーションで有名なのは、Blender・Unity(3D)ですが機能が豊富で使い方難しいです。子供でも簡単に使えるAlgodoo(2D)を勉強中です。面白いものを作ろうとするなら、スクリプトの理解がいりそうです。

本家英語サイト:ipadでも使えるようです。

子供のようにいたずらしてれば、簡単なものは動かすことできるようになります。

Algodooで花火表現できるのか:

New 動画:直線・往復運動

変数:グローバルとローカル? 変数の及ぶ範囲

{}内でしか変数使えない

Boxの「text」で変数をチェックすると便利です

スクリプト作っているとうまくいかないとき、変数をチェックしたいときがあります。その時は「text」を使います。

変数は、Sceneで使えるようにScene.my.~にした方がいいみたい。

text={“見出し”+変数} // +で連結します

consoleで変数宣言するのは、良くない

zzはどこでも使えるようになります。すべてのシーンで使える?変数はAlgodooの本体に保存される?

消すためにはReset

歯車アイコンクリックすると、サブメニューが出てきます。一番右に「Reset」があります。

scene.my. ~~

シーンごとに働く変数

複雑なものスクリプトが必要です

手動でもいいですが、スクリプトでやったほうが簡単です。

サンプル・スクリプト

丸と3角のピラミッドをつくるサンプルコード

for(30, (m) => { for(30-m, (n) =>{ scene.addCircle({ pos = [ n*2+m , m*2 ]; radius = 1.0 }) })});
for(30, (m) => { for(30-m+1, (n) =>{ scene.addPolygon({ pos = [ n*2+m+70 , m*1.0 ];surfaces := [[[-1,-1], [1,-1], [0,0]]];}) })})

for(30, (m) => { } 30回繰り返す、Algodoo独自の仕様です。

Boxを挿入するスクリプト

1個 = Scene.addBox({pos:=[0,1];size:=[2,1]})

Pos : 四角形の中心
size=[横、たて]

Box1個
for(30, (m) => { for(30, (n) =>{ scene.addBox({ pos := [ m, 0.7*n ]; size := [1.5,0.6 ]})})});

四角形の壁:

4角の壁

四角形の回転スクリプト

//四角回転たくさん
for(6, (m) => { for(6, (n) =>{ 
	scene.camera.zoom=25;
	mm=App.mousePos;
	scene.addBox({
		pos := [ mm(0)+4.7*m+(n%2)*2, mm(1)-4.5*n ]; 
		size := [2.5,1.0];
		color=[0,0,0,1];
		glued=true;  //ダメ body=0 がないと------固定
		body=0;  //-------------------------------固定
		postStep=(e)=>{
			(sim.tick % 3) == 0 ? {
			e.this.angle = e.this.angle + 0.3
		} : {}
		}
	})})}
);

Algodooの保存ファイルを読む

「phz」は読めませんが、解凍することができます。「phn」は普通のエディタ読むことができます。

横移動  onCollideを使う

ZoomとPan

Zoom:拡大率、Pan:視点の位置

//default=150
Scene.camera.zoom    //現在の値取得
Scene.camera.zoom=500;

//default=[0,0]  XY座標
Scene.camera.pan   //現在の値取得
Scene.camera.pan=[0,0];

星型・多角形・渦・歯車を描く

Inkscapeを利用し、コピー&ペースト

Algodoo 背景を変え、動かす

背景のpostStepスクリプトに:

pos = pos + [X_POSITION_TO_MOVE_PER_SECOND, _POSITION_TO_MOVE_PER_SECOND] * e.dt

pos = pos + [30, 0] * e.dt

addPolygon ポリゴン追加

Scene.addPolygon({surfaces := [[[0, 0], [0, 1], [1, 0], [1, 1]]];});

形の名前わかりません

Scene.addPolygon({surfaces := [[[0, 0], [1, 0], [0, 1], [1, 1]]];});
ばってん型02

surfaces は複数あってわだめ

 surfaces := [[[px, py], [px, py+th],[w,py+th], [w, py]]];
 py=py-h;
 surfaces := [[[px, py], [px, py+th],[w,py+th], [w, py]]];

これはエラーになる。

スクリプトで重力OnOff, 向きかえる

sim.gravitySwitch = false  //true   // 重力OFF ON

重力の向き:

sim.gravityAngleOffset=0  //下
sim.gravityAngleOffset=3.14  //上
sim.gravityAngleOffset=2.7  //斜め右上
sim.gravityAngleOffset=4.2  //斜めhidari 上

重力の強さ: gravityStrength

~秒後に色を変える(色の点滅) if

(Sim.time - 3.0) > 0 ? {e.this.color=[1,0,0,1]}:{}     //大事 2秒後赤に色が変化

条件式 ? { } : { } ;

コード省略すると、余分な()が自動で入力され、下手するとうまく動きません。

動画で説明

sim.tick(フレーム数)を使用

(sim.tick % 60)==0?{
		c=cnt % 5;
		//x=cList(c);
		color=cList(c);
		cnt=cnt+1;
		}:{}

図形の組み合わせ (CSG)

これは手動でします、スクリプトはまだわかりません。(勉強中)

切断

重なった図形(重なった部分)で切断します

差集合

重なった部分を消します、下の図形を加工。上にある図形はそのままなのでDELキーで削除します。

和集合

くっつけたい物を選択しておき、和集合。
新しく同じものが下にできます、上にあるのいらないなら消す。

プロパティの説明

timeToLive

timeToLive := 2; //2秒後に消滅

編集メニュー > 速度

「速さ」スライドバー以上の値も入れられます。大きい数値を入れればOK

赤矢印のところに、好きな数値入れてください。

Math.Pi 円周率

sin(180度)は1ではない

> math.sin((180) * math.pi / 180 );
-8.7422777e-008

algodooは計算不正確??

サンプルコード

1つスクリプトで作り、クーロンを3つ

// 回転軸つける  棒背景に貼り付け
// 大きい丸    黒 color := [0.0, 0.0, 0.0, 1.0]; 
// CTRL+選択 combine shapes > subtract > del

Scene.addCircle {
	geomID := 1;
	radius:=0.5; 
	color := [0.0, 1.0, 1.0, 1.0]; 
	pos:=[1.0,3.0]};
// 小さい丸X4
Scene.addCircle {radius:=0.15;  pos:=[1+0.5, 3+0]};
Scene.addCircle {radius:=0.15;  pos:=[1+0, 3+0.5]};
Scene.addCircle {radius:=0.15;  pos:=[1-0.5, 3+0]};
Scene.addCircle {radius:=0.15;  pos:=[1+0, 3-0.5]};
//
// リング
Scene.addPolygon({
    surfaces := [Scene.my.generatePolygonVertices(0.8, 48), Scene.my.generatePolygonVertices(0.65, 48)];
    color := [0.0, 1.0, 1.0, 1.0];
    pos := [1.0,3.0];
    glued :=true;
    body :=0
});
//Box 2
Scene.addBox({pos:=[1.0,3+0.72];size:=[0.3,0.2]});
Scene.addBox({pos:=[1.0,3-0.72];size:=[0.3,0.2]});
//
Scene.addHinge {
 	geom0 = 0;  //background
 	geom1 = 1;
 	motorTorque = 8;
 	size = 0.08;
 	geom1pos = [0.0, 0];
 	motor = true;
 	motorSpeed = 2.0;
 	color = [0.7, 0.7, 0.7, 1.0];
 	ccw = true;  //回転方向 右回り
};

マーブルレースのトラックはどう作るのがいい

四角枠

scene.camera.pan=[-2.5,31];
scene.camera.zoom=12;

px=0; //始点x
py=8;  //始点y
w=80;    //幅
h=50;    //高さ
b=2;      //レール幅

for(2,(m)=>{
	for(2,(n)=>{
		scene.addBox({ 
				pos = [ px, py+(h*m)+b*(n-2*m*n)];  //位置
				size = [w-(2*n*b),0.3];                 //[w-2*n,0.3];  //大きさ
				color=[0,0,0,1];
				glued=true;  //ダメ body=0 がないと------固定
				body=0;  //-------------------------------固定
		});
		scene.addBox({  //たて
				pos = [ -(w/2)+w*m+b*(n-2*m*n), py+h/2];  //位置
				size = [0.3,h-(2*n*b)];  //大きさ
				color=[0,0,0,1];
				glued=true;  //ダメ body=0 がないと------固定
				body=0;  //-------------------------------固定
		});
	});
});

sim.time スタートボタンを押したら動き出す

postStep=(e)=>{print(sime.time)}

これで確認できます、ただし早い。

time関係の関数:

たくさんの小さな円を背景に貼り付け、釘ピンのように使う:

Circleを無限に生み出すスクリプト:

Scene.my._oneCircle :=(px,py,r) =>{
	scene.addCircle({pos=[px,py]; radius=r;});
	}

xy座標、r半径を引数として渡してCircleを作る関数。