ディッピーズ活動日記

ドローン空撮と3Dモデリングの技術を屈指して、 ありのままの自然を再現する

【ドローン測量に挑戦:後編】初心者がRhinocerosとGrasshopperで無人島のメッシュデータを編集してみた

はじめに

どうも、ディッピーズのABCです。

タイトルにある通り、先日伊豆でドローン測量に挑戦してきました。

YouTubeに動画をのせてるので、良かったらみてください。

www.youtube.com

動画ではDroneDeployというアプリケーションを使って自動飛行〜撮影をする様子や、WebODMというソフトウェアで撮影画像をつなぎ合わせてデジタル3Dモデルを構築する、いわゆるSfM (Structure from Motion) 処理を行いました。

www.dronedeploy.com

www.opendronemap.org

 

 

今回のブログは動画の後の作業、いわば後編にあたります。

元建築家の友人の協力を得て、動画で作った3Dモデルを3Dプリントできるようにする処理を行いました。(こちらも動画化できればと思っていたのですが、初めてだったのでかなりグダッてしまい、断念…)

ただ、自分が忘れないためにも、備忘録としてブログを書いてみます。

では、どうぞよろしくお願いいたします。

 

※注意※
備忘録なので、全ての手順を記録しています。
各ポイントのタイトルで失敗と記載してあるものは、基本的には必要のない手順なので、お急ぎの方は飛ばしてください。失敗したコマンドや、無駄に終わった手順から学んだ知識もあるので、もし興味ある方は失敗談も読んでみてください。

 

 

 

使用したソフト

  1.  WebODM:生成した3Dモデルの出力に必要

  2.  Rhinoceros:今回の主役。メッシュデータを編集するのに必要。

動画内で大活躍したWebODMから無人島の3Dデータを出力し、Rhinocerosという3次元モデリングツールでメッシュデータの穴埋めを行っていきます。

www.rhino3d.com

 

手順

①WebODMからデータを出力

f:id:dippies:20210404154548p:plain

画面右下のダウンロードボタンをクリックし、Textured Modelをダウンロードする。

 

Rhinocerosでファイルを開く

f:id:dippies:20210404155005p:plain

textured model」というファイルがダウンロードフォルダに現れるので、拡張子が「.obj」のオブジェクトファイルをRhinocerosで開く。

※ 開く際に細かい設定が出てきますが、全てデフォルトの設定で開きました。

 

f:id:dippies:20210404160949p:plain

開くと、こんな感じの画面が表示されます。

 

f:id:dippies:20210404161205p:plain

次に写真データが無事取り込まれてるか確認するために、表示設定をWireframeから、 Renderedに設定を変更します。

すると、色付きの3Dモデルが表示されます。

 

無事データを開くことが確認できたので、ここから本格的にデータの編集に移っていきます。Rhinocerosの編集では多くのコマンドを活用するので、今回使用したコマンドを先にまとめておきます。

 

コマンド一覧

  • Join:複数のオブジェクトを結合して1つのオブジェクトにする
  • DeleteMeshFaces:選択されたメッシュ面を親メッシュから削除し、穴を開ける
  • Lasso:マウスをドラッグしてスケッチした線で囲んだオブジェクトを選択できる
  • Polyline:セグメントを作成する
  • Grasshopper:Grasshopperの起動
  • SelCrv:Curveの選択(Polylineのセグメントを選択)
  • MeshRepair:メッシュ修復パネルを開く
  • FillMeshHole:メッシュの穴を自動修復
  • Explode:オブジェクトを構成要素に分解する

 

ではやっていきましょう。

Rhinocerosでメッシュデータを編集 その1(失敗

 

f:id:dippies:20210404161405p:plain

まず、適当に3Dモデルをクリックしてみると、メッシュが豹柄のような形で部分的に選択されました。これは写真データとメッシュモデルを組み合わせるために、細かいメッシュでデータを区切って写真と照らし合わせてるからこうなるそう。

(間違っていたら、どなたか正しい情報をコメントでお願いします。)

 

※補足

f:id:dippies:20210404162719p:plain

因みに、この豹柄の形は最初のtextured modelに含まれていた他のpngファイルの画像に合わせている模様。上の画像のように、写真を3Dモデルの形に合わせて、一枚一枚切り抜いて、WebODMが3Dモデルに貼り付けてくれてるみたい。

いやはや、WebODM なんて優秀なソフトウェアでしょうか。

 

f:id:dippies:20210404163338p:plain

話が脱線してしまいましたが、まずはJoinコマンドでバラバラのメッシュデータを結合します。メッシュデータが1つに結合されると、写真データとの整合性が失われ、とても変な模様になります。

早速ですが、バラバラのメッシュデータのままのほうが、テクスチャーデータを失わなくて済むのでやってみたものの、友人にすぐに撤回され、コマンドを取り消しました。

 

Rhinocerosでメッシュデータを編集 その2:3Dデータのトリム(成功

振り出しに戻りましたが、次はメッシュがバラバラの状態のまま、必要ない部分を削る作業を行うことにしました。

具体的には、DeleteMeshFacesというコマンドを使い3Dモデルを切り取っていきます。

 

f:id:dippies:20210404165118p:plain

プリントしたくない部分を選択して、DeleteMeshFacesを実行すると、、、

 

f:id:dippies:20210404165215p:plain

この様に、3Dモデルを整形することができます。

 

Rhinocerosでメッシュデータを編集 その3:海面の高さを調整(失敗

次に海面の高さを調整していきます。

 

f:id:dippies:20210404173316p:plain

3Dモデルを見てみると分かりますが、本来なら平らなはずの海面も、水の色や光の反射で、WebODMが立体的にしてしまっています。

なので、この様な部分の高さを調整し、海面を平たくする作業を行います。

 

f:id:dippies:20210404173541p:plain

パソコンの動作が重いので、まずは表示設定をWireframeに戻します。
PCがもっさりしている方は、Wireframeでの作業をおすすめします。

 

f:id:dippies:20210404174316p:plain

次にポイント単位で編集ができるように、オブジェクトを選択してからF10を押します。すると、オブジェクトをつなぎ合わせている、点と線が表示されます。

 

f:id:dippies:20210404175826p:plain
高低差があっていない部分のポイントを選択、その後青矢印をドラッグすることで、高さを調整していきます。

 

 

f:id:dippies:20210404180437p:plain

高さを調整していると、ポイントがやメッシュが折り重なっている部分が出てきたため、改めてRenderedに設定を戻し、島の重要な部分じゃないか確認しつつ、Lassoコマンドでトリミングを行っていきます。

Lassoはマウスをクリックしたままドラッグして囲った部分を選択できるツール、いわゆる投げ縄ツールで、今回の編集では大きく役に立ちました。

 

f:id:dippies:20210404180844p:plain

こんな感じで、ポイントが折り重なってる複雑な部分をどんどん削除していきます。

f:id:dippies:20210404181358p:plain

続いて、Lassoをで他のボコボコしてる部分を選択していきます。

※選択した部分を下の方に移動している理由は、一通り調整が必要な部分を下で編集し、整えてから再度上に持ち上げた方が楽だからと友達に言われたからです。

 

f:id:dippies:20210404182244p:plain

選択した後は ■ 部分をクリックしドラッグすることで、高低差をなくし、ボコボコした表面を平たくすることができます。

 

f:id:dippies:20210404182718p:plain

この作業を繰り返して、どんどんボコボコしてる面を解消していく、、、

 

が、ここでまたもや問題発生。

 

これではあまりにも時間がかかってしまう…

そして、いくらLassoが便利でも島の形に沿って完璧にマウスを動かすのは不可能。

 

ということで、別のアプローチで島以外の部分を選択できる方法を試すことにしました。

 

Rhinocerosでメッシュデータを編集 その4:Grasshopperの導入(成功

次に試したのが、Grasshopperの導入です。
長らくお待たせしましたが、こちらが今回の3Dモデルの編集の成功法です。

 

Grasshopperとは?
Rhinoceros上で動作するプラグインの一種です。。。
くらいしか僕には説明ができないので、以下参照

Grasshopperとはモデリングや解析を簡単に数値制御によって行うことができるビジュアルプログラミングツールです。要するに、難しいプログラミング言語を知らなくても視覚的にプログラムを作って便利にモデリングや解析ができちゃう、そんな便利なツールです。

 *1

www.rhino3d.com

kenchikku.com

 

Rhinocerosでさえ初めてなのに、Grasshopperとか言う新しいツールが導入されました。この時点で時間は朝3時、僕の脳は思考停止状態。


辛い…とはいえ、やらないと3Dプリントできない。
と言うことで頑張りました…

 

f:id:dippies:20210404200246p:plain

まず、Polylineと言うコマンドでメッシュにセグメントを作成していきます。
具体的には、島の部分を囲っていき島じゃない部分を区分けしていきます。

写真のように、島の外周を少しづつクリックして、囲っていきます。

 

f:id:dippies:20210404201654p:plain

一通り、セグメントの作成が完了。
緑の線で島が囲われているのが分かります。

この作業により、

  • 緑の線の内側=島
  • 緑の線の外側=海

というセグメントを作ることが可能になりました。

 

f:id:dippies:20210404204431p:plain

続いてGrasshopperコマンドでGrasshopperを起動。

 

f:id:dippies:20210404205003p:plain

起動が完了したら、Grasshopperの画面をクリックし、Curveコンポーネントを追加。

 

f:id:dippies:20210404205103p:plain

Rhinocerosの画面に戻り、SelCrvコマンドを使い先ほどPolylineで作成したセグメントを選択する。

 

f:id:dippies:20210404205347p:plain

選択したセグメントをGrasshopperCrvコンポーネントにセットする。

 

f:id:dippies:20210404211553p:plain

続いてメッシュデータもGrassshopperに取り込んでいく。
こちらも同様に、Rhinocerosでメッシュを選択後、GrasshopperMeshコンポーネントを作成し、Set Multiple Meshesを選択。

これでRhinocerosのオブジェクトとGrasshopperコンポーネントが全て連携されました。

 

Rhinocerosでメッシュデータを編集 その5:Grasshopperを設定(成功

GrasshopperRhinocerosの連携完了した後は、ひたすら色んな機能をもったコンポーネントを追加していきます。

僕も詳しくは分かってはいないのですが、Grasshopperコンポーネントにはオブジェクトそのものと連携されるコンポーネントと、オブジェクトを受け取って〇〇する、とい何かしらの処理を行ってくれるコンポーネントがあります。

このように様々なコンポーネントを活用して、先ほど設定したCurveセグメントの外にある海の部分を全て平たくする、と言うアルゴリズムを構築していきます。

ここまで読んでいただいて申し訳ないのですが、Grasshopperトライアンドエラーが多すぎる為、最終結果だけを載せます。

 

f:id:dippies:20210404214205p:plain

上記が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:複数のメッシュのデータを、ひとつのメッシュに結合する。

 

f:id:dippies:20210404224150p:plain

そんなこんなでGrasshopperから出力された結果がこちら。

見事に、島以外のメッシュが平面化されました。

 

Rhinocerosでメッシュデータを編集 その6:メッシュの穴を埋めていく(成功

いよいよ、3Dモデルの編集も後半戦に突入。

f:id:dippies:20210404224550p:plain


後はメッシュの穴を埋めていく作業です。
近づいてみると分かるように、メッシュにちらほら穴があります。
メッシュから穴がなくなるように、埋めていく処理を行っていきます。

まずはMeshRepairコマンドでメッシュ修復パネルを開きます。

 

f:id:dippies:20210404224951p:plain

続いてCheckMeshをクリック。

f:id:dippies:20210404225029p:plain

そしてRepairMeshをクリック。

これにより、Meshのどんな状態か確認し、まだ結合できていない穴があれば、見やすくハイライトしてくれます。

 

f:id:dippies:20210404225832p:plain

ここからは穴を見つけては、懐かしのLassoコマンドで穴の周りをトリミングし、削除。

 

f:id:dippies:20210404230021p:plain

基本的に穴ができてしまっている部分は、ポイントが重なり合っていたり、複雑に絡み合っている状態が多いので、Lassoで大きめに囲って削除してしまう方が楽でした。

その後はFillMeshHoleコマンドを入力し、穴に密接しているポイントをクリック。

 

f:id:dippies:20210404230144p:plain

すると自動で穴を埋める処理を行ってくれます。

この作業を穴が全て埋まるまでひたすら繰り返していきます。

 

Rhinocerosでメッシュデータを編集 その7:土台を作る(成功

3Dモデルの修正は一通り終わったので、次は土台を作っていきます。

f:id:dippies:20210404231941p:plain

島の3Dモデルよりも少し小さめの土台を作り、はみ出た部分を切り取っていきます。

 

f:id:dippies:20210404232732p:plain

まずは土台部分をExplodeコマンドで分解。

 

f:id:dippies:20210404233030p:plain

上部にある面を削除した後、Joinコマンドでまた結合させます。
今まで作ってきた島の3Dモデル部分を、この土台の上面として配置していきます。

 

f:id:dippies:20210404233229p:plain

島部分と結合するために、土台部分のオブジェクトを選択しMeshコマンドでメッシュを作成します。

 

f:id:dippies:20210404233610p:plain

その後、TopViewに切り替え、土台からはみ出ているポイントを選択。

 

f:id:dippies:20210404233750p:plain

土台の長方形の中に収まるように、余分なポイントを削除していきます。

 

Rhinocerosでメッシュデータを編集 その7:土台と結合させる(成功

いよいよラストスパートです。土台と島のメッシュデータを結合していきます。

f:id:dippies:20210404234401p:plain

使用するコマンドは3DFace。ポイントを3つ選ぶことで、メッシュとして繋ぐことができます。

 

f:id:dippies:20210404234854p:plain

ここからはひたすら怒涛の3DFaceの処理を繰り返していくのですが、今の状態だと見づらいため、Display ModesNaked Edge Settingsで閉じていないメッシュの淵を赤く表示するように設定しました。

 

ここからはひたすら。。。

f:id:dippies:20210404235237p:plain
3DFaceでメッシュを作成。

 

f:id:dippies:20210404235310p:plain

Joinで結合。

 

f:id:dippies:20210404235342p:plain

FillMeshHoleでガッツリ穴を塞ぐ。

 

遂に完成

 

3DFace〜Join〜FillMeshholeの無限ループ。
これをひたすら繰り返し遂に。。。遂に完成しました!

f:id:dippies:20210404235707p:plain

赤線も、穴を示すピンクのハイライトもない、この綺麗なメッシュデータを見てください!

 

f:id:dippies:20210404235910p:plain

表示設定をRenderに切り替えるとこんな感じ。

我ながらアッパレ。まぁ、色データがGrasshopperの処理でなんか失われちゃったんだけど。。。まぁいいか!今回はよしとしよう。

 

これをstlファイルで出力すれば、3Dプリントはできるっぽいです。
ただ建築家の友人いわく、ポイントの重複や重なり合ってるのを完璧に消去できているわけじゃないので、プリンタがデータを受けてつけてくれるかどうかは分からないとのこと。

ここまでやったのに。。。なんだこの不安はw

 

まとめ

長々と書き殴りましたが、今回痛感したのは、3Dデータの編集は一筋縄じゃあ行かないと言うこと。本当に根気が必要な作業です。

もう一回やれと言われたらちょっと戸惑いますが、、、本当に学ぶことが多かった!

 

RhinocerosGrasshopperも初心者だったので、間違っている情報が沢山あるかもしれません。これで混乱を招いしてしまったら逆にすいません。

ブログを見て、こうした方がいいよ〜とか、こうすればいいのにバーカとか何でもいいので、コメントもらえると嬉しいです。

そしてYouTubeの更新も是非楽しみにしててください!

 

ともかく、手取り足取り教えてくれた、友人に心から感謝。そして、俺。お疲れ様。

 

後日談

後日、3Dプリンターを持ってる友人にstlファイルを持ってったら、無事プリントはできるとのこと!

GOOD SHIT!

でも、カラープリントする方法はまだまだ模索中。次のプロジェクトでがんばるか。。。

ひとまず、休憩します! 

*1:デジケンさんのブログ記事が分かりやすかったので、引用させていただきました。