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

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

3Dプリンター買いました!

 ついに3Dプリンターを買いました。

ゴールデンウィーク明けに配達され、1週間ほど使っていますがとても快調に動作しています。

購入したのはFlashforge社のAdventurer3という製品です。

  • ノズル原点位置のキャリブレーションが不要(簡単)であること
  • ヒートベッドや冷却ファンなど造形中の温度管理の機構をもっていること
  • ノズルや駆動機構がむき出しでなくてしっかりした筐体に収まっていること

といった条件を決めて候補を絞っていたのですが、カタログスペックだけみて判断するのは若干不安でした。決め手は使用されたかたの実感レポートで、ネットでAdventure3の導入記事をチェックした範囲内でトラブルが無かったので決めました。

 

 実際、梱包を開けて30分ほどでテスト用のモデルを出力することができました。

f:id:ichidaya:20190519113901j:plain

外装と外観

それでもいくつか戸惑った点を挙げておくと、

  1. 開梱時の固定箇所のとりはずしが不要だった
  2. フィラメントのロード(かなり強く押し込む必要がある)

 といったところでしょうか。1.についてはWebサイトに写真つきで「これらのナイロンケーブルを取り外しておくように」とわざわざ注意喚起されていたのですが、見つからず「あれっ?」となりました。配送担当者が固定を忘れて発送したのか、今は不要と判断されたのかはわかりません。

2.については「抵抗を感じるまでフィラメントを送りホイールに押込みます。」と書かれていたのですが、フィラメントの先が2つのホイールに挟まれてしっかりと取り込まれていくまで強く押し込む必要があります。

以上の2点をクリアした後は極めて順調でノズル位置のキャリブレーションは全くしないままでテスト用のキューブを造形することができました。

続いてこれまでに作った立体地図パズルのピースを造形してみました。最初は複数の県のピースをまとめて15cm×15cmの範囲内に配置していちどに造形してみたのですがこれだと、造形が上に進むにつれて水平方向に位置ずれが発生し正確に造形ができません。ノズルの水平方向の移動距離が長くなり慣性がついて位置決めが正確にできないのではないかと疑っています。同じパラメータでも1個ずつ造形すればこのような問題は発生しません。

下の写真で赤色のピースは今回Adventure 3で出力した三重県、オレンジ色のピースは以前にDMM.makeに依頼して出力した周辺の府県です。三重県ののピースはAdventure 3の標準解像度で造形していますが、水平方向に関してははめ合わせも有料サービス(確か粉末焼結型)で造形してもらったピースに比べても遜色ないと感じています。

f:id:ichidaya:20190519162556j:plain

はめ合わせの確認

垂直方向の造形については、積層痕による凸凹がノイズとして重なるため微妙な標高の変化ができていないという点は否定できません。安価なFDM型3Dプリンタの限界といったところでしょうか。ただ、解像度もまだ2段階は上げる(出力時間はかかるけど)余地があるし、パラメータをいろいろいじって試してみたいと思っています。

 

 

Fusion 360でクインジェットのモデリング:ディテイルの作り込み

遅々として進まないクインジェットのモデリングですが今回はディテイルの作り込みの一環として主翼と尾翼にスジ彫りを入れてみました(下図の青枠部分)。

f:id:ichidaya:20190429151915j:plain

スジ彫り完成図

スジ彫りのやりかたは下記書籍を参考にしています。

f:id:ichidaya:20190429153117j:plain

参考にしたFusion 360 Masters

 まず、スケッチ平面上に彫りたいスジに沿って線を引きこの線でスジ彫り対象のボディ(今回はクインジェットの主翼部分)を2つに分割します。

f:id:ichidaya:20190429154409j:plain

ボディの分割

説明のため2つに分割されたボディのうち小さくて形が単純なほうをボディA、もうかたほうをボディBと呼ぶことにします。ボディA(下図)を複製したボディを作りこれに操作を加えてスジ彫りのためのツールを作っていきます(ボディAはそのままで保存しておいて後で使います)。

f:id:ichidaya:20190429160600j:plain

ボディA/スジ彫り用ツール

スジ彫り用ツールの切断面に対してシェル操作を適用します。ここで指定する内側の厚さがスジを彫るときの深さになります。

f:id:ichidaya:20190429161505j:plain

スジ彫り用ツールへのシェル操作

シェル操作の結果、ツールは中身をくりぬかれた外殻だけになります。この断面にスケッチを行ってスジ彫りしたい部分だけを独立したジオメトリにします。

f:id:ichidaya:20190429162055j:plain

シェル操作後のツール

上記のジオメトリに対して押し出し処理を行います。このとき指定する距離がスジ彫りの幅になります。

f:id:ichidaya:20190429162818j:plain

外殻部分の押出操作

上記で押し出した部分でボディBを削っていくのですが、ボディBの面が微妙に変化しているのを確実に削るために押出した部分を上下、前後に拡張しておきます。

f:id:ichidaya:20190429163918j:plain

押し出し部分の拡張

スジ彫り用ツールのもう片方の面にも同様の処理を行って完成したスジ彫りツールが以下のような感じになります。

f:id:ichidaya:20190429164229j:plain

完成したスジ彫りツール

出来上がったスジ彫り用ツールを使ってボディBからスジの部分を切り取ります。

f:id:ichidaya:20190429164907j:plain

ボディBに対するスジの切取り

スジ部分が切り取られたボディBに保存しておいたボディAを結合すればスジ部分だけが取り除かれた主翼ボディが完成します。

f:id:ichidaya:20190429165100j:plain

スジ彫り処理の終了




 

 

 

 

 

iPhone Xで3Dスキャンを試す

最近、スマホiPhone XSに乗り換えました。今まで使っていたiPhone5Sで特に不満を感じていなかったのですが、Xの顔認証にはDepth Sensorが使われていてこれを使って3Dスキャンができるという話を(遅ればせながらですが)知って試してみたくなったのでです。

Capture: 3D Scan Anything

Capture: 3D Scan Anything

  • Standard Cyborg
  • 写真/ビデオ
  • 無料

 Captureというアプリの使い方は簡単で

  1. 前面カメラを対象に向けて静止した状態でレコードボタンをクリック
  2. 3,2,1と数字がカウントダウンされるのを待つ
  3. ゆっくりとiPhoneを動かして対象物をスキャン
  4. レコードボタンをクリックしてスキャンを終了

即座に得られた点群データ(Point Cloud)が表示されます。

f:id:ichidaya:20190307182441j:plain

キャプチャーされた点群データ

このデータをローカルにセーブしたり、(無料のアカウントを作成しておけば)クラウドにアップロードすることができます。

クラウドからはOBJやPLYの形式に変換してデータをダウンロードすることはできますが残念ながら点のデータを保存しているだけなのでそのままでは3Dモデリングの材料に使えません。OBJファイルの中身を見ると”v”で始まる点データを表す行と”vn”で始まる法線ベクトルを表す行があるだけで、面を表す"f"で始まる行がありません。ZBrushでこのOBJファイルを読み込もうとしてもエラーになります。

でも、大丈夫。ネットで調べたらポイントクラウドから3Dのメッシュを生成してくれる(それ以外にもいろいろできますが)オープンソースのソフトがあることがわかりました。

CloudCompare - Open Source project

 PLY形式でダウンロードした点群データをこのCloudCompareに読み込みます。

f:id:ichidaya:20190307211124p:plain

点群データの読込み

左上のDB Treeというパネル上で対象の点群データを選ぶと画面上で点群に対して黄色の外接矩形が表示されいろんな処理が行える状態になります。例えばEdit->Segmentで切出しのためのアイコン群が画面右上に表示され、注目部分だけを切り取ることができます。

f:id:ichidaya:20190307211718p:plain

点群データの切出し

さらにPlugins->Poisson Reconで点群データからメッシュ(つまり面)のデータを再構築することができます。

f:id:ichidaya:20190307212425p:plain

メッシュ再構成結果

パラメータが何個かあって実はまだ意味がわかっていないのですが、とりあえずデフォルトのままで上のような結果が得られました。再構築にあたっては法線ベクトルの情報も参照されるようです。何個かの画像を試してみたとき中にはメッシュ再構築の前に法線ベクトルの再計算(Edit->Normals->Compute)や反転(Edit->Normals->Invert)を行っておいたほうが良い結果を得られることがありました。

メッシュ化したデータをFile->Saveでファイル修飾子objやplyを指定して格納すれば面の情報を持った3Dデータが格納されます。ZBrushで読み込むにはOBJ形式のデータが欲しいのですが、CloudCompareで出力したOBJファイルには色の情報が含まれていません(OBJ形式で点の座標といっしょにRGBを記載するのは正式な仕様ではないらしい)。いったんPLY形式で出力してこれをMeshLabで読み込んでOBJ形式で出力するとカラーの情報を含んだOBJファイルを作ることができます。ZBrushでこのファイルを読み込めば色付きのメッシュの3Dモデルが手にはいります。

f:id:ichidaya:20190307215020j:plain

ZBrushに取り込んだ3Dモデル

 あとはうちのわんこがスキャンしている間じっとしていてくれればよいのですが、こちらはまだ解決のめどがたっていません。人の顔を見るとおやつのおねだりでどんどん前にでてきてしまうので。

 

 

 

立体地図を作る -ZBrushで行う作業あれこれ-

近畿地方の7府県について水平方向222万分の1、垂直方向70万分の1の縮尺で立体地図を造形しなおしました。縦方向の高さが横方向よりも3倍ぐらいに強調されていることになります。せっかく立体地図を作るのだから山や谷の凹凸をはっきりさせたい、一方で全国をこの縮尺で作ったとき富士山のコニーデ型のシルエットは残したいという2つの欲求のせめぎあいでこの線に落ち着きました。

f:id:ichidaya:20190302234654j:plain

近畿7府県の立体地図

今回はOpenSCADを使わずに自作のスクリプトでOBJファイルを生成しています。おかげで面積の広い兵庫県などもデータを分割せず一発で生成することができました。また、今回は各ピースの裏側(底面)を少し押し込んだ上(材料を少なくすると若干安く造形できる)で府県名を押し出しで表現しました。

f:id:ichidaya:20190302235725j:plain

近畿7府県(裏側)

後は今まで記録していなかったZBrush作業上の注意点などを..

JAXA国土地理院から取得した地形データをOpenSCADや自作のGenObjスクリプトを使ってそのまま3Dモデルに変換すると、海岸沿いの小さな島が陸地とは別れてしまったり、内陸でも標高が海抜以下の場所に穴が開いてしまったりします。これでは地図パズルのピースとしては都合が悪いので、現状ではOBJファイルをZBrushに取り込んだ後に手作業で修正しています。

下の図で青色で囲った部分は微小部分がピースから別れてしまうので事前に削除しておきます。Subtool->Split->Split To partsで別々のサブツールに分離した後でDel Otherで本体以外のサブツールを削除します。黄緑で囲った部分はメッシュ1個分(計算上0.25mm×0.25mm)の幅でつながっていたり突出している部分です。造形した後での強度が心配なのと他のピースとのはめ合わせに余裕をもたせたいという理由からこれらも削除しています。該当部分をマスクしてから、Subtool->Split->Split Masked Pointsで分離、本体以外の部分を削除します。削除した部分には穴が開いているので、Geometry->Modify Topology->Close Holesで穴をふさぎます。

f:id:ichidaya:20190303133243p:plain

手作業での修正対象の例

(赤枠で囲った)穴が開いている部分については面としては閉じているのでまず穴の4個の側面を削除(ZModeler Polygon ActionsのDeleteを使います)してから上下の穴を塞ぎます。

 底面を少し押し下げた後でText 3D & Vector Shapesのプラグインを使って府県名の文字列を作成、地図本体とMergeします。

f:id:ichidaya:20190303142238p:plain

底面の押込みと名前の付加

 山の部分が四角形のメッシュの単位でカクカクなるのがいやなので最後にスムージングかけています。いろんなやりかたを試していますが、いまのところはResolution=400ぐらいでDynamesh化を行っています。

 

ラテアート用ステンシルの作成

ステンシル本体はサイズをきっちり決めて造形したかったのでFusion 360で円部分の直径やもち手の長さを指定してモデリングを行いました。

f:id:ichidaya:20190228134507p:plain

ステンシル本体のモデリング

直径85mmの円と10mm×45mmの長方形を組み合わせたスケッチを厚さ2.5mmで押出ています。強度的には厚さ1mmちょっとでもいいはずですが、今回はナイロン(磨きあり)で造形するつもり(以前に行った地図の造形は磨き無し)だったので磨き処理で薄くなる部分を考慮して気持ち厚めにしました。このモデルをOBJ形式でエクスポートしてからZBrushに取り込んで犬の顔のかたちに穴を開けていきます。

 元になる犬の顔の絵は写真をもとに奥さんに描いてもらいました。

f:id:ichidaya:20190228170523p:plain

写真からステンシル用の線画を作成

ZBrushで下絵を表示する方法はいくつもあって選択に迷うのですが、今回はDrawメニューの中のUp-Down->Map1に画像ファイルを指定する方法をとりました。Divideを何回か繰り返した面(写真ではステンシル本体)とこの絵を重ねて絵の線の部分をマスクしていきます。Divideの回数は線を滑らかにマスクできるように試行しながら決めています。マスクで線を描くときステンシル本体の内側の島を線で完全に囲ってしまうとその部分を支えることができなくなります。絵として不自然にならない範囲で線を分断しておきます。マスクした部分をSubtool->Extractで線画部分を押し出した(両面指定、Thickの値は最大にしておく)立体を作ります。

f:id:ichidaya:20190228174508p:plain

絵柄を彫り込む手順(1)

絵柄の部分はラテアート以外にも使える可能性があるので独立したパーツとして保存しておきます。

f:id:ichidaya:20190228193313p:plain

絵柄の彫り込み用パーツ

ステンシル本体を改めてZBrushに読み込み、上述の彫り込み用パーツの位置や大きさを調整したうえでBool演算を実行すれば完成です。

f:id:ichidaya:20190228195744p:plain

ステンシル本体と彫り込み用パーツの間でBool演算を実施

 

なかなか好評だったラテアートステンシル

ラテアート用のステンシルをうちのわんこをモデルに作ってみました。ニコちゃんマークや★などを意匠にしたものはamazonなどでも見かけますね。

f:id:ichidaya:20190225000012p:plain

モデルとともに

ラテを作ってからカップの上にステンシルを重ねてシナモンパウダーをふりかけます。開いている穴の部分から落ちた粉で絵を描けるというしくみです。

f:id:ichidaya:20190224234938p:plain

ステンシルの使い方

 ネット販売で出回っているステンシルは簡単な図形が多いです。それらに比べるとこれくらい込み入った図形をパウダーで表現できるのか心配だったのですが試してみたら意外といい感じです。うちの奥さんにも好評でした。

立体地図用テクスチャ画像作成に関する備忘録

カラー造形のためのテクスチャ画像を作成する考え方は前回述べたとおりなのですがもう少し実装よりというか、泥臭い作業上の注意点なども記録しておきたいと思います。

テクスチャ画像の生成スクリプトソースコードを下記に置きました。

MapTexture.py

このPythonスクリプトは画像編集ソフトGimpプラグインとして動作します。単独では動きませんのでご注意ください。GimpはフリーのソフトウェアでWindowsMac両方で利用可能ですが、私のPythonスクリプトWindows環境でのみテストしています。

Gimpダウンロード

 PythonスクリプトのファイルをWindowsのユーザフォルダ下の".gimp-2.8\plug-ins"フォルダ(私はGimp2.8を使っているのでこの名前になります)にコピーしておいてGimpを起動するとテクスチャ画像生成をGimpのコマンドとして利用できるようになります。

フィルター(R)->Python-fu->Map->Gen Texture
で以下のようなダイアログが表示されます。

f:id:ichidaya:20190207230219p:plain

テクスチャ画像生成ダイアログ

File NameにはUVマッピングの結果を含んだOBJファイルを指定します(重要!! ファイルパスの文字列にダブルバイト文字が含まれていると異常終了します。OBJファイルを置いておくフォルダ名には半角文字を使ってください)。Image Sizeにはテクスチャ画像の縦と横(正方形なので同じ値になります)の画素数を指定します。一般に大きな値を指定したほうが精密な絵が描けますが、頂点間の間隔があいているところを塗りきりなかったり(後述)します。形状のポリゴンの数や大きさも影響しますので、私は512から2048ぐらいの値で悩みながら決めています。BaseとVer.Scaleはプリント用の3Dモデルの高さから元の標高を逆算するのに必要なパラメータです。Excelで直方体のデータを出力するとき、標高の値を縦方向に70万分の1に縮尺してから台の部分を5mm分足しているのでこの逆を行うわけです。得られた標高値に応じて色を決めているのですがその部分は現時点ではハードコーディングされていて以下のような感じです。

    height = ((z - base)*ver_scale)/1000.0
    thr    =  - ((base/3.0)*ver_scale)/1000.0

    if   height < thr :
        color = (230,230,230,1.0)
    elif height < 0.1 :
        color = (43,131,186,1.0)
    elif height < 10.0 :
        color = (100,171,176,1.0)
    elif height < 200.0 :
        color = (157,211,167,1.0)
    elif height < 300.0 :
        color = (199,233,173,1.0)
    elif height < 500.0 :
        color = (237,248,185,1.0)
    elif height < 1000.0 :
        color = (255,237,170,1.0)
    elif height < 1500.0 :
        color = (254,201,128,1.0)
    elif height < 2000.0 :
        color = (249,158,89,1.0)
    elif height < 2500.0 :
        color = (232,91,58,1.0)
    else :
        color = (215,25,28,1.0)

実は、あともう1つこのダイアログには含まれないのですがテクスチャ画像の出来栄えに影響を与えるパラメータがあります。下の図で青枠で囲った数字、指定された色で点を打つときのブラシサイズです。現状のスクリプトでは実行時に設定されていたサイズで点を打っていきます。

f:id:ichidaya:20190208172808p:plain

テクスチャ画像作成時の点の大きさの指定

 現状のスクリプトでは点のサイズを小さくすると精密な着色ができるのですが大きなポリゴンを塗り切れないことがあります(下の図の赤枠部分)。点を打つのがポリゴンの頂点の位置で中を塗りつぶすようなロジックになっていないからです。

 

f:id:ichidaya:20190208181712p:plain

テクスチャを塗り切れない例

ZBrushのDynaMeshの機能でポリゴンの大きさを均質かつ十分小さくしておけばこういうことはおこらないのですがテクスチャ生成に非常に時間がかかってしまうことがあります。ブラシのサイズを大きめに設定してテクスチャ画像を生成すると 粗くはなるが塗り残しをなくすことができます。

f:id:ichidaya:20190208182944p:plain

ブラシサイズを大きくしたテクスチャ画像

 2つの画像を重ね、塗り残し部分は粗い画像の情報で補うという手もあります。

f:id:ichidaya:20190208183521p:plain

粗い画像と精微な画像の重ね合わせ

ここらへんはどんなやりかたが良いのかいまだ試行錯誤を続けている状況です。

 

 画像が生成できたらZBrushにテクスチャ画像に取り込んでもう一度OBJ形式でエクスポートを行って以下の3つのファイルを作成します。

XXX.OBJ

XXX.mtl

XXX.BMP

OBJファイルににmtlファイルへのパスを記述し、mtlファイルの中にBMPファイルへのパスを記述するというのがカラー造形を依頼するときのお作法になっているためです。