OpenSCADでふわっちくんを作ろう!
皆さんお久しぶりです!マージリクエストにレビュアーを割り当てるBotを運用してみての執筆を担当したYです。💪
今回は私が個人でちょっと触っている OpenSCAD についてお話します。
※こちらの記事の内容は昨年の社内アドベントカレンダーで書いたものになります。
OpenSCADとは
詳しくは↑のリンクを見てもらうのが正確ですが,通常のCADと一番違うのはスクリプトでモデルを書く点です。あと,非常に動作が軽いです。レンダリングだけは流石にちょっと堪えますが,モデルのプレビューなどはスペック低めのノートPCでさえ軽快です。出先でメインPCを持っていないタイミングでの作業などにも耐えられる優秀なソフトです。
環境構築
こちらから使用中のOSに合わせてダウンロード,インストールしてください。
Windows, macOS, Linux それぞれに対応しています。ありがたい!!!
単体でスクリプトをいじってレンダリングして…の一連の作業は可能です
(任意) VS Codeに拡張機能を入れる
なくてもいいですがある方が圧倒的に便利です。
チートシートが優秀すぎる。
VS CodeとOpenSCADを並べて書くのがやりやすいです。下図参照
かんたんなモデルを作ってみる
試しに以下のコードを書いて Preview in OpenSCAD してみましょう。(VS Codeで↑の拡張を入れてれば右上の方にアイコンが出ます。)
F5でもプレビューできます。
cube(20, center=true); // 原点中心で20*20*20[mm]の立方体
命令の意味は↑のコメントのとおりです。
もう少し付け加えたいのでチートシートを確認しながら命令を追加します。
チートシートはVSCodeで Ctrl + Shift + P で出る検索窓に scad と打つと Open Cheetsheet という項目が出て来るのでそこから開けます。
3軸それぞれにX, Y, Zと文字を彫ってみます
difference() {
// 引かれるモデル
cube(20); // 20*20*20[mm]の立方体
// 引くモデル
translate([18.5, 1.5, 1]) { // X軸側の表面から1.5[mm]だけ掘られたモデルにしたいので18.5[mm]X軸方向に移動してY軸Z軸で中央に寄せる
rotate([90, 0, 90]) { // X軸正面に向かせたいのでY軸90°Z軸90°回転
linear_extrude(2) { // 2[mm]押し出し
text(text="X", size=18); // 18[mm]のテキスト
}
}
}
translate([1.5, 1.5, 1]) { // いい感じに中央揃えにしつつ1.5[mm]掘る
rotate([90, 0, 0]) {
linear_extrude(2) {
text(text="Y", size=18);
}
}
}
translate([2, 1, 18.5]) {// いい感じに中央揃えにしつつ1.5[mm]掘る
rotate([0, 0, 0]) {
linear_extrude(2) {
text(text="Z", size=18);
}
}
}
}
一気にコードが増えて見るのが大変になりました。
これで↓のような感じになります。
使った命令ですが,↓のような感じです
difference()
立体の引き算の命令
1つめが引かれるもとになるモデル
2つめ以降はすべて引くモデル
translate()
移動の命令
x, y, z方向それぞれに指定したぶん移動する
rotate()
回転の命令
x軸, y軸, z軸それぞれで回転する
回転の軸が思っていたのと違うことになりやすいので注意したい
linear_extrude()
線形押出の命令
平面のものに高さ成分を与えてる感じ
これ以外にもたくさん命令があります。が,全てに言及していると紙面が足りなくなってしまうので,自分が勉強したときに見ていたページを紹介しておきます。ドットインストールです。こちらの講座を見ながら一通りやると,ある程度のモデルは作れるようになるのではないかな?という感じです。これが終わったらあとは公式ドキュメントを見つつ頑張りましょう。
いざふわっちくんづくりへ!
では早速ふわっちくんを作っていき…たいんですが,参考資料も何もなしではモデルが作れません。 こういうモデリングのときに必要な神器があります。ノギスです。そして参考資料として,オフィスからお借りしたふわっちくんマスコットキーホルダーを使いましょう。↓みたいな感じで測りつつ,ベースとなるモデルを作っていきます。
Level1 見る人が見ればそう
idealふわっちくんです。40行くらいで書けました。
色々と足りていませんがまずはこんな感じでしょう。ここからちょっとづつ強化していきます。
color("#ffa500") {
translate([0, 0, 10]) {
cube(size=[80, 45, 60]);
}
translate([10, 0, 0]) {
cube(size=[10, 45, 10]);
}
translate([60, 0, 0]) {
cube(size=[10, 45, 10]);
}
}
color("#777") {
translate([25, 12.5, 70]) {
cube(size=[30, 20, 5]);
}
translate([48, 22.5, 82]) {
rotate([90, 40, 0]) {
scale([0.7, 1.4, 0.7]) {
difference() {
cylinder(r=10, h=5, center=true);
cylinder(r=6, h=7, center=true);
}
}
}
}
translate([32, 22.5, 82]) {
rotate([90, -40, 0]) {
scale([0.7, 1.4, 0.7]) {
difference() {
cylinder(r=10, h=5, center=true);
cylinder(r=6, h=7, center=true);
}
}
}
}
}
Level2 まだちょっと怒られそうだけどわかる
Level1から角が丸くなってちょっとだけ強くなりました(見た目は)
レンダリング(F6でできます)すると↓のような感じです。
プレビューだと面の重なりの処理が辛いみたいで,ちょっと見栄えが悪いです。が,レンダリングしたモデルには色がないのでそれはそれで……
もうコードが貼れません。ファイル構造は↓のような感じです。そろそろ巨大ファイルが錬成されちゃって辛いことがあるので include() を使い始めました。
Level3 顔とボタンが付けば結構良さそう!
いよいよ最終形態です。Level2で大まかな形は良さそうだったので,細かな装飾を付けましょう。
レンダリングすると↓のような感じです。
これ以上の細かな調整は一旦デザイナーさんに確認いただいたほうが良さそうですね(笑)。ということにして一旦完成です!
まとめ
書いてる間に2日が経ちました...が,ひとまず書き切れました。なんとふわっちくんLevel3ではおよそ350行くらいのOpenSCAD記述が必要でした。全然辛いです。が,モデルをファイルごとに分けて書いたり関数をかけたりとかなり複雑な処理もできるのがOpenSCADの強みでもあります。特に,一度 module() を書いてしまえばあとはどんなモデルにでも include() するだけで使えるのは便利ですね。
改めてですが,OpenSCADは軽量で,かつ普段からCSSやらなんやらで数値で見た目を書き表している私達にはもってこいなCADだと思います。まだCAD触ったことがないという方,クリスマスプレゼントに3Dプリンターを買ったけどどうしたらいいかわからないという方はぜひ,OpenSCAD触ってみてください!
おまけ
3Dプリンターで作ったモデルを印刷してみました。悪くない!
この記事が気に入ったらサポートをしてみませんか?