こんにちはKayanuma.です。
3Dプリントのネタを探しにいつものhttp://www.thingiverse.com/
を見てみました。
すると拡張子が.SCADといった見慣れないフォーマットで提供されているものがありました。
調べてみるとOpenSCADというソフトのファイルらしいということがわかりました。
・OpenSCADとは
サイトはこちら
OpenSCADは非対話型のCADです。
非対話型でどうするのかというと、形状をテキストで書いていきます。
具体的にはCSGと呼ばれる方法で立方体や球、円柱などの単純な形状をもとに合成していきます。
MayaやライトウエーブのようにGUIで操作するソフトに慣れていると奇異に感じますが、昔からある方法です。
そういえば初期のレイトレーシングソフトなどはこの方式が主流で、思った形状を表現するのにかなり苦労した思い出が・・
OpenSCADを立ち上げた様子です。
左側にコマンドなどを書くテキストエディタがあり、右にはそれをレンダリングするウインドウとメッセージを表示する領域があります。
レンダリングウインドウの視点はマウスで操作でき、
左クリック=回転
右クリック=移動
ホイール=拡大
になっています。
日本語情報は何故かあまりなく、仕方ないので
http://en.wikibooks.org/wiki/OpenSCAD_User_Manual
にあるマニュアルをGoogle翻訳しながら恐る恐るエディタに
cube(size = [1,2,3], center = true);
などと入れてみます。
なるほどなるほど。縦1横2高さ3がの立方体ができました。
CAD系なのでZ軸が高さになりますね。
center = true は原点を中心にすることを示しているのでしょう。
次に球なぞを出してみます。
sphere(r=10,$fn=100);
rは半径、$fnはプリミティブの解像度を指定しています。
$fnを1000ぐらいにすると結構待たされます。むむ。
(※ビデオボードとの相性が悪いのか、部分的に黒く表示されています)
プリミティブの出し方はわかったのでCSGっぽいことをしてみましょうか。
仕入れたばかりの知識でプリミティブを二つ出します。
cube(size = [10,15,20], center = false);
sphere(r=10,$fn=30);
これを
intersection(){}
で囲みます。
すると
のように重なっていない部分が取り除かれた形状になります。
逆に
difference(){}
で囲むと重なっている部分が取り除かれた形状になりました。
なるほどねー。
さらにこんなことができます
for(i=[0:5]){
translate([i*10,0,0])
sphere(r=3);
}
ここを見ている皆さんにはむしろ馴染み深いのではないでしょうか。モデリングに変数や制御文が使えます。
関数もあって、
for(i=[0:36]){
translate([sin(10*i)*30,cos(10*i)*30,0])
cube(size = [3,3,3], center = true);
}
なんてこともできますよ。
ローテイト命令を組み合わせて向きを揃えました。
ではこれらプログラム制御やCSG演算を組み合わせて見ます
difference(){
translate([0,0,-10])
cylinder(h = 10, r=31.5,$fn=36);
for(i=[0:36]){
translate([sin(10*i)*30,cos(10*i)*30,0])
rotate(a=i*-10,v=[0,0,1])
cube(size = [3,3,3], center = true);
}
}
プログラム制御で円形に並べたキューブで
円柱をくりぬいてみました。
GUI操作だとわりと面倒な作業ですが、指示を与えるだけで作成できてしまいます。
なにより数値で指定できるので正確な形状にできるのがいいですね。
コピペで数値を変化させれば対話形式よりも簡単にバリエーションが作れます。
まぁ、これで人体をつくれといわれたら逃亡しますが、
歯車のようなちょっとした部品を正確に作るのには重宝しそうです。
プログラム機能を極めれば芸術的な幾何学形状が得られたりするかもです。