3Dモデルをいろいろ作ってみたい

3Dモデルをいろいろ作ろうとがんばっています。苦労した点、役に立ちそうな情報を発信していきます。

Thingiverseに3Dモデルを公開しました

先日作成した宇宙船ですが、せっかくならとThingiverse

https://www.thingiverse.com/thing:3877842

に3Dモデルを公開しました。

f:id:ichidaya:20190921123048j:plain

宇宙船

こんなものでも意外とダウンロードしてくれる人もいたので、お世話になっているコミュニティへのGive backの意味もかねて、作成が一段落した3DモデルについてはOBJファイルをThingiverse公開していこうと思います。

 

と言っても人に見せられるレベルのモデルがそうあるわけでもなくとりあえずはこれまで作ってきた日本の立体地図パズルに沖縄を加えて47都道府県そろえたものを登録しました。

f:id:ichidaya:20190907221544j:plain

日本地図パズル

ファイルのサイズや数に制限があるように見えた(後から試したらそういうわけでもないらしい)ので3つに分けて登録しています。

https://www.thingiverse.com/thing:3886688

https://www.thingiverse.com/thing:3886714

https://www.thingiverse.com/thing:3886732

 

Scriptを作成してモデリング作業の効率アップ

前回記事のロフト操作だけで宇宙船を造形するというアイデアは半年くらい前から温めていたのですが、試してみるとけっこう手間がかかるためなかなか完成できないというのが実情でした。

 

ichidaya.hatenablog.jp

 

基準となる平面を選択後に長さを指定してオフセット平面を作る、その平面でスケッチを開く、中心点の指定と長軸、短軸の長さを指定して楕円を書いてスケッチを閉じる、これだけ操作して断面の楕円形が1個できあがりです。この一連の操作を何回か繰り返してロフト操作を実施してやっと1個の形状が完成です。宇宙船の胴体部分など所望のかたちにするのに断面を10個ぐらい定義しなければならず、めんどくさがり屋は作業を続ける気力が尽きてしまいます。

そこで宇宙船のモデリングの前にこういった機械的作業を簡単にするためのスクリプトを作成することにしました。Fusion 360はユーザーが自分で機能を拡張できるようAPIを提供してくれており、PythonまたはC++でプログラミングを行えます。私は試行錯誤がしやすいPythonを使うことにしました。

Shift-Sの押下でスクリプトとアドインダイアログが立ち上がり、そこから作成ボタンでスクリプトの編集や実行が可能です。

f:id:ichidaya:20190923000320p:plain

スクリプトとアドインダイアログ

作成したスクリプトBodyGeneratorMk2を起動します。現れたダイアログで左下のAddボタンをクリックすることで楕円がZ軸(画面上の青い軸)に沿って追加されそれらで作られる形状がプレビュー表示されます。ダイアログのテーブル内の数字(単位はmm)を変更することで楕円(この例では円)の大きさや位置を変更できます。気に入った形状になったらOKボタンを押して確定します。

f:id:ichidaya:20190923102130p:plain

BodyGeneratorスクリプト使用例(1)

 中心高さの値を変えていくと楕円の中心位置をずらしていくことができます。断面を並べる軸をY軸に変更すれば翼のような形状を作ることもできます。

f:id:ichidaya:20190923104445p:plain

BodyGeneratorスクリプト使用例(2)

このスクリプトを使って前述の宇宙船モデルを根気を切らすことなく作ることができました。参考までにスクリプトのソースを載せておきます。

www.dropbox.com

 ここから先はプログラミングに関する覚書です。作成したスクリプトの全体構造を示すクラス図を下に示します。仮称でmainとしているのは作成するスクリプトの本体でこの中のrun()メソッドがFusion 360から呼び出されて処理がはじまります。run()メソッド中ではCommandDefinitionとMyCommandCreateHandlerの2つのクラスのインスタンスを作成しています。CommandDefinitionは実行例の画面にでてくる入力用のダイアログボックスを表すクラスです。CommandDefinitionが保持しているXXXXInputクラスはダイアログボックス内の数値入力のフィールドやボタンに対応しています。数値が入力されたりボタンが押されたときの処理を行うイベントハンドラ(MyCommandInputChangedHadler、MyCommnadExecuteHandler)はMyCommandCreateHandlerが作成してCommandDefinitionに登録しています。

f:id:ichidaya:20190923110452p:plain

BodyGeneratorスクリプトのUIの構造

 作成される形状に相当するのはShapeクラスです。ダイアログ中のOKボタンが押下されたときに実行されるMyCommnadExecuteHandlerのnotify()メソッドの中でShapeのインスタンスが作成されます。ShapeインスタンスのbuidlShape()メソッドは以下の図にあるようなFusion 360提供のクラスを使って形状を作っています。コンストラクション平面やスケッチ、プロファイルなどマニュアルで作業を行うときに扱うオブジェクトごとにAPIが準備されています。

f:id:ichidaya:20190923135116p:plain

3D形状のクラス構造

 

楕円形のロフト操作だけで宇宙船を造形する

どうやったら造形のセンスが全くない私がかっこよいSFメカをデザインすることができるのかと悩んでいたところ、amazonでこんな本を見つけました。

https://www.amazon.co.jp/零士メーターから始めるSFメカの描き方-板橋克己/dp/4768308813

f:id:ichidaya:20190918232202j:plain

零士メーターから始めるSFメカの描き方

著者の板橋克己氏によると円や矩形などの単純な図形を組み合わせていくことで宇宙船などのSFメカを描くできるとのこと。この本には具体的な例が多数掲載されています。そうは言われても、単純な図形とはいえ二次元の世界だとパースや透視法を意識してきちんと描くのは私には困難です。しかし、三次元の世界ならFusion360のようなツールを使えば絵のセンスの無さや手先の不器用さはそれほど致命的な障壁にならないかもしれない。そう考えて、楕円と楕円同士のロフト(断面同士をつないでかたちを作る機能)だけで宇宙船を作ることに挑戦しました。

 まずはメインの胴体部分です。本当に単純な円をつないでいるだけですが、断面を絞ったり膨らませたりすることで形状にアクセントをつけることができるということで試してみました。

f:id:ichidaya:20190919230217p:plain

円をロフトでつないで作った胴体

 バルジと呼ばれるふくらみを胴体に付加することでもアクセントををつけることができます。バルジ自体は楕円形のロフトで作れる単純な形状ですがこれを円周上に配置して胴体に加えるとちょっとだけ宇宙船ぽいかたちになってきました。

f:id:ichidaya:20190919233255p:plain

バルジ(左)と胴体に付加した例(右)

バルジの大きさを変えたり、付加ではなく削る操作にすることでさらにバリエーションをつけることができます。

f:id:ichidaya:20190920215018p:plain

細かいバルジをつけた胴体

あと、松本マンガに出てくる宇宙船を観察してアクセントをつける小道具になっていると思ったのが翼(真空中を航行する宇宙船に翼はないか?)というかアンテナ的な形状(下図の左)でした。これも楕円のロフトで作った2つの形状(下図中と右)を結合することで作ることができます。

f:id:ichidaya:20190920222239p:plain

アンテナ形状の作成

このアンテナを大きさを変えて宇宙船の先端部や後部に配置しました。宇宙船の前部に小さなアンテナを複数つけると攻撃的な印象になります。

f:id:ichidaya:20190920225003p:plain

大小のアンテナを配置

ブリッジと補助推進機関っぽい部品を追加します。これらも楕円のロフトだけで作っています。

f:id:ichidaya:20190920230530p:plain

ブリッジと補助推進機関

 さらに以前に書いたスジ彫りや簡単な押出の機能を使ってもうちょっただけ細部の形状を追加します。

ichidaya.hatenablog.jp

 

できあがったモデルはこんな感じです。

f:id:ichidaya:20190920231900p:plain

完成した3Dモデル

 DAZ 3D Studioというフリーのソフトにインポートしてレンダリングしてみました。ちょっと光モノを追加しています。

f:id:ichidaya:20190921115328p:plain

Daz3D Irayでレンダリング(1)

f:id:ichidaya:20190921115417p:plain

Daz3D Irayでレンダリング(2)

 もちろんAdventure3で3Dプリントもしてみました。今回は特にパーツにわけたりせずに垂直に立てた状態で出力しています。全長80mmくらいの大きさなんですが、残念ながらこのスケールだと先端部のアンテナは細すぎて再現できませんでした。

f:id:ichidaya:20190921123048j:plain

3Dプリントした宇宙船

先端部のアンテナはもう少し太く短くしたら出力することができました。

f:id:ichidaya:20190924224559j:plain

微修正して3D プリントやりなおし

図画工作のセンスが全くなくてもこれくらいまでは作れるしまだ向上の余地はありそう。テクノロジーの進歩とはありがたいものです。

 

立体地図を作る -なんと新潟を忘れてました-

今日は地図の各ピースの裏側に都道府県名を示すラベルを貼るという地味だが必須(やっておかないと自分でもピースを組みたてるのにすごく時間がかかる)の作業を行いました。

f:id:ichidaya:20190907210022j:plain

地図ピースへのラベルの貼り付け

シール用印刷用紙だけだとすぐはがれてしまうので、貼ったあとで紫外線で固まるタイプの透明レジンを上から垂らして覆っています(下の写真、ちょっと見にくいかな)」。

f:id:ichidaya:20190907215703j:plain

ラベルを貼った上からレジンをたらす

ところが、ひととおりピースにラベルを貼り終わったのにラベルがまだ残っている...「新潟」。あれっといってピースを捜したらしばらく前から机のすみっこに忘れられていた。

f:id:ichidaya:20190907220639j:plain

机の片隅に置き忘れていた新潟県のピース

前回のBlogで「北海道と沖縄以外は完成!」といって載せていた写真を見直すとなんと新潟県が抜けている!!  新潟県民のみなさま、ごめんなさい。

f:id:ichidaya:20190907221057j:plain

新潟抜きの地図でした

あらためて、離島と沖縄を除く地図パズルの完成形を写真にとりました。

f:id:ichidaya:20190907221544j:plain

沖縄を除く日本地図

 

立体地図を作る -ピースに磁石を埋め込んでみた。-

立体地図のピースに磁石を埋め込んでみました。紙の上でピースを組み合わせているとすぐに動いてしまうので、磁石がくっつくホワイトボードの上などでやれば気楽に楽しめるのではないかと思ったのです。各ペースの3DモデルをZBrushで編集して裏面に円筒形の磁石を埋め込む穴をあけて出力し、Amazonで買ったネオジム磁石を埋め込んでみました。

f:id:ichidaya:20190831155825j:plain

地図ピースへの磁石の埋め込み

上の写真で左は直径5mm、右は直径2mmの磁石を埋め込んだものです。

3Dプリンタの調子も良くなったところで出力作業を続け、北海道と沖縄以外の都府県のピースは出力が終わりました。しばらく四苦八苦してピースを合わせたのがこんな感じ。

f:id:ichidaya:20190831222042j:plain

日本地図ほぼ完成図

磁石でホワイトボードにくっついているのでちょっとゆらしたくらいでは動きません。

縦に起こして持っても大丈夫。

f:id:ichidaya:20190831222244j:plain

縦にして持ってみた

 

Adventure3のフィラメントがロードできなくて困った件の顛末

3DプリンタAdventure 3を使い始めて3か月強、順調に働いてくれていたプリンタですが2度目のフィラメントの交換時にトラブルが発生しました。ロード/アンロードが機能しなくなりフィラメントの送り出しが全くできなくなってしまったのです。ノズルの詰まりが原因かと思って付属の針金で掃除したのですが状況は変わらず。

メールでサポートに問い合わせたところ対処方法として提示されたのが

1.較正をやりなおす

2.ノズル温度を上げる

3.押出部のギアについているカスを掃除する

でした。ノズル温度が高い状態で物理的に手でフィラメントを引っ張っても全く動かないので正直1や2の処置で問題が解決するとは思えません(いちおう試したけれどやっぱりだめした)。3.についても見える範囲ではカスはついていません(見かけは下記のような感じ)。

f:id:ichidaya:20190827211552j:plain

原因は押出部だなとあたりをつけて思いきってギア回りの部品をはずしてみたら、やはりでした。下の写真(フィラメントは抜いた状態)のように折れたか剥がれたかしたフィラメントのかけらが詰まっていました。

f:id:ichidaya:20190827212104j:plain

押出部に詰まっていたフィラメントのかけら

このかけらを除いて部品をはめなおせばよかったのですがここで大失敗。部品のバネをはめそこねてプリンタ筐体の裏側に落としてしまったのです。しょうがないのでまたサポートに助けを求めたらていねいに筐体の分解手順を教えてくれました。

f:id:ichidaya:20190827213018j:plain

筐体横のプラスティックカバーを外した状態

これで落ちていたバネを見つけてもう一度組み立てて無事にロード/アンロードができるようになりました。

これで大丈夫と出力しようとしたら出力途中で頻繁に(というか必ず)filament errorが発生して出力を中断してしまうようになりました。ノズル温度が低いのではないかと思い初期設定(210℃になっていたけと最初からこうだったかな?)より少し上げて220℃にしたところ快調に出力するようになりました。何も設定を変えていないのになぜerrorがでるようになったのかは不明ですがいまのところは結果オーライで使用しています。

今回のトラブルですが、ノズルが詰まっている/詰まりかけている状態でロードのときに無理やりフィラメントを押し込もうとしてフィラメントが割れた/剥がれたのが原因のようです。これまでノズルの掃除は全くしていなかったのですが、今後は定期的に実施せねばと思いました。

立体地図を作るのに便利なプログラム2種についての覚書

立体地図のモデル(OBJ形式)を制作で品質や作業効率の改善のために以下のようなPythonプログラムを作ってみました。いずれもOBJ形式データを生成するませに標高メッシュの情報を表すCSV形式のデータの前処理を行うプログラムです。

標高値の平滑化(ガウシアンフィルタ)

https://www.dropbox.com/s/eljitfa74xgbq7r/Gaussian.py?dl=1

山脈部分を触るとチクチクしてちょっと痛いという指摘があったこと、ピースを組み合わせて遊んでいるうちに細かい凸が折れたりつぶれたりしてしまうことがあったので凹凸をある程度ならして平滑化するプログラムを作ってみました。

3×3の重みづけマトリックス(下図)に従って標高の値の加重平均を計算していきます。

f:id:ichidaya:20190727215357j:plain

加重平均の重みづけ

右は左のオリジナルモデルに対して加重平均フィルタを3回かけた結果です。表面の凸凹がだいぶ滑らかになりました。

f:id:ichidaya:20190727215458j:plain

加重平均の実施例

形状の平滑化(モルフォロジー処理)

https://www.dropbox.com/s/bqloitvmkkb3o40/OpenClose.py?dl=1

QGISから取り込んだ標高データをそのまま3Dモデルにすると標高の低い部分でぽつんと穴があいたり、県境の形状が1メッシュ分だけ飛び出してはめ合わせがしにくくなったりします。これまでは3DをGenObj.pyで生成してからZBrushに読み込んで手作業で修正していたのですが、何十個もやっていたら肩こりと緊張性頭痛がひどくなってしまい自動化を検討することにしました。

モルフォロジー処理の拡張操作(注目点の周り3×3のいずれかにデータがあれば注目点にも標高のデータを補間する)、縮退操作(注目点の周り3×3の全てにデータがある場合のみ注目点のデータを残す)を実装し、まず穴を埋めるためのClose処理(先に拡張を行ってから縮退を実施)を行い、続いてかたちを整えるためにOpen処理(先に縮退を行ってから拡張を実施)を実施することにしました。

f:id:ichidaya:20190727223449j:plain

左:オリジナル 中央:クローズ処理 右:クローズ処理後にオープン処理

 左端のオリジナルでは浜名湖(佐鳴湖?)のあたりに穴があいて抜けていますがクローズ処理によって塞ぐことができています。続いてオープン処理を行うことで輪郭の形の細かい凹凸をならしています(右端の画面)。金魚のような形の背びれの部分などはこれによってはめ合わせがしやすい単純な形になりました。これまではOBJファイルを作ってからZBrushのZModelerブラシで面をひとつずつ操作してこれらの修正を行っていたのがとても楽になりました。