2018.06.27
3Dプリンターで多重交差するプラレールをDIY(OpenSCAD出力スクリプトあり)
↓3DなプラレールのDIYが行き詰っているので楽しい方向で遊び中
基本は以前紹介したDIYプラレールOpenSCADスクリプトの応用です。↓3Dプリンターで作ったDIYレールで、プラレールを高い位置まで導く試み(失敗) /usePocket.com別館 最小半径で上に登っていくDIYプラレールを3Dプリンターで作る試み(その2) /usePocket.com別館
↓頑張って説明Youtube動画作りました↓作りたい形を指定するだけでプラレールのレールの3Dプリントデータを作成するOpenSCADスクリプト /usePocket.com別館 1 users 半径5cmの急カーブを楽々曲がれる改造プラレールのレールをOpenSCADと3DプリンターでDIY /usePocket.com別館
少しは動画作り成長してる?
以下、技術的説明です。
↓先日紹介した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プラレール
■ ■ ■ コメント ■ ■ ■
この記事のアクセス数:本カテゴリーで直近コメントが書かれた記事
→カテゴリー:#DIYプラレール(記事数:26)
本カテゴリーの最近の記事(コメント数)