【ドローン測量に挑戦:後編】初心者がRhinocerosとGrasshopperで無人島のメッシュデータを編集してみた
はじめに
どうも、ディッピーズのABCです。
タイトルにある通り、先日伊豆でドローン測量に挑戦してきました。
YouTubeに動画をのせてるので、良かったらみてください。
動画ではDroneDeployというアプリケーションを使って自動飛行〜撮影をする様子や、WebODMというソフトウェアで撮影画像をつなぎ合わせてデジタル3Dモデルを構築する、いわゆるSfM (Structure from Motion) 処理を行いました。
今回のブログは動画の後の作業、いわば後編にあたります。
元建築家の友人の協力を得て、動画で作った3Dモデルを3Dプリントできるようにする処理を行いました。(こちらも動画化できればと思っていたのですが、初めてだったのでかなりグダッてしまい、断念…)
ただ、自分が忘れないためにも、備忘録としてブログを書いてみます。
では、どうぞよろしくお願いいたします。
※注意※
備忘録なので、全ての手順を記録しています。
各ポイントのタイトルで失敗と記載してあるものは、基本的には必要のない手順なので、お急ぎの方は飛ばしてください。失敗したコマンドや、無駄に終わった手順から学んだ知識もあるので、もし興味ある方は失敗談も読んでみてください。
- はじめに
- 使用したソフト
- 手順
- ①WebODMからデータを出力
- ②Rhinocerosでファイルを開く
- ③Rhinocerosでメッシュデータを編集 その1(失敗)
- ④Rhinocerosでメッシュデータを編集 その2:3Dデータのトリム(成功)
- ⑤Rhinocerosでメッシュデータを編集 その3:海面の高さを調整(失敗)
- ⑥Rhinocerosでメッシュデータを編集 その4:Grasshopperの導入(成功)
- ⑦Rhinocerosでメッシュデータを編集 その5:Grasshopperを設定(成功)
- ⑧Rhinocerosでメッシュデータを編集 その6:メッシュの穴を埋めていく(成功)
- ⑨Rhinocerosでメッシュデータを編集 その7:土台を作る(成功)
- ➓Rhinocerosでメッシュデータを編集 その7:土台と結合させる(成功)
- 遂に完成
- まとめ
- 後日談
使用したソフト
-
WebODM:生成した3Dモデルの出力に必要
-
Rhinoceros:今回の主役。メッシュデータを編集するのに必要。
動画内で大活躍したWebODMから無人島の3Dデータを出力し、Rhinocerosという3次元モデリングツールでメッシュデータの穴埋めを行っていきます。
手順
①WebODMからデータを出力
画面右下のダウンロードボタンをクリックし、Textured Modelをダウンロードする。
②Rhinocerosでファイルを開く
「textured model」というファイルがダウンロードフォルダに現れるので、拡張子が「.obj」のオブジェクトファイルをRhinocerosで開く。
※ 開く際に細かい設定が出てきますが、全てデフォルトの設定で開きました。
開くと、こんな感じの画面が表示されます。
次に写真データが無事取り込まれてるか確認するために、表示設定をWireframeから、 Renderedに設定を変更します。
すると、色付きの3Dモデルが表示されます。
無事データを開くことが確認できたので、ここから本格的にデータの編集に移っていきます。Rhinocerosの編集では多くのコマンドを活用するので、今回使用したコマンドを先にまとめておきます。
コマンド一覧
- Join:複数のオブジェクトを結合して1つのオブジェクトにする
- DeleteMeshFaces:選択されたメッシュ面を親メッシュから削除し、穴を開ける
- Lasso:マウスをドラッグしてスケッチした線で囲んだオブジェクトを選択できる
- Polyline:セグメントを作成する
- Grasshopper:Grasshopperの起動
- SelCrv:Curveの選択(Polylineのセグメントを選択)
- MeshRepair:メッシュ修復パネルを開く
- FillMeshHole:メッシュの穴を自動修復
- Explode:オブジェクトを構成要素に分解する
ではやっていきましょう。
③Rhinocerosでメッシュデータを編集 その1(失敗)
まず、適当に3Dモデルをクリックしてみると、メッシュが豹柄のような形で部分的に選択されました。これは写真データとメッシュモデルを組み合わせるために、細かいメッシュでデータを区切って写真と照らし合わせてるからこうなるそう。
(間違っていたら、どなたか正しい情報をコメントでお願いします。)
※補足
因みに、この豹柄の形は最初のtextured modelに含まれていた他のpngファイルの画像に合わせている模様。上の画像のように、写真を3Dモデルの形に合わせて、一枚一枚切り抜いて、WebODMが3Dモデルに貼り付けてくれてるみたい。
いやはや、WebODM なんて優秀なソフトウェアでしょうか。
話が脱線してしまいましたが、まずはJoinコマンドでバラバラのメッシュデータを結合します。メッシュデータが1つに結合されると、写真データとの整合性が失われ、とても変な模様になります。
早速ですが、バラバラのメッシュデータのままのほうが、テクスチャーデータを失わなくて済むのでやってみたものの、友人にすぐに撤回され、コマンドを取り消しました。
④Rhinocerosでメッシュデータを編集 その2:3Dデータのトリム(成功)
振り出しに戻りましたが、次はメッシュがバラバラの状態のまま、必要ない部分を削る作業を行うことにしました。
具体的には、DeleteMeshFacesというコマンドを使い3Dモデルを切り取っていきます。
プリントしたくない部分を選択して、DeleteMeshFacesを実行すると、、、
この様に、3Dモデルを整形することができます。
⑤Rhinocerosでメッシュデータを編集 その3:海面の高さを調整(失敗)
次に海面の高さを調整していきます。
3Dモデルを見てみると分かりますが、本来なら平らなはずの海面も、水の色や光の反射で、WebODMが立体的にしてしまっています。
なので、この様な部分の高さを調整し、海面を平たくする作業を行います。
パソコンの動作が重いので、まずは表示設定をWireframeに戻します。
PCがもっさりしている方は、Wireframeでの作業をおすすめします。
次にポイント単位で編集ができるように、オブジェクトを選択してからF10を押します。すると、オブジェクトをつなぎ合わせている、点と線が表示されます。
高低差があっていない部分のポイントを選択、その後青矢印をドラッグすることで、高さを調整していきます。
高さを調整していると、ポイントがやメッシュが折り重なっている部分が出てきたため、改めてRenderedに設定を戻し、島の重要な部分じゃないか確認しつつ、Lassoコマンドでトリミングを行っていきます。
Lassoはマウスをクリックしたままドラッグして囲った部分を選択できるツール、いわゆる投げ縄ツールで、今回の編集では大きく役に立ちました。
こんな感じで、ポイントが折り重なってる複雑な部分をどんどん削除していきます。
続いて、Lassoをで他のボコボコしてる部分を選択していきます。
※選択した部分を下の方に移動している理由は、一通り調整が必要な部分を下で編集し、整えてから再度上に持ち上げた方が楽だからと友達に言われたからです。
選択した後は ■ 部分をクリックしドラッグすることで、高低差をなくし、ボコボコした表面を平たくすることができます。
この作業を繰り返して、どんどんボコボコしてる面を解消していく、、、
が、ここでまたもや問題発生。
これではあまりにも時間がかかってしまう…
そして、いくらLassoが便利でも島の形に沿って完璧にマウスを動かすのは不可能。
ということで、別のアプローチで島以外の部分を選択できる方法を試すことにしました。
⑥Rhinocerosでメッシュデータを編集 その4:Grasshopperの導入(成功)
次に試したのが、Grasshopperの導入です。
長らくお待たせしましたが、こちらが今回の3Dモデルの編集の成功法です。
Grasshopperとは?
Rhinoceros上で動作するプラグインの一種です。。。
くらいしか僕には説明ができないので、以下参照
Grasshopperとはモデリングや解析を簡単に数値制御によって行うことができるビジュアルプログラミングツールです。要するに、難しいプログラミング言語を知らなくても視覚的にプログラムを作って便利にモデリングや解析ができちゃう、そんな便利なツールです。
Rhinocerosでさえ初めてなのに、Grasshopperとか言う新しいツールが導入されました。この時点で時間は朝3時、僕の脳は思考停止状態。
辛い…とはいえ、やらないと3Dプリントできない。
と言うことで頑張りました…
まず、Polylineと言うコマンドでメッシュにセグメントを作成していきます。
具体的には、島の部分を囲っていき島と島じゃない部分を区分けしていきます。
写真のように、島の外周を少しづつクリックして、囲っていきます。
一通り、セグメントの作成が完了。
緑の線で島が囲われているのが分かります。
この作業により、
- 緑の線の内側=島
- 緑の線の外側=海
というセグメントを作ることが可能になりました。
続いてGrasshopperコマンドでGrasshopperを起動。
起動が完了したら、Grasshopperの画面をクリックし、Curveコンポーネントを追加。
Rhinocerosの画面に戻り、SelCrvコマンドを使い先ほどPolylineで作成したセグメントを選択する。
選択したセグメントをGrasshopperのCrvコンポーネントにセットする。
続いてメッシュデータもGrassshopperに取り込んでいく。
こちらも同様に、Rhinocerosでメッシュを選択後、GrasshopperでMeshコンポーネントを作成し、Set Multiple Meshesを選択。
これでRhinocerosのオブジェクトとGrasshopperのコンポーネントが全て連携されました。
⑦Rhinocerosでメッシュデータを編集 その5:Grasshopperを設定(成功)
GrasshopperとRhinocerosの連携完了した後は、ひたすら色んな機能をもったコンポーネントを追加していきます。
僕も詳しくは分かってはいないのですが、Grasshopperのコンポーネントにはオブジェクトそのものと連携されるコンポーネントと、オブジェクトを受け取って〇〇する、という何かしらの処理を行ってくれるコンポーネントがあります。
このように様々なコンポーネントを活用して、先ほど設定したCurveセグメントの外にある海の部分を全て平たくする、と言うアルゴリズムを構築していきます。
ここまで読んでいただいて申し訳ないのですが、Grasshopperはトライアンドエラーが多すぎる為、最終結果だけを載せます。
上記がCurveの外にある海のポイントのみ平面化する処理を行うアルゴリズムになります。
- Curve:Curveオブジェクト。
- Point In Curves:閉じた複数の曲線(Curve)と複数の点(Points)を入力し、内外判定を行う。0が外側、1が曲線上、2が内側。
- Mesh:Meshオブジェクト。
- Face Boundaries:メッシュを入力し、それぞれのフェイスの境界曲線を抽出する。
- Control Points:曲線(Curve)を入力し、曲線の制御点(Points)、ウェイト(Weights)、ノットの値(Knots)をそれぞれ出力する。
- Equality:Aの値とBの値が等しいか調べ、TrueとFalseで結果を出力する
- Cull Pattern:リスト(List)からTrue.Falseなどのパターンを使用して、要素を取り除く。
- Project Point:点(Point)を指定した方向ベクトル(Direction)の向きでジオメトリ上に投影する。投影する箇所が複数ある場合は、一番近い位置に作成される
- Cull Duplicates:複数の点(Points)を入力し、許容差(Tolerance)以内の重複する点を削除する。
- Delaunay Mesh:複数の点(Points)と平面(Plane)を指定し、入力した点を通るメッシュを作成する。
- Mesh Join:複数のメッシュのデータを、ひとつのメッシュに結合する。
そんなこんなでGrasshopperから出力された結果がこちら。
見事に、島以外のメッシュが平面化されました。
⑧Rhinocerosでメッシュデータを編集 その6:メッシュの穴を埋めていく(成功)
いよいよ、3Dモデルの編集も後半戦に突入。
後はメッシュの穴を埋めていく作業です。
近づいてみると分かるように、メッシュにちらほら穴があります。
メッシュから穴がなくなるように、埋めていく処理を行っていきます。
まずはMeshRepairコマンドでメッシュ修復パネルを開きます。
続いてCheckMeshをクリック。
そしてRepairMeshをクリック。
これにより、Meshのどんな状態か確認し、まだ結合できていない穴があれば、見やすくハイライトしてくれます。
ここからは穴を見つけては、懐かしのLassoコマンドで穴の周りをトリミングし、削除。
基本的に穴ができてしまっている部分は、ポイントが重なり合っていたり、複雑に絡み合っている状態が多いので、Lassoで大きめに囲って削除してしまう方が楽でした。
その後はFillMeshHoleコマンドを入力し、穴に密接しているポイントをクリック。
すると自動で穴を埋める処理を行ってくれます。
この作業を穴が全て埋まるまでひたすら繰り返していきます。
⑨Rhinocerosでメッシュデータを編集 その7:土台を作る(成功)
3Dモデルの修正は一通り終わったので、次は土台を作っていきます。
島の3Dモデルよりも少し小さめの土台を作り、はみ出た部分を切り取っていきます。
まずは土台部分をExplodeコマンドで分解。
上部にある面を削除した後、Joinコマンドでまた結合させます。
今まで作ってきた島の3Dモデル部分を、この土台の上面として配置していきます。
島部分と結合するために、土台部分のオブジェクトを選択しMeshコマンドでメッシュを作成します。
その後、TopViewに切り替え、土台からはみ出ているポイントを選択。
土台の長方形の中に収まるように、余分なポイントを削除していきます。
➓Rhinocerosでメッシュデータを編集 その7:土台と結合させる(成功)
いよいよラストスパートです。土台と島のメッシュデータを結合していきます。
使用するコマンドは3DFace。ポイントを3つ選ぶことで、メッシュとして繋ぐことができます。
ここからはひたすら怒涛の3DFaceの処理を繰り返していくのですが、今の状態だと見づらいため、Display ModesのNaked Edge Settingsで閉じていないメッシュの淵を赤く表示するように設定しました。
ここからはひたすら。。。
3DFaceでメッシュを作成。
Joinで結合。
FillMeshHoleでガッツリ穴を塞ぐ。
遂に完成
3DFace〜Join〜FillMeshholeの無限ループ。
これをひたすら繰り返し遂に。。。遂に完成しました!
赤線も、穴を示すピンクのハイライトもない、この綺麗なメッシュデータを見てください!
表示設定をRenderに切り替えるとこんな感じ。
我ながらアッパレ。まぁ、色データがGrasshopperの処理でなんか失われちゃったんだけど。。。まぁいいか!今回はよしとしよう。
これをstlファイルで出力すれば、3Dプリントはできるっぽいです。
ただ建築家の友人いわく、ポイントの重複や重なり合ってるのを完璧に消去できているわけじゃないので、プリンタがデータを受けてつけてくれるかどうかは分からないとのこと。
ここまでやったのに。。。なんだこの不安はw
まとめ
長々と書き殴りましたが、今回痛感したのは、3Dデータの編集は一筋縄じゃあ行かないと言うこと。本当に根気が必要な作業です。
もう一回やれと言われたらちょっと戸惑いますが、、、本当に学ぶことが多かった!
RhinocerosもGrasshopperも初心者だったので、間違っている情報が沢山あるかもしれません。これで混乱を招いしてしまったら逆にすいません。
ブログを見て、こうした方がいいよ〜とか、こうすればいいのにバーカとか何でもいいので、コメントもらえると嬉しいです。
そしてYouTubeの更新も是非楽しみにしててください!
ともかく、手取り足取り教えてくれた、友人に心から感謝。そして、俺。お疲れ様。
後日談
後日、3Dプリンターを持ってる友人にstlファイルを持ってったら、無事プリントはできるとのこと!
GOOD SHIT!
でも、カラープリントする方法はまだまだ模索中。次のプロジェクトでがんばるか。。。
ひとまず、休憩します!
*1:デジケンさんのブログ記事が分かりやすかったので、引用させていただきました。