🍥

OpenSCADで「くるくるするやつ」を自動生成

2022/12/17に公開

OpenSCADで多色印刷向きのデータを自動生成した例を紹介します。

YOYOMAKER_east氏がPrintablesで公開しているFidget Ring(別名「くるくるするやつ」)を参考に、これをOpenSCADで自動生成してみました。
https://www.printables.com/model/279026-prusalogo_fijetring

動作環境

項目 バージョンなど
MacのOS Big Sur(11.7.1)
OpenSCAD Mac版 2021.1
スライサー PrusaSlicer-2.5.0+MacOS-x64
P2PP バージョン:8.00.49
プリンター Prusa MK3S+(MK3SからMK3S+へのアップグレード品)
ノズル kaika604
Palette Palette3 Pro、ファームウェア:22.08.11.0
フィラメント Prusament PETG オレンジ、eSUN PETG 透明

単色印刷用として文字列のない本体だけ生成することも可能です。

1.生成アルゴリズム

アルゴリズムと言うほど大層なものではないですが、簡単に説明すると以下になります。

  • 同心の球殻を入れ子にしてたくさん作る
  • これの上下をぶった切る
  • 文字列をスケッチして押し出す
  • これを球殻の両側からぶっ刺す

以上をOpenSCADでプログラミングしました。OpenSCADのアプリには定数をGUIで可変できる機能があるので、直径、厚み、ギャップ、入れ子の個数、文字列などを変更できるようにしました。

2.OpenSCADソースコード

OpenSCADは3Dオブジェクトを生成するプログラミング言語ですが、GUIが充実したアプリケーションでもあります。以下からダウンロードでき、Mac、Windows、Linuxに対応しています。
https://openscad.org

ソースコードはこちら
fidget_ring.scad
// Fidget Ring自動生成 by COBAC

/* [球殻] */
// 最外殻の球殻直径
diameter = 44;

// 球殻の厚さ
thickness = 2;

// 球殻の隙間
gap = 0.8;

// 球殻の数
number = 5;

// 高さ
height = 18;

// 中心部の球殻が小さい場合に中心に穴をあけるか否か
hall = "open__"; //[open__:OPEN, close__:CLOSE]

// 穴の直径
hall_dia = 3;

/* [文字列] */
// 文字列の有無
add_string = "yes__"; //[yes__:YES, no__:NO]

// 文字列
string = "COBAC";

// 文字の大きさ
font_size = 9;

// 文字フォント(変更時はソースコードを直接修正する)
font_style = "Courier:style=Bold";

/* [生成物の選択] */
output = "shell__";  //[shell__:球殻, text__:文字列]

// 球殻を指定数作成するモジュール
module shell_gen() {
    difference() {
        // 球殻生成
        for ( i=[0:number-1] ) {
            difference() {
                sphere(d = diameter - (thickness*2 + gap*2)*i, $fn=72);
                sphere(d = diameter - (thickness*2 + gap*2)*i - thickness*2, $fn=72);
            }
        }
        //上下を切り取る
        translate([-diameter/2, -diameter/2, height/2])
            cube(diameter);
        translate([-diameter/2, -diameter/2, -diameter-height/2])
            cube(diameter);
        // 中心の穴あけ
        if (hall == "open__")
            cylinder(h=diameter, r=hall_dia, center=true, $fn=72);
    }
}

// 文字列の抜き型を生成するモジュール
module text_gen() {
    rotate([90,0,0]) linear_extrude(diameter/2)
        text(string, font=font_style, size=font_size, halign="center", valign="center");
    rotate([90,0,180]) linear_extrude(diameter/2)
        text(string, font=font_style, size=font_size, halign="center", valign="center");
}

// 生成物を選択して最終出力
if (output=="shell__")
    difference() {
        shell_gen();
        if (add_string=="yes__")
            text_gen();
    }
else
    intersection() {
        shell_gen();
        text_gen();
    }

OpenSCADのGUIで以下の項目を設定できます。(主要なものだけ示しました)

  • 最外殻の球殻直径
  • 球殻の厚さ(各球殻は同じ厚さ)
  • 球殻の隙間(各球殻間は同じ値)
  • 球殻の数
  • 高さ
  • 文字列の有無(文字列なしにすると本体だけ単色印刷できる)
  • 文字の大きさ
  • STL生成する対象(球殻本体と文字列を別のSTLで生成できる)


STL生成対象に文字列を選ぶと以下のようになります。

なお、GUIでの設定範囲の制限や警告表示など一切していないので、造形不可能な形状も生成できてしまいます。プレビュー画面でよく確認してからSTL生成してください。

3.プリント例

パージ体積を以下のように設定してスライスすると下図のようになりました。

  • 透明 → オレンジ:250mm3
  • オレンジ → 透明:400mm3


実際にプリントするとこのようになりました。PETGを用いていますが、フィラメント融着のパラメータも(4, 4, 4)のままで、特別な設定はしていません。

透明フィラメントなので内殻が少し透けています。そのため、わずかにある色移りがほとんど目立ちません。つまりパージ体積は、もう少し減らせたかもしれません。

4.おまけ

文字列のないバージョン

「文字列の有無」で「NO」を選択すると以下のようになります。Palette3やMMU2Sを使わず、単色で印刷することができます。

実際に印刷するとこんな風に出来上がりました。他の色がないためか全体的に緩めのなので、球殻の間隔をデフォルトの0.8mmから少し減らしたほうがいいかもしれません。

文字フォントの指定

ソースコード内の以下の部分で、文字フォントを変更できます。

// 文字フォント(変更時はソースコードを直接修正する)
font_style = "Courier:style=Bold";

メニューの「Help」「Font List」で文字フォントのリストが表示されます。一つを選択して、ソースコードにコピー&ペーストします。

このリストではフォントの形状を知る手段はなさそうです。また、右側ペインのGUIにペーストしても変更できませんでした。必ずソースコードを変更しなければならないようです。

円柱をぶっ刺したやつ

文字列の代わりに円柱を横からぶっ刺すモジュールも作ってみました。ソースコードだけ掲載します。ただしそのままコピペしただけでは何も起きませんので、内容を理解して、

  • 変数は実行文より先に配置する
  • text_gen()の代わりにcylinder_gen()を呼び出すようにする

などの修正が必要です。作成してみると、ある方の作品にかなり似たものが出来上がります。

ソースコードはこちら
/* [円柱] */
// 円柱の個数
cylinder_num = 8;

// 乱数のシード;
seed = 59;

// 円柱をランダムに生成する
xpos=rands(2, diameter-2, cylinder_num, seed);
ypos=rands(2,   height-2, cylinder_num, seed*2);
rud =rands(1,          5, cylinder_num, seed/2);

module cylinder_gen() {
    for(i=[0:cylinder_num-1]) {
        rotate([90,0,0])
            translate([xpos[i]-diameter/2, ypos[i]-height/2, -diameter/2])
                cylinder(h=diameter, r=rud[i], $fn=72);
    }
}

OpenSCADの参考資料

筆者がOpenSCAD習得で一番参考にしたのが、こちらの電子書籍です。
http://www.amazon.co.jp/dp/B00LEL45N2
ある程度理解できたら、こちらの一覧表が役立ちます。
https://openscad.org/cheatsheet/
一部日本語化されているユーザーマニュアルもあります。
https://ja.wikibooks.org/wiki/OpenSCAD_User_Manual
動画説明も公開されています。
https://dotinstall.com/lessons/basic_openscad

Discussion