ピックワールド(PIC World)

インフォメーション

この記事は 2016年12月25日 に以下のカテゴリに投稿されました OpenSCAD.

この記事のタグ

, , , , , , , , , , , , , , , , , ,


OpenSCAD で『けん玉』作ってみた – 『さら』編(初心者向けのチュートリアルに使ってね)最終回

はい。これで最後の部品、最後の部品は「さら」ですよ。

先にコマンドの細かいことなんて、あとからだんだん覚えればよいよと書いたのですが、では最初に行うことは何なのかというと、これはそのソフトウエアなり、アプリケーションでもなんでもそうだと思いますが、できる事の概要は理解しておくことが必要ですね。

ああ、こうすると「たま」が作れるんだとか、cylinder ってやると円柱ができるんだとか・・

そんなときに有効な紙、1枚をよく眺めています。

こちらの OpenSCAD のご本家にあるのですけれど、Cheat Sheet をいつも眺めながらプログラムしています。

もちろんこれだけでは足りなくて、これは特徴なのか改善点なのかはさておき、各コマンドで指定するパラメータの指定方法が特殊(ってほどでもないけど)なので、これらの指定方法をこの紙に鉛筆で書き込んで使っています。

これだけあれば、あとはエラーを出しても、コンソールで何を言っているか理解して、おおっここはこうなのねって修正しながら・・そんな感じです。

さてさて、前置きが長くなるので、そろそろ「さら」を作り始めましょう。

まずはいつものように、造形しようとする物の形をよく観察します。

どうやら、円柱を重ねれば上下は作ることができそうですが、真ん中の部分は少し頭をひねらないといけないかも。

今まで使った方法を前提に考えると、下のお皿の台は cylinder で書いて、sphere で底を球が乗る様に削ればよし、上の皿も同じようにできそうですね。

問題は、真ん中のくびれた鼓状の部分をどうするかなぁと考える。

この部分は、いろいろ方法はあると思うけれど、まず最初に考えが浮かんだのは、2次元で XY 平面上に台形を polygon で書いておいて、同じく2次元のコマンドの circle で difference してやり、とってのところで使った rotate_extrude で Z 軸上に立ち上げて 360°回転させればできそうですね。

ソースコードは、


$fn=360;

difference(){

translate([0,0,0]){

cylinder(h=10,r1=22.5,r2=22.5);

}

translate([0,0,-20.5]){

sphere(30);

}

}

difference(){

union(){

translate([0,0,10]){

rotate_extrude(angle=360){

difference(){

polygon (points=[[0,0],[22.5,0],[21,55],[0,55]],path=[[0,1,2,3]]);

translate([40,28,0]){

circle(33);

}

}
}

}

translate([0,0,65]){

cylinder(h=5,r1=21,r2=21);

}

}

translate([0,0,91.9]){

sphere(30);

}

translate([-10,0,35]){

rotate([0,90,0])

cylinder(h=20,r=5.5);

}

translate([0,-10,35]){

rotate([0,90,90])

cylinder(h=10,r=0.8);

}

}

こんな感じ。

21行目に目新しいコマンド

union(){ ・・・・}

がありますが、これは何かというと、一番上に積んだ cylinder に difference で sphere で底をお皿状にしているのですが、cylinder の厚さに収まればよかったのだけれど、収まらないので、その下にある鼓状の形状と合体させて一つの物体としているのです。

これがないと difference は cylinder にだけ適用されるので、sphere が円柱を突き抜けて、お皿の底が平らになってたまが上に乗らなくなってしまいます。

これでは困るので、difference が鼓上の形状にも適用されるように、2つの物体を合体させている。

ここで「えっ」と思われる方もいるかもしれないのですが、通常はちゃんと重なっていれば 3D プリンターで出力する際には特に全てを union で合体させておかなくても、正常に出力されるのご安心ください。

これは例えばの話ですが、このように difference を組み合わせた他の形状にも有効としたいときに使ったりする例です。

後は上のお皿部分を作って、最後にとってが入る穴と、さらととってを固定し糸を結びつけるための穴をあければ完了です。

このソースコードを OpenSCAD の左のウインドウにコピペすれば、けん玉のさらの部分が完成します。

OpenSCAD で『けん玉』作ってみた – 『さら』編

OpenSCAD で『けん玉』作ってみた – 『さら』編

ちなみに rotate_extrude する前の台形だとこんな感じ。(まぬけに見えるけど)

OpenSCAD で『けん玉』作ってみた – 『さら』編

OpenSCAD で『けん玉』作ってみた – 『さら』編

台形の半分だけ書いておいて、ぐるりと rotate_extrude しちゃう。

(この図だと、上の cylinder に sphere で difference しているけど、底が抜けてるのがわかりますね。だから下の鼓状の形状と合体させている)

でもこれ、ちょっと相変わらずプログラムっぽくないですね。

ではちょっと違う方法で同じ「さら」を書いてみましょう


//$fn=360;

difference(){

translate([0,0,0]){

cylinder(h=10,r1=22.5,r2=22.5);

}

translate([0,0,-20]){

sphere(30);

}

}

difference(){

union(){

translate([0,0,10]){

difference(){

cylinder(h=55,r1=22.5,r2=21);

for (i = [0 : 360]) {

translate([40*cos(i),40*sin(i),28]){

sphere(33);

}

}

}

}

translate([0,0,65]){

cylinder(h=5,r1=21,r2=21);

}

}

translate([0,0,91.6]){

sphere(30);

}

translate([-10,0,35]){

rotate([0,90,0])

cylinder(h=20,r=5.5);

}

translate([0,-10,35]){

rotate([0,90,90])

cylinder(h=10,r=0.8);

}

}

上のソースコードの24行目以降が少し異なります。

cylinder(h=55,r1=22.5,r2=21);

for (i = [0 : 360]) {

translate([40*cos(i),40*sin(i),28]){

sphere(33);

}

}

こう書いていますが、cylinder で台形状の円柱を書いてしまってそのあとが新しく出てきた for ループ、ここから } までの間を 0~360 まで i を1づつ増やして繰り返すというコマンドです。

そこで、次に出てくる translate([40*cos(i),40*sin(i),28]){ で原点位置を三角関数を使って計算し、その下の sphere(33); で台形から difference しているという方法です。

OpenSCAD にもちゃんと組み込み関数が沢山ありますよ。

先に紹介した Cheat Sheet をご覧になってください。

こんな感じで、先のプログラムと同じように表示されます。

OpenSCAD で『けん玉』作ってみた – 『さら』編OpenSCAD で『けん玉』作ってみた – 『さら』編

ただし、こちらのプログラムの方は、処理速度が断然違って遅いのですねぇ。

rotate_extrude も早くはないのだろうけれど、ループしながら算術関数(2つ)使ってその都度 difference だとこれぐらいのスピードになってしまう?

こちらでは実際には 3D プリンターに出力していないのですが、1行目の //$fn=360; のコメントを外してレンダリングしようとするとずいぶん長い時間返ってこないっすの状態となるので、お勧めはしません。

これでは困るので、カッコつけて書くよりも造形の為なのだからと割り切って使うのが良いのかもしれません。

いつものように cura に STL で渡して出力したのが下記。

OpenSCAD で『けん玉』作ってみた – 『さら』編

OpenSCAD で『けん玉』作ってみた – 『さら』編

これで少しプログラムっぽくなったかもしれませんが、けん玉の例では if 文が出てきませんので、これらを含め他の命令等は、また別の機会にでも説明しようかと思います。

このような感じでちょっと使っただけでも、用途によっては簡単に速く造形物が作れるし、それはアイデア(考え方)次第です。

もっともっと奥が深くて面白いので、皆さんもぜひ使ってみてください。

これで後は、「とって」部分に今回作った「さら」を差し込んで小ねじ(2ミリの短いタッピングビス)で固定し、「たま」に糸(45センチほど)を通して留めて、小ねじに結び付ければ、「けん玉」が完成します。

OpenSCAD で『けん玉』作ってみた – 完成

OpenSCAD で『けん玉』作ってみた – 完成

3回にわたりお付き合いくださいましてありがとうございました。

「けん玉」の連載は、以下の3つの記事が有ります。

  1. OpenSCAD で『けん玉』作ってみた – 『たま』編(初心者向けのチュートリアルに使ってね)
  2. OpenSCAD で『けん玉』作ってみた – 『とって』編(初心者向けのチュートリアルに使ってね)
  3. OpenSCAD で『けん玉』作ってみた – 『さら』編(初心者向けのチュートリアルに使ってね)- この記事

こんなのでも必要な人がいるのかなぁと思ったので、ぼちぼちアクセスもしていただいてるし、Thingiverse にファイルを上げておきました。

http://www.thingiverse.com/thing:1995748

お楽しみください!

投稿者のプロフィール

minorus
minorus
電子機器が大好きです。
プログラムを書くのをお仕事としていたこともあるので、両方できる PIC や Arduino を使って、いろいろな(役にあんまり立たない)ものを作っています。
実は UNIX 関連のお仕事も長かったので、Raspberry Pi もお手の物なのですけれど、これから触る機会が多くなるのかなぁ。
ボチボチ行きますが、お付き合いください。
若いころの写真なので、現時点では、まだ髪の毛は黒くてありますが、お髭は真っ白になりました。
愛車の国鉄特急カラーのカスタムしたリトルカブで、時々、秋月電子通商の八潮店に出没します。

コメントを残す

最近の投稿

最近のコメント

アーカイブ