3Dプリンターで多重交差するプラレールをDIY(OpenSCAD出力スクリプトあり)
カテゴリー:#DIYプラレール(記事数:26)

↑B


2018.06.27

3Dプリンターで多重交差するプラレールをDIY(OpenSCAD出力スクリプトあり)


↓3DなプラレールのDIYが行き詰っているので楽しい方向で遊び中

基本は以前紹介したDIYプラレールOpenSCADスクリプトの応用です。↓
↓頑張って説明Youtube動画作りました↓


少しは動画作り成長してる?

以下、技術的説明です。

↓先日紹介したDIYプラレールのスクリプトを1本設置したところ。


↓もちろん重ねて設置出来ますが、交差部分に壁があり通れません。


↓そこで複数のレールを設置後に、レールの軌跡から車輪走行部分のオブジェクトを作ります(プラレールは両面走行可なので、裏表分作っています。この部分をOpenSCADのdifferenceで差し引きます。


↓完成。


↓こんなメチャクチャに交差しているレールも問題無しです。


スクリプトはこのようになります。複雑になりすぎて正確にプレビューされないし、高速なPC使わないとレンダリングにものすごく時間かかるのは仕様です。

----------------------------------------------------
$fn=10;

pitch=1/72;
wall_body=8; // normal=8
innerwall_body=8; //normal=8
wall=8; //normal=8
width=38; //normal=38

//main /////////////////////////////////////////////
difference(){
body1();
body2();
}

in(t2xyz(1),t2xyz(1+pitch));
out(t2xyz(0+pitch),t2xyz(0));
in(t2xyz2(1),t2xyz2(1+pitch));
out(t2xyz2(0+pitch),t2xyz2(0));
in(t2xyz3(1),t2xyz3(1+pitch));
out(t2xyz3(0+pitch),t2xyz3(0));
in(t2xyz4(1),t2xyz4(1+pitch));
out(t2xyz4(0+pitch),t2xyz4(0));

module body1(){
for (t=[0:pitch:1-pitch]){body(t2xyz(t),t2xyz(t+pitch),t2xyz(t+pitch*2),t);}
for (t=[0:pitch:1-pitch]){body(t2xyz2(t),t2xyz2(t+pitch),t2xyz2(t+pitch*2),t);}
for (t=[0:pitch:1-pitch]){body(t2xyz3(t),t2xyz3(t+pitch),t2xyz3(t+pitch*2),t);}
for (t=[0:pitch:1-pitch]){body(t2xyz4(t),t2xyz4(t+pitch),t2xyz4(t+pitch*2),t);}
}
module body2(){
for (t=[0:pitch:1-pitch]){bodyDelete(t2xyz(t),t2xyz(t+pitch),t2xyz(t+pitch*2),t);}
for (t=[0:pitch:1-pitch]){bodyDelete(t2xyz2(t),t2xyz2(t+pitch),t2xyz2(t+pitch*2),t);}
for (t=[0:pitch:1-pitch]){bodyDelete(t2xyz3(t),t2xyz3(t+pitch),t2xyz3(t+pitch*2),t);}
for (t=[0:pitch:1-pitch]){bodyDelete(t2xyz4(t),t2xyz4(t+pitch),t2xyz4(t+pitch*2),t);}
}

////////////////////////////////////////////////////
function t2xyz(temp)=[temp*100-50,temp,0];
function t2xyz2(temp)=[temp*70-35,temp*70-35,0];
function t2xyz3(temp)=[temp,temp*100-50,0];
function t2xyz4(temp)=[temp*70-35,-temp*70+35,0];

function XY(angle,Ddis,Vdis)=[
sign(Ddis*angle[0])*sqrt(pow(Ddis,2)/(1+pow(angle[1]/angle[0],2)))+sign(Vdis*-angle[1])*sqrt(pow(Vdis,2)/(1+pow(angle[0]/angle[1],2))),
sign(Ddis)*angle[1]/abs(angle[0])*sqrt(pow(Ddis,2)/(1+pow(angle[1]/angle[0],2)))+sign(Vdis)*angle[0]/abs(angle[1])*sqrt(pow(Vdis,2)/(1+pow(angle[0]/angle[1],2)))];


module body(pos1,pos2,pos3,tt){
Dir1=pos2-pos1;
Dir2=pos3-pos2;
translate([0,0,pos1[2]]){
linear_extrude(height = 1.5,center=true){
polygon(points=[pos1+XY(Dir1,0,width/2),pos1+XY(Dir1,0,9.5),pos2+XY(Dir2,0,9.5),pos2+XY(Dir2,0,width/2)]);
polygon(points=[pos1+XY(Dir1,0,-9.5),pos1+XY(Dir1,0,-width/2),pos2+XY(Dir2,0,-width/2),pos2+XY(Dir2,0,-9.5)]);
polygon(points=[pos1+XY(Dir1,0,8),pos1+XY(Dir1,0,-8),pos2+XY(Dir2,0,-8),pos2+XY(Dir2,0,8)]);
}

linear_extrude(height = wall_body,center=true){
polygon(points=[pos1+XY(Dir1,0,width/2),pos1+XY(Dir1,0,width/2-1.5),pos2+XY(Dir2,0,width/2-1.5),pos2+XY(Dir2,0,width/2)]);
polygon(points=[pos1+XY(Dir1,0,-width/2),pos1+XY(Dir1,0,-width/2+1.5),pos2+XY(Dir2,0,-width/2+1.5),pos2+XY(Dir2,0,-width/2)]);
}
linear_extrude(height = innerwall_body,center=true){
polygon(points=[pos1+XY(Dir1,0,9.5),pos1+XY(Dir1,0,8),pos2+XY(Dir2,0,8),pos2+XY(Dir2,0,9.5)]);
polygon(points=[pos1+XY(Dir1,0,-9.5),pos1+XY(Dir1,0,-8),pos2+XY(Dir2,0,-8),pos2+XY(Dir2,0,-9.5)]);
}
}
}

module bodyDelete(pos1,pos2,pos3,tt){
Dir1=pos2-pos1;
Dir2=pos3-pos2;
train=5;
translate([0,0,pos1[2]]){
translate([0,0,(train+1.5)/2]){linear_extrude(height = train,center=true){
polygon(points=[pos1+XY(Dir1,0,width/2-1.5),pos1+XY(Dir1,0,9.5),pos2+XY(Dir2,0,9.5),pos2+XY(Dir2,0,width/2-1.5)]);
polygon(points=[pos1+XY(Dir1,0,-9.5),pos1+XY(Dir1,0,-width/2+1.5),pos2+XY(Dir2,0,-width/2+1.5),pos2+XY(Dir2,0,-9.5)]);
}}

translate([0,0,-(train+1.5)/2]){linear_extrude(height = train,center=true){
polygon(points=[pos1+XY(Dir1,0,width/2-1.5),pos1+XY(Dir1,0,9.5),pos2+XY(Dir2,0,9.5),pos2+XY(Dir2,0,width/2-1.5)]);
polygon(points=[pos1+XY(Dir1,0,-9.5),pos1+XY(Dir1,0,-width/2+1.5),pos2+XY(Dir2,0,-width/2+1.5),pos2+XY(Dir2,0,-9.5)]);
}}

}
}

module out (pos1,pos2){
//start out
Dir1=pos2-pos1;
//hiraban
translate([pos2[0],pos2[1],pos2[2]]){
linear_extrude(height = 1.5,center=true){
polygon(points=[XY(Dir1,0,-3),XY(Dir1,7.5,-5),XY(Dir1,7.5,-1),XY(Dir1,1,-1),XY(Dir1,1,1),XY(Dir1,7.5,1),XY(Dir1,7.5,5),XY(Dir1,0,3)]);
}
linear_extrude(height = wall,center=true){
polygon(points=[XY(Dir1,0,3),XY(Dir1,-1.5,3),XY(Dir1,-1.5,8),XY(Dir1,0,8),XY(Dir1,0,4.5),XY(Dir1,9,6.5),XY(Dir1,9,1),XY(Dir1,7.5,1),XY(Dir1,7.5,5)]);
polygon(points=[XY(Dir1,0,-3),XY(Dir1,-1.5,-3),XY(Dir1,-1.5,-8),XY(Dir1,0,-8),XY(Dir1,0,-4.5),XY(Dir1,9,-6.5),XY(Dir1,9,-1),XY(Dir1,7.5,-1),XY(Dir1,7.5,-5)]);
}}
}

module in (pos1,pos2,pos3,pos4){
//start in
Dir1=pos2-pos1;
pos3=[pos1[0]+XY(Dir1,9,0)[0],pos1[1]+XY(Dir1,9,0)[1],pos1[2]];
pos4=[pos1[0]+XY(Dir1,9+pitch,0)[0],pos1[1]+XY(Dir1,9+pitch,0)[1],pos1[2]];
Dir2=pos4-pos3;

linear_extrude(height = wall,center=true){
polygon(points=[pos3+XY(Dir2,-9,-8),pos3+XY(Dir2,0,-4.5),pos3+XY(Dir2,0,-9.5),pos3+XY(Dir2,-12,-9.5),pos3+XY(Dir2,-12,9.5),pos3+XY(Dir2,0,9.5),pos3+XY(Dir2,0,4.5),pos3+XY(Dir2,-9,8)]);
polygon(points=[pos3+XY(Dir2,0,width/2-1.5),pos3+XY(Dir2,0,width/2),pos1+XY(Dir1,0,width/2),pos1+XY(Dir1,0,width/2-1.5)]);
polygon(points=[pos3+XY(Dir2,0,-width/2+1.5),pos3+XY(Dir2,0,-width/2),pos1+XY(Dir1,0,-width/2),pos1+XY(Dir1,0,-width/2+1.5)]);
}
linear_extrude(height = 1.5,center=true){
polygon(points=[pos1+XY(Dir1,0,11),pos3+XY(Dir2,0,11),pos3+XY(Dir2,0,width/2-1.5),pos1+XY(Dir1,0,width/2-1.5)]);
polygon(points=[pos1+XY(Dir1,0,-11),pos3+XY(Dir2,0,-11),pos3+XY(Dir2,0,-width/2+1.5),pos1+XY(Dir1,0,-width/2+1.5)]);
}
}
----------------------------------------------------

↓以下にすぐ出力出来る.stlファイルも置いておきます。
↓息子も大喜びで使ってくれています。


楽しく遊べますように

Category:#DIYプラレール



■ ■ ■ コメント ■ ■ ■

いいっすね!=24

名前 ↑B

コメント(※改行は省略されます)

※3回以上の連続書き込み不可
この記事のアクセス数:

本カテゴリーで直近コメントが書かれた記事


→カテゴリー:#DIYプラレール(記事数:26)
本カテゴリーの最近の記事(コメント数)