

物理シュミレーションで有名なのは、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=[横、たて]

for(30, (m) => { for(30, (n) =>{ scene.addBox({ pos := [ m, 0.7*n ]; size := [1.5,0.6 ]})})});
四角形の壁:

四角形の回転スクリプト
//四角回転たくさん
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]]];});

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を作る関数。

