Blenderでusdzファイルをobjファイルに変換して体積を求める converting usdz into obj by Blender and calculating volume

はじめに

 この3DアプリBlenderにはずっと気になっていた。後期高齢者に入る直前にどうかと思うが。

1 ダウンロード

 Download Blender 3.6.2 LTS からダウンロードしよう。LTSは,long-term stabilityの意で,安定版だ。donationのボタンを押したがクレジットの深い情報まで取得されるので一応,回避した。乗っ取られている可能性を感じたからだ。ある程度使ってからdonationしよう。ただ,回避しても,ダウンロードがもう始まっている。

 mac版もあるがWindows版だけと今のところは思っている。両方を行き来するのはこの種のアプリでは不具合が生じる可能性が高いからである。widows-x64だ。

 blender-Blender, -Libraries というパスになっている。13:53, Sep. 13, 2023。Program Files\Blender Foundation\Blender 3.6\ の,blender.exeとblender-lancher.exeが主要なアプリと思われる。いずれも更新日時は,1:45, 2023/08/17,となっている。新しい−。後者をピン留めした。開くと,英語版が現れる。図1は一応,日本語を選んだ。最初の主要なメニューや基本的ツールだけが日本語表記されているもののようだ。ある程度慣れてきたら,英語表記に替えようとは思っている。

図1 blender lancherを立ち上げる

2 usdzファイルをobjファイルに変換する前に

 3章のコンテンツに会って,実はBlenderをインストールする気になった。簡単には行けない場所でMetascanで3DスキャンしてProを月購入してファイル出力をしたのであるが,fbx, ply, xyz.zipに限っていた。今,objが欲しくなって,iPhone 12 Proに入っている3Dオブジェクトをobjで出力したく,月契約をするつもりであった。しかし,このコンテンツを見つけたのである。
 mouseWindowsマシーン中のDocuments\win_moto_documentsフォルダをぼくのairmacとファイル共有設定をした。WindowsとMacの間でファイル共有をする方法 を参考にした。これでmacとのやり取りが楽になる。元々,ファイル共有設定はしていたのであるが,フォルダ単位の登録をしていなかったので。
 iPhone 12 Proのmetascanアプリを開いて大饗石のUSDZファイルをAIRmacにダウンロードして,Documents\win_moto_documents\win_3d_scan\大饗石metascan_LiDAR\metascan_Blend_objフォルダーに保存したが,MeshLabの場合のように,ファイル名に2バイト文字が入っているとトラブルの元になるので,metascan_20221121-1440_大饗石周辺のロックフォール.usdzを,metascan_20221121-1440_Ooaeishi-usdz.usdzとした。

3 MetascanのUSDファイルをBlenderでOBJファイルに変換する

3.1 USDZ ファイルの解凍

 MetascanのUSDファイルをBlenderでOBJファイルに変換する を参考にしている。ファイル名の拡張子,usdz,を,zip,に書き換えると,zip形式の圧縮フォルダーになる。
 で,ウィンドウズはzip解凍ソフトがWindows10に組み込まれていると思っていたけど,そうじゃないことを今,発見。macでは右クリックで解凍できるのに。有料のWinZipをMicrosoftは推奨している。おかしいと思って調べたら,7-zipがいいようだ。どうにも変なのだが,自分でシステムの名称を調べる必要があるらしい。Windows 10 Homeだから,たぶん,7-Zip (64bit版)だなあ。

 7-Zip for Windows からダウンロードできる。Downloadsフォルダを開くと,7z2301-64x.exeがある。これをダブルクリックすると,Destination folder: C:\Program Files\7-Zip\と出るので,Install。7-Zipフォルダーには,exeファイルが幾つかあるが,7z.exeが基本的なものであろう。この段階で右クリックで使えるようになっている。

 図2のように,解凍したいzipファイルを選んで,右クリックして,7-Zip/”解凍対象の拡張子抜きのファイル名”に展開,を選ぶ。

図2  圧縮解凍ソフトの7zipが右クリックで使える

 解凍されたフォルダの中味を見ると,0\フォルダーと元のusdzのファイル名に更にいわば文字化けが並んで拡張子はusdcとなっている。図3は0\フォルダを開いて見たものである。texture_0.jpeg〜texture_21.jpegという22枚のjpegファイルがある。思えば,FBXファイルがこの枚数のmeshからなっていることと良く符合している。

図3 0\フォルダー内の22個のイメージ

3.2 USDCファイルのインポート(元の記述をぼく用に変更した)

 Blender の File -> Import -> Universal Scene Description (.usd, .usdc, .usda) から USDC ファイルだけでなく,テキスチャーを共にインポートすることになる。
Blender File View ウィンドウで目的の USDC ファイルを選択し、またテクスチャも一緒に読み込むため画面の右ペーンの,Import All materials(これにはディフォルトでは✓が入っていない), Import USD Preview(これにはディフォルトで✓が入っている), Set Material Blend (これにもディフォルトで✓が入っている)を有効にして、Import USD ボタンを押す。ボタンを押す前が,図4である。

図4 Blender File View ウィンドウでの入力

 読み込んだ直後の画面が図5である。この時点では, 3D モデルにはテクスチャはいまだ表示されていない。

その結果が図4である。テキスチャーはまだだ。右上のView Port Shadingを選択する必要がある。右端のViewport Shading Method to display / shade object in the 3D View: Rendered Display render previewを選ぶと,次の図6のように表示される。

図6 Rendered Display

 ぼくは,テキスチャーが旨くレンダーリングされたけど,できない場合の対処法がこの参照サイトには記述されている。

3.3 OBJ ファイルをエクスポート(元の記述をぼく用に変更した)

 File -> Export -> Wavefront (.obj) を選択して OBJ 形式でエクスポートする。なお、デフォルトではエクスポート時の座標系が Z Forward, Y Up になっている。BlenderのZ軸は奥行き方向に対して,CloudCompareやMeshLabではZ軸は高度軸なので,変更する必要がある。図8の右ペーンのTransformで,UpをZ軸,ForwardをY Forwardに変更した。クラウドコンペアでのXYZ軸関係を見ると(図13),右手座標系になっているので,この設定は正解だ。なお,Exportする際に画面上のオブジェクトを選択していた(メッシュがオレンジ色で縁取られている)が,この所作は重要かも知れない?。

図7 Export > Wavefront (.obj)
図8 usdzフォルダー内に保存 ファイル名を付ける

 図8と図9はOBJ の保存過程であるが,反応が鈍い様に感じた。図9では保存ラインがえび茶色になった。これには時間がかかった。こうなってから,Export OBJのボタンを再度,タップしたように思う。Blender File Viewの最上部のPathを見ると,Dropboxに保存されているように見えるが,全くそのフォルダーには入っていない。これに惑わされた。

図9 OBJファイルの保存

 ブラウザー(Explorer)で確認した。新たなOBJファイルは,テクスチャー画像22ファイルが入っていた 0\フォルダーに保存されている。思えば,こういったファイル配置はOBJファイルの特徴であるし,適切なのであるが,焦ってしまった。赤い下線でpathを確認している。この構造をブラウザーで壊してしまうと機能しなくなる,当然。

図10 エキスポートされたOBJファイルは0\フォルダー内にあった

 図11では,CloudCompareでのファイルを開く際の,様子。

図11 CloudCompareでOBJを選択するところ

図12 左ペーンのDB TreeではOBJが見えないが,consoleに明記されている
図13 右手座標系である

無料のオンラインUSDZからOBJへのコンバーター ってのがあるのねえ。この作業が終わってから気づいた。しかし,出来上がったOBJを見ると,メッシュの破れが塞がっているように見えるなあ。

以上,Sep. 13, 2023記。

4 CloudCompareで編集して体積計算

 図14には,CloudCompareでの,分割作業の終盤を示す。図中の大饗石内部の白い大きな三角形のオブジェクトはBlenderによる追加である。元々は2個あって,外の大きな破れをカバーする形でやはり三角台状のものがあり,これを削除すると,大饗石の破れの部分が復活?した。図14の三角形をどのように削除するかちょっと困って,さし当たりとこの台状の部分が大饗石から突出している部分を削除しようとしたら,この白い三角形全部が消失した。これを削除することで,大饗石が傷つくことは無かった。なお,この白い三角形の中は空っぽだ。

図14 大饗石のみ残す

 図15に見えるように,テクスチャーはかなり緻密ではあるが,右手に見えるように,比較的大きな穴は埋まっていない。体積はV=45.9532となった。この図の上縁には木の枝のようなものが残っていて,これを削除すると付け根に穴が空いた。体積はV=43.8914となった。

図15 体積計算

5 MeshLabでusdz変換objファイルの穴埋めの後CloudCompareで体積計算

 usdzから変換したobjファイルのtextureの肌理は細やかな気がしている。実際,segmentationの際のmeshの断面はfbxよりもかなりスムーズな印象であった。図16のように,比較的大きな穴が残っている。
 図17では,Remeshing, Simplification and Reconstuction > Close Holes size 100,✓Prevent,設定。図18はその結果。手前の穴は塞がった。奥の一つは塞がらない。

図16 比較的大きな穴が
図17 Close holes size=100, ✓Prevent
図18 手前の穴は塞がった

 引き続き,Close Holesを実行しようとすると,Filter Failure not 2-manifold egesエラー。それで,
Filters > Cleaning and Repairing > Repair non Manifold Edges, Remove Faces を実行後に,もう一つの選択肢Split Verticesも実行した結果が図19で,図20のように,いまだ懸案の穴は残っている。
 size=1,000も実行した。Closed 789 holes and 44 new facesという結果。さらに,図21のように,10,000実行。Closed 32 holes and 1 new faces。とはいえ,図21のように,未だパネルそばの穴は塞がっていない。

図19 Split Verticesも実行
図20 まだ懸案の穴が残る
図21 size=10,000実行

 心は進まないが,ポアッソン再建を実行することに。Remeshing, Simplification and Reconstuction > Surface Reconstruction: Screened Poisson,図22にはpanel を示すが, Reconstruction depthを8から12に。Pre-Clean に✓。図23, 24はその結果。68665msecかかった。底以外の,全部の穴が塞がったが,底エッジには大きなスカートができた。

図22 Surface Reconstruction: Screened Poisson
図23 結果 上面から
図24 底(裏)から見ている

 これまでの作業を保存する。図25ではmlp形式で,図26ではexport meshで。オプションの可能な部分は全部✓。この出力をしないと,CloudCompareで扱うことができない。obj形式のまま,保存する。これでMeshLabは終了できるが終了しなくても問題ない。exportしたファイルをCloudCompareで扱うことができる

 CloudCompareで開くために,metascan_Blend_objフォルダを見ると,Poisson mesh.plyがある。図27はそれを呼び出したところ。OBJであっても,PLYファイルがベースになっているようだ。

図25 MeshLab形式mlpでまずは保存
図26 export meshで Flags, quality, normal全部に✓ 名称は自動。
図27 CloudCompareで開く

 CloudCompareでPoisson mesh.plyを呼び出すと,図28のように,Meshエンティティが見える。シーンではz軸が間違いなく標高軸になっている。segmentation 作業を進める段階毎に,Mesh_step1.objなどと保存してゆくことにする。ただ,保存に,ものすごい時間がかかる。segmentationの開始前に体積計算して,図29のように,まずはスカートを含めてV=130.998が得られた。図30では粗っぽくスカート部分をsegmented。

図28 CloudCompareで開いたところ
図29 体積計算 V=130.998
図30 粗っぽくスカートをsegmented

 Edit > Mesh > Measure volume V=49.7738,Mesh_step2.objを保存。さらに触って,図31のように,V=43.1091が得られて,図32,図33のようにMesh_step3.obj として保存した。

図31 完成してV=43.1091
図32 Mesh_step3.obj として
図33 Mesh_step3.obj 保存がconsoleに

 図34はCloudCompareからファイルを選ぶところだ。図35のDB Treeにあるように,Mesh_step3_convertedCC.ply > Mesh > Verticesとなっていて,このverticesは点群だ。
 図36にあるように,この点群を選んで,Tools > Volume > Compute 2.5D volumeを実行すると,Volume calculationパネルが現れる。基本的にはデフォルトのままでよい。
  Ground source: constantでオーケー,Default height: -0.758000がデフォルトで入っているのは,この高さが最低値だからだ。(Groundとして点群を選ぶことができればより正確な値を得ることができる)
  Ceil source: Vertices デフォルト。step: 0.010000 これは10cmスクエア,まあこんなもんだな。デフォルト。自動的にsize 529 x 741 = 391,989 cells。Projection dir. Z。Num. precision 3。全部デフォルトである。

図34 Compute 2.3D volume
図35 点群Verticesを選ぶ
図36 Volume Calculation

 計算結果を図37〜39に示す。図37はデフォルトstep 0.01でV=53.574,図38はstep 0.001とすると総セル数は10,000,000を超えるためにエラーとなる。図39はstep 0.002(step 0.002の場合,sizeは 2639 x 3703 = 9,772,217 cells < 10,000,000)とした場合で,V=53.582。

図37 step 0.01
図38 step 0.001 エラー
図39 step 0.002

 step 0.03 (size 177 x 248 = 43,896 cells), V=53.484 (Matching cells 58.8%)。点群に対して2.5D volume計算値はstep 0.002〜0.01まで,変動量は大きくはない。Ground値を定数にしても単純に点群の頂部からGroundまで一律に体積として組み込んでいる訳ではないように思う。

図40 step 0.03 size 177 x 248 = 43,896 cells

6 BlenderのAdd-onで体積計算

 Blender PreferencesのAdd-onsのリストの中に,Mesh: 3D-Print Toolboxがあり,Blenderアイコンが出ている(図41)ので,インストール済みということ。□に✓を入れること。なお,インストールされていないのは人影が見えるので,□に✓を入れて,リスト最上段の「↓インストール」ボタンを押せば良い。
 add-onがあるpathは次のようだ。C:\Program Files\Blender Foundation\Blender 3.6\3.6\Script\addons。
 Mesh: 3D-Print Toolboxの使用法は,
How To Use The 3D Print Toolbox Add On?
【注意点アリ!】Blenderで3Dプリンター用のデータを作る方法
にある。要するに,3Dプリンター用のファイルを作るためのadd-onのようだ。Mesh: 3D-Print Toolboxを画面に表示するには,図43のViewメニューのSidebarの□に✓を入れること。

図41 Blender PreferencesのAdd-onsのリストの中にMesh: 3D-Print Toolboxインストール済
図42 Add-onのインストール
図43 View > Sidebar

 図44のように,3D-Printのタブが現れて,これをクリックすると,3Dプリントのためのファイル情報が現れる。Statistics > Volumeのボタンを押すと,計算される。その結果は図45に出ていて,37.942㎡とされる。この値は,PLYをメッシュ化したファイルとか,FBXファイルの体積計算の結果とほぼ一致している。
 すでにこのサイトに記述したかどうか。メッシュファイル特有の構造がこういう結果を生み出した可能性が大きい。Blenderに,CloudCompare以上の精度を期待したが,どうもメッシュファイルの分析過程にも問題があるようだ。メッシュファイルが底抜けであることが原因か。CloudCompareではholesを原因とするinvalidのメッセージが出るが,Blenderではその種のメッセージは無い。ここで使ったメッシュファイルはusdzをobj化したもので,良い結果を期待したが残念だ。
 もう体積計算値を確かめる方法は,3Dアプリでは期待できず,四面体に分割して座標値からおよその値を求めるしかない。このページで論じたいと思う。

図44 Sidebarに3D-printが表示される
図45 Statistics > Volume,にチェック
図46 Check Allをクリックすると

 図46には,Check Allボタンをクリックした結果が見える。この結果が出るのに結構時間がかかったように思う。この結果を見ると,3Dプリンター用には問題かも知れない。結果の項目を選ぶと,スクリーンにその場所が現れる。その2例を図47と図48に示す。図48にはNon Manifold Edges 6057カ所が示されているが,ポアッソン再建処理後,大饗石に属す筈が無いスカートをsegmentationしたためにできた切断線で,この底の穴を埋めるには,6057個のedgesをも繋ぐ能力のツールまたは手法が必要になるということを示している。この情報はぼくが欲しいものであったが,この底穴を埋める方法をぼくは知らない。

図47 Overhang Faces 326523
図48 Non Manifold Edges 6057

7 平行六面体から導かれた四面体に分割して大饗石の体積を手計算する

 このページは一応終了する。ChatGPTを使って3Dスキャンオブジェクトの体積を求める に続けたい。

以上,Sep. 20, 2023記。