この記事はShiftallのプロジェクトに関わるメンバーが日替わりでブログを更新していくアドベントカレンダー企画の14日目です。その他の記事はこちらのリンクからご覧下さい。
アドベントカレンダー2019
https://blog.shiftall.net/ja/archives/tag/adventcalendar2019/
稲垣です。普段は組み込みソフトを作っているのですが、今回は3Dモデリングをやってみることにしました。
なぜモデリングをするのか
なぜモデリングをするのか。それはそこに3Dプリンタがあるからです。使う予定のないモデルを作っても面白くありませんから、まあ一回だけでも使ってあげる (出力してやる) ということを目標に据えました。
それから、プログラミング関係の記事を書いてもイマイチ受けが良くない気がするというのもあります。手に取って見られる、その写真が出せる、そんな記事の方が万人ウケしそうな気がします。
レッツ、モデリングソフト選び
というわけでモデリングをするソフトを探しました。条件は、ポリゴンのモデルが作れること、タダであること、いつも使っているDebian GNU/Linuxで動くこと (オフライン) です。うーん、Blenderしかないか。名前だけは聞いたことがあるかな。じゃあそれで。
BlenderはフリーなのでDebianで公式パッケージがあり、aptでインストールできます。セットアップでつまづくこともありません。やったね。
※その後もうちょっと探してみたらもう少しありそうな感じでしたが、このブログは非商用というわけでもないし、最新版じゃないとイヤだし、Blenderしかないかなあと……思ったら、wings3dというソフトもあったんですねえ……Debianパッケージで。今回は最初の出会いを大切にして進めたいと思います。
Blenderの門はどこだ
それでBlenderに入門してみた記事を書こうと思ったのですが、既にBlender入門という直球な名前の立派なサイトがありまして。私は存在を知らないままモデリングを始めたのですが……。実際にBlenderを使ってみると分かるのですが、このサイトはモデリングの普通の王道的な手順をきちんと解説しているのです。最初に見るテキストとして適切です。何が王道なのかというと……:
- UIの解説から人形を作るチュートリアルへ
- UV球、円盤といった既存のオブジェクトを元にして造形
- ショートカットキーを駆使
- ミラーのモディファイアも活用
実は私が初めに参考にしていたのはBlenderの易しい使い方です。こちらは作成の手順を一つずつ追っていくというよりは、どんなことができるのか知りたいときに機能を探す目的で見るサイトという感じです。基本的な機能は一通り出ていると思います。ここで機能を把握しておくと、「この方法でいいのかなあ、もっといい方法があるんじゃないかなあ」と思い悩みながらモデリングをしなくてすみます。
そういうわけで、Blenderに入門するときはこの記事よりもそっちの記事を見るのがオススメです……。
Blenderで我が道を往く
立派なサイトで王道が解説されているので、今さら初心者がブログで解説記事を書く余地はありません。そこでこの記事では、じゃあ王道を外してみたらどうなるのかというところを体当たりで書いていきたいと思います。
なお、今回のモデリングでは「カメ」を作りたいと思います。作り始めたとき神田川にカメがいたという話を聞いただけで、特に深い意味はありません。
サブウィンドウを消す
といいつついきなり普通の解説ですが、直感的に分かりにくかったのでサブウィンドウを消す方法は書いておきます。
- 消したいサブウィンドウを決める。たとえば、Blenderを起動したときにウィンドウの下の方に鎮座していますタイムラインのサブウィンドウ。これはアニメーションをしない人には無用なので消したいと思うでしょう。例としてこれを消す方法を取り上げます。
この赤線で囲った部分を消したい - 消したいサブウィンドウと一辺を共有しているウィンドウを探す。タイムラインのサブウィンドウと一辺を共有しているのは中央の3Dビューのサブウィンドウです。
この青枠で囲った範囲が下の方の破線で二つのウィンドウに分割されていると捉える - そのハンドルを掴んで、消したいサブウィンドウの中へドラッグアンドドロップ。3Dビューのサブウィンドウの左下のハンドルを掴んで、タイムラインのサブウィンドウへドラッグアンドドロップします。
この小さいハンドルを左ドラッグで消したいウィンドウへドロップ
見事、タイムラインのサブウィンドウが消えました。この辺、タイル式なので直感的なウィンドウの再配置はできないんですね。大きく配置を変えるときは、まず分割形状を作ってから各サブウィンドウを目的の表示に切り替えるという、計画的な操作が必要になるのではないかと思います。
モデルの向きはXYZ軸に沿わせておけ
ここから実際に作ってみた話です。
Blenderの空間にはXYZの軸が表示されているのですが、うっかりして軸に対して傾いたモデルを作ってしまうと、以下のようにたいへん面倒くさいことになります (なりました):
- マニピュレータがXYZ軸方向なので、斜めに動かすのは面倒くさい
- メニューなどから移動できる視点の位置も基本的にXYZ軸方向。視線が回転の軸になるとか、掴んで移動 (平行移動) させるとスクリーンと平行な面の中を移動するなど、視点は編集するときのパラメータに深く関わってきます
- ミラーのモディファイアの軸も (ローカル) XYZ軸のいずれか

マニピュレータはまあ法線軸モードとかもあるので致命傷ではないかも知れません。視点移動はなんともなりません。ミラーのモディファイアも使いたければモデルを修正するしかありませんね。なのでお行儀よく軸に沿った形でモデリングしていくべきです。
修正するには
で、実際はそんなこと知らずにうっかり斜めにしてしまいました。そして途中から (「入門」の記事を見て) ミラーのモディファイアを使おうとしたわけです。行きあたりばったりです。
解決するためには、エディットモードに切り替えてから全頂点を回転させる必要がありました。オブジェクトモードで回転させると、ミラーモディファイアがローカル座標系を扱うらしくうまくいきません。再起不能ではなくて助かりました。


頂点はできるだけ自動で生成しろ
Blenderで形を作るというのは、結局「頂点を作って望みどおりに配置する」という作業になります。頂点はたとえば Knife でずばずば切っていくとできちゃうので、初心者はうっかりすると「必要な頂点は全部 Knifeで作っちゃおう」などと考えてしまうかも知れません。でもナイフクリアはやめておいた方がいいです。後半の「望みどおりに配置する」段階で面倒くさすぎて死にます (死にかけました)。なぜ大変なのかというと、三次元空間に頂点を配置するのに我々の道具はディスプレイデバイスもポインティングデバイスも二次元だからだと思います。手作業でやるべきではない性質のものである……ということです。
それで頂点はできるだけ自動で生成するべきです。たとえばUV sphereとかICO sphere (正20面体をsubdivideした球) とかをベースにしたり、Extrude で筒を作ったりします。球のパラメータは半径しかありませんし、Extrudeのパラメータも押し出す長さだけですので難しくありません。また Extrude で作る筒の断面が複雑な形状だとしても、断面は二次元なので調整がしやすいと思います。
スジ掘りは面倒くさい
今回作ったのはカメなので、甲羅に六角形の模様があります。輪郭にスジを掘ろうと思いました。これがまたとても面倒でして……。
Bevelでスジ掘り?
スジを掘りたいところには辺を作ってあったので、とりあえず Bevel でその両側にも辺を作ってみたんです。しかし、枝分かれした多数の辺を「凹ませる」というのが問題でした。辺を選択してから、視線が甲羅の面と平行になるように視点を動かして、それでやっと移動させられる。しかもこれをスジの底になる辺の一本一本にやるわけです。面倒くさい。


Extrudeで盛り上げてScale
逆に考えて、スジを掘るのではなく、スジ以外のところを盛り上げるというのも可能です。甲羅の形状について厳密にこうしなきゃいけないというのが無いからですね。面を選択して、Extrude で少し飛び出させてから、Scale で少し縮める。そうするといい感じにテーパーのついた飛び出し形状になります。


ExtrudeじゃなくてInsetとマニピュレータでも
ちなみに同じことは Inset でもできるかと思います。Inset を使う場合は面を飛び出させるのに Normal (法線) モードのマニピュレータを使います。



飽くまで掘りたいのなら
形状が決まっていてどうしてもスジを掘りたいというときはどうしたらいいのか……。Bevel の分割数を増やして、V字ではなくU字の溝を掘るといいのかも知れません。底面のある溝なら、底面をNormal マニピュレータで凹ませることができます。一本一本掘っていかなければなりませんが、選択して視点を調節して掘るよりは簡単でしょう……。


とりあえずプリントしてみた
形ができたのでプリントしてみることにしました。STLでエクスポート……できなかったので、Wavefront Objでエクスポートしました (こちらはできた。謎)。そしてRaise3DのideaMakerでインポート。ideaMakerはLinuxでもちゃんと動くので偉いですよ。で、プリントしてみました。

腹のラフトが取れません (恒例)……。それはともかく、なんか角がはっきり出てしまっているというか、強調されているような気がします。

仕上げで角を丸める
モデリングしているときはぶっちゃけできる限りローポリな方が楽だと思います。調整するべき頂点が少ないからです。たとえば円筒みたいなものは八角柱くらいでごまかしておきたいものです。ていうかごまかして作ったんですよ。そうやって、いざプリントしてみたら……なんと角柱の角がモロに出るんですねえ、これが。それどころか (高精度なプリントにしていないせいか) 角が強調されてしまっているようでさえあります。
なんとかならないかと調べたところ、最後の仕上げとして「Subdivideで頂点を増やして、Smooth Vertexで形状を滑らかにする」という作業をすることで角が取れて丸くなることが分かりました。曲線を構成する辺の長さが積層ピッチの2倍以下くらいに収まっていると滑らかになるんじゃないかと思います。まあ、実はプリント (正確にはスライス) するときにスケーリングして縮めているので細かいことはよく分からないんですが。
それでプリントしてみたのがこちらです:

フィラメントが黒かったのをついでに白くしてしまったので見た目が変わってしまいましたが、スジの両側が盛り上がっていたのが大きく緩和しました。滑らかな物体を作りたいときは仕上げで頂点を増やして角を丸める、というテクニックが割と有効そうです。
まとめ
自由な3D形状を作ってプリントするためBlenderを使ってみました。頂点と辺と面を編集する作業は正直あまり直感的ではありません。おかしな方法を取ると泥沼にはまってもがくことになります。私がもがいた経験が、皆さんが泥沼を避ける一助になれたら嬉しく思います。
【人材募集中!】 Shiftallでは現在プロダクトマネージャーを募集しています。ご興味をお持ちの方は下記URLから募集要項をご覧下さい。
Recruit – 株式会社Shiftall
https://ja.shiftall.net/recruit/