2018.03.01
作りたい形を指定するだけでプラレールのレールの3Dプリントデータを作成するOpenSCADスクリプト
子育てとはこんなにも苦労が多いのか、息子(4歳)の教育が悪かったのか、無いものは作ればよいじゃんと言うようになってしまってパパ大変ですw。
使えない無茶なレールもこの通りw。こういうレールも息子のオモチャ箱に放り込むことで教育になるかもw
まずは手持ちのレールを物差しで測ってサイズを調べます。手書きで失礼、最近雑記帳がソニーのデジタルペーパーDPT-RP1なんです。
レールの軌跡はt[0〜1]で定義するとします。レール中央の部分(body)と飛び出た凸構造部分(out)、凹部分(in)部分の3つに分けます。
t=t1における座標を(x1, y1)とする。この時の進行方向のベクトル、その時の垂直方向のベクトルを一般化。この式を用いて(x1, y1)から垂直方向にD離れた場所の座標(XA,YA)を一般式化、シンプルな式として表せるね。
同様に進行方向にD離れた座標(XB,YB)も簡単な式で表せる。
上記式でスクリプトを組んでいきます。
下記が全スクリプトです。OpenSCADにコピペしたら動きます。$fn=10ってのは3Dモデルをレンダリングする時の解像度を表しています。気にしなくて良し。
-----------------------------------------------------
$fn=10;
function t2xy(temp)=[(30+100*temp)*sin(temp*720),(30+100*temp)*cos(temp*720)];
// sub-routin
function XY(angle,distance)=[Sign(angle[0])*sqrt(pow(distance,2)/(1+pow(angle[1]/angle[0],2))),
Sign(angle[1])*abs(angle[1]/angle[0])*sqrt(pow(distance,2)/(1+pow(angle[1]/angle[0],2)))];
function Sign(temp)=temp/abs(temp);
pitch=0.02;
// body
for (t=[0:pitch:1]){
Dir1=t2xy(t+pitch)-t2xy(t);
Ver1=[-Dir1[1],Dir1[0]];
Dir2=t2xy(t+pitch*2)-t2xy(t+pitch);
Ver2=[-Dir2[1],Dir2[0]];
linear_extrude(height = 1.5,center=true){
polygon(points=[t2xy(t)+XY(Ver1,19),t2xy(t)-XY(Ver1,19),t2xy(t+pitch)-XY(Ver2,19),t2xy(t+pitch)+XY(Ver2,19)]);
}
linear_extrude(height = 8,center=true){
polygon(points=[t2xy(t)+XY(Ver1,19),t2xy(t)+XY(Ver1,17.5),t2xy(t+pitch)+XY(Ver2,17.5),t2xy(t+pitch)+XY(Ver2,19)]);
}
linear_extrude(height = 8,center=true){
polygon(points=[t2xy(t)-XY(Ver1,19),t2xy(t)-XY(Ver1,17.5),t2xy(t+pitch)-XY(Ver2,17.5),t2xy(t+pitch)-XY(Ver2,19)]);
}
linear_extrude(height = 8,center=true){
polygon(points=[t2xy(t)+XY(Ver1,9.5),t2xy(t)+XY(Ver1,8),t2xy(t+pitch)+XY(Ver2,8),t2xy(t+pitch)+XY(Ver2,9.5)]);
}
linear_extrude(height = 8,center=true){
polygon(points=[t2xy(t)-XY(Ver1,9.5),t2xy(t)-XY(Ver1,8),t2xy(t+pitch)-XY(Ver2,8),t2xy(t+pitch)-XY(Ver2,9.5)]);
}
}
//start out
for(t=[0]){
Dir=t2xy(t+pitch)-t2xy(t);
Ver=[-Dir[1],Dir[0]];
//hiraban
translate([t2xy(t)[0],t2xy(t)[1],0]){
linear_extrude(height = 1.5,center=true){
polygon(points=[-XY(Ver,3),-XY(Dir,7.5)-XY(Ver,5),-XY(Dir,7.5)+XY(Ver,5),XY(Ver,3)]);
}}
translate([t2xy(t)[0],t2xy(t)[1],0]){
linear_extrude(height = 8,center=true){
polygon(points=[XY(Ver,3),XY(Dir,1.5)+XY(Ver,3),XY(Dir,1.5)+XY(Ver,8),XY(Ver,8),XY(Ver,4.5),
-XY(Dir,9)+XY(Ver,6.5),-XY(Dir,9)-XY(Ver,6.5),-XY(Ver,4.5),-XY(Ver,8),XY(Dir,1.5)-XY(Ver,8),
XY(Dir,1.5)-XY(Ver,3),-XY(Ver,3),-XY(Dir,7.5)-XY(Ver,5),-XY(Dir,7.5)+XY(Ver,5)]);
}}
}
//start in
t=1;
Dir=t2xy(t+pitch)-t2xy(t);
Ver=[-Dir[1],Dir[0]];
translate([t2xy(t)[0],t2xy(t)[1],0]){
linear_extrude(height = 8,center=true){
polygon(points=[-XY(Ver,8),XY(Dir,9)-XY(Ver,4.5),XY(Dir,9)-XY(Ver,9.5),-XY(Dir,1.5)-XY(Ver,9.5),
-XY(Dir,1.5)+XY(Ver,9.5),XY(Dir,9)+XY(Ver,9.5),XY(Dir,9)+XY(Ver,4.5),XY(Ver,8)]);
}
linear_extrude(height = 1.5,center=true){
polygon(points=[XY(Ver,11),XY(Dir,9)+XY(Ver,11),XY(Dir,9)+XY(Ver,17.5),XY(Ver,17.5)]);
}
linear_extrude(height = 1.5,center=true){
polygon(points=[-XY(Ver,11),XY(Dir,9)-XY(Ver,11),XY(Dir,9)-XY(Ver,17.5),-XY(Ver,17.5)]);
}
linear_extrude(height = 8,center=true){
polygon(points=[XY(Dir,9)+XY(Ver,17.5),XY(Dir,9)+XY(Ver,19),XY(Ver,19),XY(Ver,17.5)]);
}
linear_extrude(height = 8,center=true){
polygon(points=[XY(Dir,9)-XY(Ver,17.5),XY(Dir,9)-XY(Ver,19),-XY(Ver,19),-XY(Ver,17.5)]);
}}
-----------------------------------------------------
スクリプトが出来てしまったので、今後は2行目の
function t2xy(temp)=[(30+100*temp)*sin(temp*720),(30+100*temp)*cos(temp*720)];
を変更すれば色々な形のレールを出力します。関数t2xyが、今回のぐるぐるまわるレールの軌跡を示す関数です。tが0〜1まで動く時に720度回転して、それぞれのx,yの値を返します。
関数XYは距離と傾きのベクトルを与えるとその座標を返します。関数Signは数値がプラスかマイナスかを返します。pitchはbody部分をどれぐらいに分割して出力するかを示します。
まずはbody部分。
out部分。
in部分。
よ〜し、ふざけたレールを量産するぞー。
Category:#DIYプラレール
■ ■ ■ コメント ■ ■ ■
いいっすね!=107
001 [03.01 15:09]とくめいー@Biglobe:螺旋にするのって難しいの? ↑(21)
002 [03.01 21:08]。@InfoWeb:車両が曲がれるサイズの割り出しも難しそう…。 ↑(23)
003 [03.02 02:14]鯵@Biglobe:早く3Dスキャナー買おうぜ。プリンターだけじゃ楽しみ半分だぞ ↑(11)
004 [03.02 12:21]exe:私は3DCADを使って仕事をしているので、プログラムでモデリングする人を見ると素直に凄いと思う。 ↑(9)
005 [03.03 05:32]鈴木:私はこちらに変なレールをいろいろ置いてあります。よろしければこちらもどうぞ。https://www.thingiverse.com/tag:plarail/ ↑(8)
本カテゴリーで直近コメントが書かれた記事
→カテゴリー:#DIYプラレール(記事数:26)
本カテゴリーの最近の記事(コメント数)