作りたい形を指定するだけでプラレールのレールの3Dプリントデータを作成するOpenSCADスクリプト
カテゴリー:#DIYプラレール(記事数:26)

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)

名前 ↑B

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

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

本カテゴリーで直近コメントが書かれた記事
04/29 10:41:DIYカスタムプラレール売りに出しました!577323分前
03/23 01:08:お花見仕様のピンク水玉カスタム幾何学プラレール。by多色3Dプリンター。ちゃんと走るよ動画438日前
03/04 20:54:ピンクの水玉プラレールを大量製造中456日前
02/17 12:54:Bambulab A1 miniの多色出力でピンクの水玉のプラレール!472日前


→カテゴリー:#DIYプラレール(記事数:26)
本カテゴリーの最近の記事(コメント数)
2024.04.28DIYカスタムプラレール売りに出しました!11コメ
2024.03.22お花見仕様のピンク水玉カスタム幾何学プラレール。by多色3Dプリンター。ちゃんと走るよ動画38コメ
2024.03.02ピンクの水玉プラレールを大量製造中5コメ
2024.02.16Bambulab A1 miniの多色出力でピンクの水玉のプラレール!26コメ
2022.02.18俺のゴーストがこれを3Dプリンターとプラレールで再現しろと言っている8コメ
2021.04.05DIY幾何学プラレール第3弾【出力データあり】。これも美しいなぁ♪2コメ
2021.01.11DIY幾何学プラレール第2弾(メルカリに出品中)91コメ
2020.12.24幾何学DIYプラレール2020年12月最新版【3Dプリンタ用データ(stl)有り】21コメ
2020.03.05DIY幾何学プラレール3Dプリント用データ(.stl)公開(ver.2020.02.29)。完璧じゃないけど56コメ
2019.12.19DIY幾何学プラレールの外周部脱線多発ゾーンの要因分析71コメ

髫エ蟠「ツ€鬮エ蜿ー�サ�」�ス�ス髯晢スカ�ス�ク鬯ィ�セ�ス�」驍オ�コ髴郁イサ�ス�ス
髣費ソス�ス�ャ驛「譎�コ「�趣スヲ3B(髫イ�「闕ウ讓奇ソス驍オ�コ�ス�ァ驛「�ァ郢ァ�ス笙€驛「譎「�ソ�ス邵コ�ス)髫ィ蛛�スソ�ス40驍オ�イ�つ€Dcd髫ィ蛛�スソ�ス85驍オ�イ�つ€驍オ�コ陷キ�カ遯カ�ウ驛「�ァ�ス�ス遯カ�ウ髫ィ蛛�スソ�ス78驍オ�イ�つ€驍オ�コ�ス�オ驍オ�コ�ス�ス�ス讓抵スク�コ�ス�。驛「�ァ�ス�ス�ス�ス髫ィ蛛�スソ�ス2驍オ�イ�つ€驍オ�コ�ス�ェ驍オ�コ�ス�ェ驍オ�コ陷会スア�ス�ス�ク�コ�ス�ス髫ィ蛛�スソ�ス73驍オ�イ�つ€髫ィ蛛�スソ�ス髫ィ蛛�スソ�ス45驍オ�イ�つ€驍オ�コ�ス�ス�ス�ス(髮句・�スソ�ス陝キ�サ鬮」謳セ�ス�ヲ鬮」魃会スス�カ髣包スオ�ス�ス�ス�ス驍オ�コ�ス�カ驛「�ァ�ス�ス)髫ィ蛛�スソ�ス70驍オ�イ�つ€驍オ�コ�ス�ィ驍オ�コ闕ウ螂�スス竏ォ�ク�コ�ス�ス髫ィ蛛�スソ�ス82驍オ�イ�つ€JP髫ィ蛛�スソ�ス26驍オ�イ�つ€鬨セ蜈キ�ス�ス髫ィ蛛�スソ�ス53驍オ�イ�つ€驛「譎冗樟邵コ驢搾スケ譎「�ス�。驛「譎「�ス�シ髫ィ蛛�スソ�ス17驍オ�イ�つ€髯キ�キ隶朱宦閹夐辨�サ驕擾スゥ隴幢スェ鬮ォ蛛�スス�ソ髣費ソス�ス�コ TW髫ィ蛛�スソ�ス25驍オ�イ�つ€驛「譎�コ「邵コ�ス髫ィ蛛�スソ�ス346驍オ�イ�つ€驍オ�コ�ス�オ驍オ�コ�ス�ス隨�ソス驛「�ァ�ス�ス�ス讓抵スケ�ァ�ス�ス(驛「�ァ�ス�オ驛「�ァ�ス�、驛「譏懶スコ蛹�スス�ク�ス�サ髯橸スウ�ス�ー鬮「�ス�ス�ス) TW髫ィ蛛�スソ�ス96驍オ�イ�つ€knob髫ィ蛛�スソ�ス2驍オ�イ�つ€鬮ォ�ー�ス�ス髫ィ蛛�スソ�ス80驍オ�イ�つ€umomo髫ィ蛛�スソ�ス2驍オ�イ�つ€10髯晢スキ�ス�エ鬯ゥ蛹�スス�ク髫ー�ス�ソ�ス髫ィ蛛�スソ�ス48驍オ�イ�つ€�ス謫セ�ソ�ス髫ィ蛛�スソ�ス105驍オ�イ�つ€驍オ�コ�ス�オ驍オ�コ�ス�ス隨�ソス驛「�ァ�ス�ス�ス讓抵スケ�ァ髦ョ蜻サ�シ�ス�ケ�ァ髦ョ蜻サ�ソ�ス驍オ�コ遶丞、イ�ス�ス(驛「�ァ�ス�ス�ス迢暦スケ�ァ驗呻スォ�ス�ス�ケ譎「�ス�ゥ驛「譎「�ス�ェ驛「譎「�ス�シ)髫ィ蛛�スソ�ス101驍オ�イ�つ€驍オ�コ�ス�ス遶企豪�ケ�ァ�ス�ス(em驍オ�コ�ス�ァ驛「譎樔コらクコ驢搾スケ�ァ�ス�オ驛「�ァ�ス�ケ5驕カ鬆第��ス�ソ�ス�ス)髫ィ蛛�スソ�ス38驍オ�イ�つ€774(驕カ雍具スサ蜻趣スソ�ス鬮ォ諤懶ソス�ス�ス驍オ�コ�ス�イ驍オ�コ�ス�ィ)髫ィ蛛�スソ�ス83驍オ�イ�つ€鬯ゥ貊馴ア抵ソス繧会スク�コ髣企ッ会スス�ス髫ィ蛛�スソ�ス41驍オ�イ�つ€髯具スケ�ス�ソ髯キ�キ隰ウ�セ�ス�シ�ス�ス髫ィ蛛�スソ�ス28驍オ�イ�つ€orz髫ィ蛛�スソ�ス38驍オ�イ�つ€驛「�ァ陝イ�ィ�ス�ス髫ィ蛛�スソ�ス32驍オ�イ�つ€驍オ�コ髴域喚ツ€�サ驍オ�コ髴域喚ツ€�サ髫ィ蛛�スソ�ス30驍オ�イ�つ€髴大、イ�ス�ケ髯キ�サ�ス�ス驍オ�コ髴郁イサ�ス�ス髫ィ蛛�スソ�ス79驍オ�イ�つ€�ス謫セ�ソ�ス(驍オ�コ�ス�ッ驍オ�コ陋滂ス・�ス竏ォ�ク�コ�ス�ヲ驍オ�コ�ス�ョ驍オ�コ陷キ�カ遶擾スェ驍オ�コ�ス�サ) TW髫ィ蛛�スソ�ス52驍オ�イ�つ€F髫ィ蛛�スソ�ス52驍オ�イ�つ€