Windows 10 DocumentsのUSBメモリーへのバックアップ backup of Windows 10 Documents into USB memory

はじめに

 macのタイムマシーン6TBは使用しているが,mouse製Windows 10ではバックアップを取っていない。ここ数年,3Dデータの処理やキンドル版発行のために,100GBほどの書類が溜まってきた。これが壊れると,研究がストップする。
 締め切り原稿を出して,急にこの件が気になって,256GBのUSBメモリーにバックアップすることにした。ところが,バックアップに余りに時間を要してしまって,結局,失敗が2回続いた。

メーカー: ‎Aeuln,対応OS: ‎mac_os, windows_me, Windows_xp, windows_2000, windows_vista, windows_7,その他 機能: ‎ポータブル,耐水性,防水,接続方式 :‎USB,サイズ: ‎256GB,梱包サイズ: ‎9.2 x 4.5 x 2.2 cm; 50 g, 製造元リファレンス: AEULN-856692, ASIN B09YCL4BY3, Amazon.co.jp での取り扱い開始日: 2022/1/4

1 昨日〜今日までの問題

 C:\Users\moto\Documentsの中の一つのフォルダー88GBのUSBへのバックアップに対して,所用時間17時間が出てきて驚いたのであるが,実際は,図2, 3のような質問が途中に出てきて,これに応えないとバックアップが進行しないので,つきっきりでも無い限り,完了しえない。そして,ファイルやフォルダーについて,何故かプロパティをコピーできなくても良いか,ってな質問が出て,コピーしないで次に進むことに,違和感もある。

図1 経過例

図2 確認画面例1

図3 確認画面2

「対処法」プロパティを含めずにこのファイルをコピーしますか?に良い情報があった。チャイナ系のサイトのように思う。プロパティを含めない,のは,まずいらしい。「このエラー「プロパティを含めずにこのファイルをコピーしますか?」は、ファイルシステムに起因している可能性があります。コピー先のディスクやパーティションがFATの場合、プロパティ付きでコピーや転送ができないファイルがあります。これは、NTFSファイルシステムはADSやファイル暗号化情報に関わるプロパティを保存できるのに対し、FATドライブでは保存できないためです。そして、「プロパティを含めずにこのファイルをコピーしますか?」というエラーが発生します。」とある。

2 USBメモリーのNTFS初期化,バックアップフォルダーの圧縮

 Windows10で,249GB-USBを選択して,フォーマットを選ぶと,ファイルシステム(F)として,exFAT(既定)になっていた。これはmacとWindows両方に対応しているが,FATの一つなので,この問題を生じていると考えられるので,NTFSで初期化を実施した(図4)。

 なお,Microsoftの情報 FAT、HPFS、NTFS ファイル システムの概要,も参照した。さらに,前述の,「対処法」プロパティを含めずにこのファイルをコピーしますか? では,エラー回避のために,ファイルを圧縮してコピーするとこの種の問題は生じないということで,フリーウェアの7-Zipを使って(右クリックで表示される),zipファイルを作成することにした。合計サイズ85GB298MB(図5)。パネル表示によれば,50分ほどかかるようだ。

図4 USBメモリーのNTFS初期化

図5 moto > win_moto_documentsフォルダーの7-Zipによるzip圧縮

図6 7-Zipで圧縮中

 15:06スタート。16:14には残り,2h30m。20:12終了。全4時間だった。元フォルダーは85.298GBだったが,27.564GBまで,つまり32%まで圧縮できた。出来上がったzipファイルをUSBメモリーにコピーした。コピーに要した時間を計測していないがプロパティーで見ると,20:14にスタート,20:49に終了。35分間。

3 WindowsマシーンとUSBメモリー

 Windowsマシーン内のwin_moto_documtnsフォルダーを7-Zipで圧縮して,USBメモリーにコピーした。両方に,同じメモ帳ファイルを置いた。ここにこれからコピーの履歴を記録してゆくことになる。

図7 Windowsマシーンのwin_moto_documtnsフォルダー

図8 USBメモリーのwin_moto_documtns.zip

おわりに

 図7には,win_moto_documents内のフォルダーが見られる。新たなファイルはそれぞれのフォルダーに収納する必要がある。そして履歴は共通のメモ帳に記録する必要がある。

以上,Sep. 30, 2023記。

追記

 馬鹿馬鹿だ。まだ一月経ってない作業なのに,この作業を完全に忘れていた。NTFSフォーマットでは,macが読めない。USBメモリーのケースに,Windows Openって,書いているし,レーベルにもWindows用,って書いている。また,exFATに戻して,再コピーした。バックアップ用の追加ファイルは,zip化してゆけば,exFATでもコピーができる。

以上,Oct. 27, 2023記。




Meshmixerで底抜け解消そして  closing up a big gap in the 3D mesh using Meshmixer, and

はじめに

 やっと,大饗石の底抜けを解消することができた。Autodesk Meshmixerはオープンソースである。ありがたい。一昨晩,寝る前の恒例のTV録画鑑賞に入る前に,出会ったのである。Meshmixerというぐらいだから,点群よりもメッシュに対応している。ぼくのイメージでは,これを使えばIllustratorのように穴の周辺のネットを引っ張ってブリッジをどんどん架けて,その隙間は一気に埋められるというような印象があって,実際にやろうとしたが全然そうはならない。
 とはいえ,3Dスキャンで得たオブジェクトのデコボコを滑らかにすると行ったことは手作業でできる。CloudCompareやMeshLabでは到底できないことである。iPhoneLiDARで作成した3Dスキャンオブジェクトのネットが綻びているのは普通のことで,この解消はCloudCompareではできず,MeshLabの役目ではあった。MeshLabでコマンドを実行するにしても,パラメータの役割が説明を読んでも理解できず,無力感が襲うのであるが,Meshmixerを使っていて,そういう感覚は全く生まれず,実行プロセスが目の前に見えて,何とも頼もしい。これを無料で提供しているAutodesk恐るべしである。このアプリの目的は,3Dプリンター用のファイルを作成することにあるが,残り少ない人生,この分野には到底入れない。

1 Autodesk Meshmixer

Meshmixer 3.5 is now available ! https://meshmixer.com/download.html

Japanese Installer Windows 3.5,System Requirements Meshmixer 3.5 Microsoft Windows 7 or later 4GB system RAM Release April 17, 2018.

Wikipedia:  スカルプトモデラー。 Sculptor modeler,いわば彫像や塑像を作るソフトだろうか。メッシュの合成、メッシュの伸長・回転、メッシュ選択のスムース化などの機能を持つ。3Dプリンタ向けに、床面上への複数オブジェクトの詰め込み (Layout/Packing Tool)、効率的な支柱構造を自動的に追加する機能が追加されている。開発終了。

————————————————
Autodesk Meshmixer UI解説 -2つの3DデータをMIXする-

Autodesk Meshmixerは無料で公開されているスカルプ系の3Dモデリングソフト。簡単な操作で加工ブラシを使用して、粘土を扱うようにモデル表面を変形することができ,3Dスキャンデータの修復や3Dオブジェクトデータの合成,3Dプリンターのデータ作成を気軽に行うことが可能。
ここでは、UIの解説と、2つの3DデータをMIXする方法を解説する,とある。

2 3D底抜け解消が実現

当方の,C:/Users/moto/Documents/win_moto_documents/win_3d_scan/大饗石metascan_LiDAR/大饗石from_iPhone/onlyOoaeishi_closeHole.mlp というMeshLabファイルを使う。

 左のメニューアイコンで実行する。上のメニューからでも可能。図1は大饗石objをインポートしたところで,次にメッシュの綻びをチェックすべく,解析 > 検証を選択直後の様子が図2である。大饗石の底抜けの部分には赤い縁取りが見られるが,銀色の表面の部分の穴がチェックされているようだ。図3は「すべて自動修復」ボタンを押した後の画面である。結構の時間がかかったように思う。

図1 大饗石のobjファイルをimportした

図2 解析 > 検証

図3 「すべて自動修復」の実行後 

 図4では,解析 > ソリッド作成,を実行しているところである。かなりの時間を要した。図5は完了した際の画面で,ソリッド作成のパネルが現れて,細かなパラメータの設定ができる。ぼくはこの結果に満足して,下の「適用」のボタンをクリックして,図6の表示を得た。とにかく,永らく切望していた大饗石オブジェクトの頑丈な底ができている。ソリッドの意味がわからない。蓋ができても中味は空っぽだ。

図4 解析 > ソリッド作成

図5 ソリッド作成直後

図6 適用,の直後

 図7は,インポートしたオブジェクトだ。パネルでその選択をしている。図8はソリッド化されたオブジェクトだ。このオブジェクトを選んだ状態で,エキスポートした。図9では,Mesh_step3_obj_mixer2.objとした。この前に,Mesh_step3_obj_mixer2.mixで全体を保存している。

図7 Mesh_step3.obj 表示

図8 Mesh_step3.obj(ソリッド)表示

図9 エキスポート: Mesh_step3_obj_mixer2.obj

以上,0:20,Sep. 23, 2023記。

3 体積をCloudCompareで求めるーMeshmixerで穴埋め,平坦化

 CloudCompareに取り込んで,Edit > Mesh > Measure volume,を実行。V= 37.7436,
mesh has hole。またこのメッセージだ。図10ではwireframe表示して観察したが,穴は見えないなあ。面積も求めた(図11)。

図10 CloudCompareで体積を求めたが

図11 面積も

 図12は,Meshmixerで,解析 > 検証 > すべて自動修復,の実行後。この前に,沢山の穴の表示があったが,撮影を忘れた。ソリッド化を実行した後,改めて,解析 > 検証 > すべて自動修復,を実行する必要があった,ということらしい。今後はそうしたい。

図12 自動修復後

図13 ブラシで北壁をフラット化(途中)

図14 ブラシで北壁をフラット化済

 図13, 14は,スカルプトsculpt(動詞しかないが) > ボリューム選択 > フラット化 flatten,を北壁について実行してゆく過程を示している。繰り返すとどんどんフラット化がすすむ。元々のオブジェクトはフラット化後の雰囲気に似ていたが,作業過程を進めて行く過程でボコボコになったので,この種の作業そのものが体積計算の正確度を下げるものでは無いと感じている。
 他の面のフラット化も記録?のために,鬱陶しいだろうが以下に示す。

図15 南面のフラット化実行前

図16 南面のフラット化実行後

図17 頂面のフラット化実行前

図18 頂面のフラット化実行後

図19 東面のフラット化実行前

図20 東面のフラット化実行後

図21 西面のフラット化実行前

図22 西面のフラット化実行後

図23 底面のフラット化実行前

図24 底面のフラット化実行後

図25 西北西付近のフラット化実行前

図26 西北西付近のフラット化実行後

 以上の作業がholeを埋める効果があるとは思えないが,外から見て穴のように見える部分がほぼ無くなって,実体に近くなっていると感じている。
 もう一度,解析 > 検証 > すべて自動修復。穴なし。終了。
 名前を付けて保存。Mesh_step3_obj_mixer3.mix,エキスポート
Mesh_step3_obj_mixer3.obj だ。

4 体積をCloudCompareで求めるー警告メッセージから回避できた

 Mesh_step3_obj_mixer3.obj をCloudCompareで開いて,図27のDB Treeに見られるようにメッシュを選択して,Edit > Mesh > Measure volume,実行。計算結果は,V=37.6635。警告メッセージが無くなった。成功だ。Edit > Mesh > Measure surface,実行,S=69.7372。図27最下部のコンソールに見える。

図27 objファイルから体積と面積が正しく求められた

 点群verticesをPLYで保存する前が図28である。

図28 objファイルのverticesを選択して

5 OBJファイルの点群verticesから2.5D volume 計算

 上記PLYファイルをCloudCompareで開いてcloudを選択し,bottom view(図29)。点群対象のcompute 2.5D volume分析のために,上下に点群を分割したい。外周の一番の出っ張りをトレースしてsegmentationを実施したいと考えた。segmentationはsegment in or outを実行をしないとオブジェクトの移動などができないので,1回で分割しなければならない,と呆けで決めつけてしまった。それで,図30のように,set bottomにしてその縁辺で切り取るしか,方法はない,と考えたのである。
 図31には,ポリゴンの選択を完了した様子(緑色細線の閉曲線)が見える。

図29 PLYファイルを開いてcloudを選択

図30 set bottomでsegmentationのトライ

図31 ポリゴンツールによる選択完了

 図32はsegment outを実行したところで,図31のポリゴンツールで閉曲線を作成した筈であるが,囲んだ範囲の外側が図32のcloudとなったのである。図33ではconfirmした結果で,DB Treeのremainingとsegmentedの両方が選択されている。図34はこのオブジェクトのleft side viewで,切り口は見えない。まだ事態が掴めない。

図32 segment out 実行

図 33 confirm segmentation

図34 left side view

 図35で見ると,segmentedは欲しいcloudの筈なのだが不要な方がそうなっている。図36, 37はremainingのトップからとボタムから見たcloudだ。

図35 segmentedのtop view

図36 remaining のtop view

図37 remainingのbottom view

 図38のfront viewを見ると,オブジェクトが図35のcloud抜きなので,完全に分離されている。もしこのtopとbottomを使う場合,点群remainingに,上下の点群が一つの点群エンティティーになっているので,分割する必要があるが,それはできないっ,とその時は思ったのである。
 意味ないのだけど,remainingとsegmentedの両cloudを選択して,mergeしようとしているのが図39である。図40にはmergeの結果が見える。赤い点群はsegmentedのcloudである。まあ,全くの失敗なのでdeleted。お試しだ。

図38 remainingは完全に2分割されている

図39 Mergeを実行する直前

図40 mergeの結果

 練習2だ。図41はtop view。図42はsegment in。図43で見ると,remainingだけ表示しているが,不連続で断裂してる。回転などして3D構造を見ると,手前の壁だけでなく,奥の壁も削除されているようにも。bottom viewでみて,連続性を考慮して,もう一度トライしてみよう。deleted。

図41 top view

図42 segment in

図43 confirm, remainingを表示

 また読み込んだ。どうも試行錯誤で,なんかわかったような。図44のようにbottom viewにして,図45のように,適当にsegmentした。そして,segment out(図46)。

図44 bottom view

図45 適当にsegmentする

図46 segment out

 図47のようにポリゴンで選んで,segment outしたら,選んだ範囲以外のcloudが残る形だ。そういえば,そうだよなあ。この結果をキャンセル(ツールの✖️)。

図47 底面も頂面も削除されている

図48 見える範囲で適当に縁辺だけ

図49 segment out どうも奥も切れている

 図50は開始前,図51ではsegment out。図52はconfirm前。

図50  開始前

図51 segment out

図52 confirm前

 図53, 54, 55。試行錯誤。ceilとgroundになる点群の分割を考えている。少しずつ,segment outを繰り返している。

図53 confirm前

図54 confirm前 

図55 こんなものかなあ

 図56で,複数回のsegment outに対して,confirm segmentation実行した。図57は,segmentedだけを表示。図58ではremainingだけを表示した。これがsetment outの結果でsegmented outされた「残り」であって,感覚的には,削除を繰り返してきた点群がいわばメモリー内でマージされていたのである。

図56 confirm segmentation実行

図57 segmentedの表示

図58 remainingの表示

 toolでの点群体積計算で,Ceilがsegmentedで,groundがremainingに対応することになるだろう。図60では両cloudを選んで,Tools > Volume > 2.5Dvolumeを実行することになる。図61を見ると,groundに対応するcloudはremainingで,ceilに対応するcloudはsegmentedになっているので,いい感じだ。ただ,At least one of the cloud is sparse! You should fill the empty cells… という警告が出ている。 step: 0.03(3 cm)。図62との違いはEmpty Cellsをleave emptyにしているかinterpolateにしているかの違いで体積値が変わる。

図60 両cloudを選んで

図61 UpdateでVolume 25.879

図62 UpdateでVolume 21.376

 Calculated volume in 2.5 d changes with grid step size bug? を参照のこと。それで,図63では,両点群のEmpty cells: interpolate,Grid step 0.10(10cm)にした。かなり粗いグリッドだが,Volume 32.205,Surface 18.750,Matching cells: 81.9%,となった。警告が出なくなった。図64のように,Export grid as a cloudのボタンをクリックすると,シーンにカラーによる高度頻度分布図がHeight deiffernce raster(0.1)として出力されている。図64のパネルの最下部でOKを押すと,図65のように,パネルが消えてシーンには高度頻度分布図が配置されている。

図63 Grid step 0.10(10cm)など

図64 Export grid as a cloudを選択

図65 パネルが消えて高度頻度分布図がシーンに配置されているのが見える

 図66に示した結果が最適値である。grid step 0.200,Volume 32.441, Matching cells: 82.4%。gridが粗いのでもちろん警告は出ていない

図66 最適値

6 OBJファイルの体積計算結果にもう少し拘ってみたい

 以上から,メッシュオブジェクトと点群オブジェクトの体積計算値をその限界精度から考えると,メッシュオブジェクトの計算,Edit > Mesh > Measure volume,の結果,V=37.6635を採用するのが,妥当ということになる。点群オブジェクトの計算過程を見ると粗雑になっている。とはいえ,両値は,かけ離れていないし,点群の値はメッシュの計算結果をサポートしているとも考えられる。
 体積計算にもう少し拘りたいと思う。一つは,点群密度の向上であり,もう一つは手作業での四面体分割法での計算である。

以上,0:35,Sep. 24, 2023記。

 ぼくにとっては,このウェブページを書いた当日に寝ながら,考えて,新たな修正原稿をこの月曜日の事務スタッフ出勤前に,Google Driveにアップロードするのが,ベストだと考えた。Meshmixerによるソリッド化の成果を生かすことにした。

 で,このウェブページが完結できていないので,いま,その後片付けをしたいと思う。すでに述べてきたことであるが,点群のメッシュ化,さらに点群への変換を実行する。その手法は,すでに述べてきたことであるが,

点群PLYのエンティティーを選択して,
 ① Edit > Normals > Compute(デフォルト値)を実行すると,Octreeがこの下位に作成される。
 ② 同エンティティーを選択して,Edit > Mesh > Delaunay2.5D(best fitting plane)を実行。この直後にnormalsに関するメッセージが出るが触らずにYes。その結果,対象エンティティの下位でOctreeと同階層に隙間の無いMeshエンティティー(メッシュアイコンが付加されている)が作成される。
 ③ このメッシュエンティティーを選択して,Edit > Mesh > Sample PointsでデフォルトでOK。デフォルトで百万点にしていたので作成されるエンティティーも1,000,000点になる。
 このプロセスを実行する前の筆者が使った点群PLYは2万点であったから,Points数は50倍になっている。なおこのエンティティーは元の点群PLYと同じ階層に生成される。

図67では点群cloud 50,312 pointsである。

図67 Mesh_step3_obj_mixer3.CCvertices-Cloud segmented

図68は②実行後で,Octreeとともに,meshエンティティーが形成されている。

図68 ②の実行後

図69は,③の実行後で,Mesh_step3_obj_mixer3.CCvertices-Cloud segmented.mesh.sampled を表示。点群cloudのpoint数は,百万点になった。

図69 ③の実行後

図70はボタムのremaining対応を表示している。①〜③実行済みで,これも,point数を百万点にしている。

図70 ボタムのremaining top view

図71のように,両cloudを選択している。

図71 両cloudを選択。

Tools > Volume > Compute 2.5D volume,を実行した。自動で,Ground: remaining 底
Ceil: segmented 地上部,Grid step 0.005 5mmだった。警告なし。計算結果は,Volume 31.825,Surface 17.921,Matching cells 81.6。

図72 step: 0.005

Grid step を0.02にしてみよう。Volume 31.865,Surface 18.050,Matching cells 81.7。

図72 step: 0.02

Grid step 0.005 5mmだ。Height difference raster (0.005)北壁のポイント密度が少ない。

図73 パネル表示を外した

 以上の結果を踏まえて,文学論集Vol. 73-3の原稿に反映している。以下,それを次に。

7 フィールド科学のためのアップルLiDAR測量 Part 2 Ⅴ.4 Meshmixerで大饗石の底抜けを解消して体積を求める

 文学論集Vol. 73, No. 3(発行は2023年末ぐらいか)

 Meshmixer 3.5 is now available ![i] からこのアプリをダウンロードできる。筆者が用意していた大饗石オブジェクトだけのMeshLabファイルからobjファイルを抽出してMeshmixerにインポートした。メッシュの綻びをチェックすべく,解析 > 検証,を選んだ。かなりの綻びがシーンに表示される。「すべて自動修復」ボタンを押した。実行にかなりの時間を要した。MeshLabでこの種の作業を実施してきたファイルであったが,Meshmixerからすると今だ綻びがあるようだ。Meshmixerは,ビジュアルに簡便に,この種の作業が実施できる。これは驚きであった。

 その上で,解析 > ソリッド作成,を実行した。これも時間を要したが,図33(a)のように見事に底抜けが解消した。しかもMeshLabでのポアッソン再建の如く異様に膨らむこともなく,しっかりとした薄皮一枚で底抜けが解消されたのである。


[i] https://meshmixer.com/download.html

図33 Meshmixerによるソリッド化とフラット化

 Meshmixerは,編集過程などでの3Dオブジェクトの変形を修復する機能を持っている。ここではブラシのフラット化ツールをつかって修正した結果を図33(b),(c)に示している。(b)は(a)の新たに付加された底面をフラット化ツールを使って滑らかにしたbottom viewの結果である。(c)は大饗石地上部の東壁および周辺をフラット化したもので,これはフラット化前の(a)右手突出部に対応している。

 なお,このような作業を経たファイルはCloudCompareで開く前に,Meshmixerで,解析 > 検証 > すべて自動修復,を改めて実行しなければならない。

Ⅴ.4.a 大饗石objファイルのメッシュ体積計算

 このobjファイルをCloudCompareで開いて,Edit > Mesh > Measure volume及び > Measure surfaceを実行すると,図34(a)のように,V = 37.6635(警告メッセージなし),S = 69.7372を得ることができた。

Ⅴ.4.b 大饗石objファイルの点群verticesから2.5D volume計算

 objメッシュファイルには点群verticesが含まれており,これを使うと点群対応の2.5D volume計算が可能になる。2.5D volume計算は,Ceil(シール,天井面)にあたる点群とGround(底面)にあたる点群の間の3D空間を垂直方向の小さな立方体で構成される正四角柱で分割して,CeilとGroundの間の立方体を数える手法である。

図34 CloudCompareでメッシュ体積面積計算と点群体積計算の準備

 この手法では,objファイルの点群verticesを,3D構造を考慮して,Ceil点群とGround点群に分割する必要があるが,で示した分割ツールを使って,Ceil点群とGround点群として,それぞれsegmented点群とremaining点群を割り当てることになるのである。図34(b)では分割できた両点群を選んで表示しているので,シーンには⋯⋯segmented⋯⋯と⋯⋯remaining⋯⋯の名称が見える。白っぽく広い面は底面の部分であって,Ground点群に対応している。

図35 点群2.5D volume計算

 Ceil点群とGround点群それぞれを構成する点数は,この大饗石の例ではそれぞれ5万点,2万点ほどなので,Ⅲ.4 計算結果の比較,で述べた「点群ファイルPLYからメッシュに変換しさらに点群に変換したエンティティー」(脚注[i]に説明)の手法で,それぞれ百万点ほどに増やして,図34(b)のようにCceilとGgroundの両点群を選択して,Tools >Volume > Compute 2.5D volumeを実行した。実行結果を図35に示している。正四角柱の断面は正方形であるがその一辺をCloudCompareではGridのstepといい,図35のものはstep=0.005mとしている。図35(a)は計算結果のパネルを示していて,この結果の数値がみえるように切り取って拡大している。Volume: 31.825㎥,Surface: 17.921㎡,Matching cells: 81.6%を示している。なお,Compute 2.5D volumeが算出するSurfaceは,前述のようにオブジェクトの(Z軸に垂直な)平面図の面積を示しているようだ。このパネル下部のOKボタンを押すと,パネル表示が消えて,図35(b)が現れる。点群密度は,反射光量を反映して北壁は南壁に比べるとかなり低い。大饗石の標高分布別に赤色と緑色の間で段彩(原図はカラー)されており,最下部付近の緑色の点群の塊はGround cloudに相当するものである。

 なお,上述のように点群の点数を増やさない場合,step: 0.1より小さくすると,赤字でAt least one of the cloud is sparse! You should fill the empty cells..という警告が現れる。Ⅴ.4.aのメッシュの体積は前述のように37.6635㎥であった。点群の体積は31.825㎥である。メッシュの体積は,図34(a)のメッシュ拡大図に見えるようにメッシュエンティティーは三角面triangle facesからなり,適当な原点から三角面それぞれの頂点に側稜が伸びて,オブジェクトは三角錐で埋められる。それぞれの三角錐の体積の総和がメッシュファイルの体積となる。前述のように2.5D volume法はこのメッシュ法に比べると粗雑になっているので,メッシュ法の体積V = 37.6635㎥を採用することになる。土木工事などで工事の前後の土量の移動などの場合は,適用が2.5D volume法に限定されるので,もちろん,使用価値はある。


[i] 点群PLYのエンティティーを選択して,① Edit > Normals > Compute(デフォルト値)を実行すると,Octreeがこの下位に作成される。② 同エンティティーを選択して,Edit > Mesh > Delaunay2.5D(best fitting plane)を実行。この直後にnormalsに関するメッセージが出るが触らずにYes。その結果,対象エンティティの下位でOctreeと同階層に隙間の無いMeshエンティティー(メッシュアイコンが付加されている)が作成される。③ このメッシュエンティティーを選択して,Edit > Mesh > Sample PointsでデフォルトでOK。デフォルトで百万点にしていたので作成されるエンティティーも1,000,000点になる。このプロセスを実行する前の筆者が使った点群PLYは2万点であったから,Points数は50倍になっている。なおこのエンティティーは元の点群PLYと同じ階層に生成される。


図36 Surfaceを構成するセルマップ

 なお,図35(a)のSurface値:17.921の算出法について確認したい。step値は図35(a)では0.005で図で表現しにくいので,step: 0.200として図36に示す。ここでは,V:32.441,S:19.840, Matching cells: 82.4%になる。CeilとGroundの両cloudで算出する場合,Surfaceの計算式にMatching cells(%)値は関与しない。

以上,Sep. 29, 2023記




ChatGPTを使って3Dスキャンオブジェクトの体積を求める calculating volume of 3D scanned object using ChatGPT

はじめに

 数日前,Sep. 18, 2023,長男ファミリーが立ち寄って,ぼくがエルゼビアに論文投稿する準備をしていることを知っていて,ChatGPT,を紹介してくれた。マスコミで盛んに取り上げられているが,ほぼ関心がなかった。しかし,実際に使ってみて,かなり賢いことがわかった。

 OpenAIというイーロンマスクなどが出資し,Microsoftが100億ドルの追加出資をした企業が開発したものだ。ChatGPTを検索すると,

質問:Is Japanese edition of ChatGPT original or translation of English ChatGPT?

As of my last knowledge update in September 2021, OpenAI had not released an official Japanese edition of ChatGPT. However, it’s important to note that advancements and updates may have occurred since then.

If a Japanese edition of ChatGPT exists or has been released since my last update, it could be an adaptation or translation of the original English ChatGPT. The translation process involves translating the underlying model, fine-tuning it using Japanese text, and potentially making cultural or linguistic adjustments to ensure the responses are appropriate and natural in a Japanese context.

For the most current and accurate information about a Japanese edition of ChatGPT, I recommend visiting the OpenAI website or referring to official updates and announcements from OpenAI or other relevant sources.

というようなことである。

iPhoneとiPadにも,ChatGPTをインストールした。Plusにすると,月3000円だ。他のサイトの解説では,iOSで質問−回答,の履歴は,macと共有できるという情報があった。mac,iPhone, iPadのそれぞれから発信して,無事,共有することができた。history listのタイトルに必ずしも一貫性が無いので,見出しを開いて確認する必要がある。iOSの良さは,口頭で話すことでテキストに変換してくれることである。英語をより理解してくれるという印象もあるが,日本語の方を理解する場合もある。ぼくの英語?の発音が問題なのだろうね。

macの純正「メモ」memo エディターはiPhoneでもiPadでもiCloudを通じて共有できるので,研究の補助ツールとして使えるように思う。ChatGPTの書式はかなり扱い難いものなので,メモエディターの存在は大きい。

1 四面体に分割して体積を求める

 文学論集Vol. 73, No. 3の『フィールド科学のためのアップルLiDAR測量 Part 2』の「Ⅴ.4 四面体に分割して体積を求める」(Sep. 19, 2023投稿)のコピーをここに示す。ChatGPTを初めて使った報告の一部である。
————————————————
ChatGPTを本日初めて使い,” Do you calculate the volume of a 3D mesh obj file?”って質問すると,多少長いが示唆に富む回答があった。

Load the OBJ file → Triangulate the Faces → Calculate Tetrahedral Volume → Sum Up the Tetrahedral Volumes.

このモデルを手作業で実行した。このモデルではどんな形態でも適応が可能ではあるが大饗石はほぼ一つの六面体と一つの五面体で構成されている。 図33のα)は南壁面,β)は北壁面,γ)は東と西の壁面を示している。西壁面は,いわば新幹線先頭車両の鼻のように,大饗石本体の六面体に四角錐が突出しているようで,こういったイメージの元で,9の9点の座標値を採取した。つまり,CloudCompareの上段メニューアイコン群の左から4番目のアイコン Point list picking(9点)を実行した。図33にその地点を示している。六面体内の四面体構成を図33δ)左手に示す。5個の四面体は,aeと命名しそれらの頂点に対応する頂点にaeを記している。西壁面の五面体は図33δ)右手に示すがf,g二つの四面体で構成される。9の9点の座標値は,(x, y, z)の配列で,次の表5に示している。

図33 7個の四面体から大饗石の体積を求める
Pt. No. x y z Pt. No. x y z
1 1.28346 0.49280 0.24606 2 0.99729 0.80558 1.92038
3 -1.72137 -2.78218 1.92664 4 -1.72197 -3.42626 1.12020
5 0.01142 3.18688 -0.39475 6 -0.72284 2.59407 1.88495
7 -3.58718 -1.48008 1.67906 8 -3.21799 -1.94289 -0.44899
9 -3.44079 -3.19397 1.38024      
表5 大饗石の四面体分割のための座標点

一つの四面体と一つの五面体での9点の座標点との関係は,例えば六面体の中央に位置する四面体aでは,座標点4,5,1,2からなる。一つの四面体を構成する4点の座標点は,(x1, y1, z1), (x2, y2, z2), (x3, y3, z3), (x4, y4, z4)と表現できる。ChatGPTの回答の行列式は,次の式のように計算できるので,Microsoft Excelにこの式を組み込むことで,それぞれの四面体の体積を求めることができるのである。

=abs(((x4-x1)*((y2-y1)*(z3-z1)-(z2-z1)*(y3-y11))+(y4-y1)*((z2-z1)*(x3-x1)-(x2-x1)*(z3-z1))+(z4-z1)*((x2-x1)*(y3-y1)-(y2-y1)*(x3-x1)))/6)

それぞれの四面体の体積は,a=6.4159, b=1.4489, c=3.8164, d=4.6968, e=5.3058, f=1.0708, g=0.6273であり,合計23.38㎥となる。これが大饗石の堆積の近似値となる。

なお,大饗石の3Dファイルから算出された体積のうち最大値は,ほぼ53㎥であった。これは,3D点群PLYファイルに対してCloudCompareのTools >Volume > Compute 2.5D volumeを実行することによって得られたもので,大饗石の最低標高値の水平面から大饗石表面までの体積になっている。最低値は,ほぼ35㎥であった。点群系のPLYファイルをメッシュ化してメッシュの欠陥を埋めたエンティティーにCloudCompareのEdit > Mesh > Measure Volumeを実行した結果や,Blenderにメッシュ系のUSDZを取り込んで,OBJファイルに変換してMeshLabで穴埋め処理したエンティティーをBlenderのadd-onを使って求めた結果と一致している。この計算過程は,LiDARスキャンオブジェクトの底を塞ぐ[i],や,Blenderでusdzファイルをobjファイルに変換して体積を求める[ii],などに示している。


[i] https://motochan.info/wp/2023/09/06/closing-the-bottom-hole-of-a-lidar-scanned-object/

[ii] https://motochan.info/wp/wp-admin/post.php?post=23826&action=edit

2 ChatGPTアドバイス: MeshLabやMeshmixerを使って3Dスキャンオブジェクトの底抜けを解消する???

 なお,ChatGPTの情報はmemoに保存したものである。ChatGPTそのものの表示をコピペすると多少問題が出るので,このmemoエディターを利用するのは有効だと感じている。このChatGPTの情報を使って,次章でトライしてみたいと思っている。

2.1 質問: 3D scanned objects inevitablly have a big hole at the bottom. Please show me how to close up it?

ChatGPT回答: 

When you 3D scan an object, it’s common to have holes or gaps in the mesh, especially at the bottom or other areas where the scanning process might not capture data accurately. Closing these holes and creating a watertight mesh is important for 3D printing or further digital modeling. Here’s a step-by-step guide to closing up holes in a 3D scanned mesh:

  • Use 3D Modeling Software:
  • Open the 3D scanning file in a 3D modeling software that allows mesh editing, such as Blender, Autodesk Meshmixer, or MeshLab.(全部オープンソース,Meshmixerは数日前にインストールした。3Dプリンター用の簡易版で使い易そうな印象だ)
  • Identify the Hole:
  • Identify the hole or gaps in the mesh that need to be closed. You can usually visualize these areas by rotating and inspecting the model in the software.
  • Select the Hole:
  • Use the selection tools in the software to select the area around the hole. In most programs, you can click and drag to select vertices, edges, or faces.(MeshLabにこういう機能が欲しいと思っていたがこの手法などにアクセスできていない)
  • Fill the Hole:
  • Once you’ve selected the hole, use the software’s mesh editing tools to fill the hole. This may be called “Fill Hole” or “Bridge Edge Loops” in different software. The tool will automatically generate new geometry to close the gap.
  • Adjust and Smooth:
  • After filling the hole, you may need to adjust the new geometry to match the surrounding surface. Use tools like sculpting, smoothing, or vertex manipulation to refine the area and make it seamless.
  • Check for Watertightness:
  • Ensure the mesh is watertight by using the software’s tools to check for holes, leaks, or non-manifold geometry. This ensures there are no remaining gaps in the mesh.
  • Save the Edited Mesh:
  • Save the edited mesh as a new file to preserve the changes without altering the original scanned data.
  • Export for Further Use:
  • If you intend to use the mesh for 3D printing or other purposes, export the edited and closed mesh in a suitable file format such as STL or OBJ.
  • Validate with 3D Printing Software:
  • If you plan to 3D print the model, import the closed mesh into 3D printing software to confirm that it’s now watertight and ready for printing.

Remember, the exact steps and tools you use may vary based on the 3D modeling software you’re using, but the general process remains similar. Additionally, practice and experimentation will help you become proficient in closing holes and editing 3D scanned meshes effectively.

Regenerate(これをクリックすることで,同じ質問で,どうも別の回答を求めることができるようだ)

流れは理解できる。それでは,Autodesk Meshmixerでどうすればいいのか,次に聞いてみた。

2.2 User 質問: As you know that 3D scanned objects have big holes in the meshes. Please show me how to mend them using Autodesk Meshmixer.

ChatGPT回答:

Certainly! Autodesk Meshmixer is a powerful tool for working with 3D meshes, including repairing holes. Follow these steps to mend holes in 3D scanned objects using Autodesk Meshmixer:

 ってなことで続くのであるが,木枯らしが吹いていた。前述のように,ChatGPTを本日初めて使いー” Do you calculate the volume of a 3D mesh obj file?”ーって質問すると,多少長いが示唆に富む回答があった,と書いていたがすでにぼくの頭の中にその世界があったから,ぼくが反応できたのであって,ChatGPTを使うことで,新たな世界が展開する訳ではない。ChatGPTに具体的な質問をすると,一応返ってくるのであるが,どうでもいい内容で,実際のプロセスを示してくれない。これは,アプリのユーザーマニュアルが役に立たない現象と似ているかも知れない。ChatGPTはこういった分野では使えない。自らの論文の英語チェックには,役立つのではと,今だ期待をしはしている。

以上,Sep. 22, 2023記。




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記。 

 




LiDARスキャンオブジェクトの底を塞ぐ closing the bottom hole of a LiDAR scanned object

はじめに

 iPhone 12 ProのLiDARで3DスキャンしてPLY, OBJ, FBXファイルで出力して, メッシュファイルを使って体積を求めるべく,CloudCompareで開いて,Edit > Mesh > Measure Volumeを実行すると,計算値が出るが,必ず,”The above volume might be invalid (mesh has holes)”のメッセージが現れる。

 これをぼくは作成した3Dスキャン像に隙間や穴ができているためだと考えて,実際埋める作業をしてきた。実際埋まるのであるが,相変わらずこのinvalidメッセージが出る。MeshLabでの作業を学んでいて,昨晩,やっと気付いたのである。オブジェクトの下が抜けているのである。オブジェクトが載る床や地面に「接する」底はスキャンできない。これまでの3Dスキャン像は全部,底抜けである。この底抜けのために,”The above volume might be invalid (mesh has holes)”のメッセージが現れていたのである。

 次の表1のように,メッシュエンティティに対するCloudCompareの体積の計算結果は,実測値に極めて近い結果となっている。とはいえ,計算結果に付属して,invalidメッセージが出るのである。この原因が,3Dスキャン像の底抜けが原因であったのである。メッセージの理由がわかったし,正確な体積値が得られるので,まあ,これで良しとしてもいいが,底抜けが解消されたらこのメッセージが出なくなることを確かめたい。そのために,このページをこれから作成したいと思う。

表1 メッシュエンティティーのCloudCompareの体積計算結果と実測値の比較

1 大饗石周辺のライダー測量

 次のページに大饗石について示している。
A 比沼の真名井(京都府京丹後市峰山町久次)の大饗石
B 元伊勢大饗石のLiDAR測量

2 「6 大饗石の体積を求める3: 点群欠損部の解消」に係わって

 CloudCompareでの解析のために,点群PLYファイルを使って,分析を進めてきた。現場での3Dスキャンが満足の行くものでなかったこともあって,ポリゴンの欠落などがあったので,それを解消すべく,上記Bのウェブページの「6 大饗石の体積を求める3: 点群欠損部の解消」に記した過程を実行した。体積計算値の信頼度が不確かなので,ウェブページ
C 身近な直方体の体積をiPhone 12 Pro+ LiDAR写真測量で求める
も新たに作成した。ここで述べる内容を含む報告を,現在,関西大学文学論集(Vol. 73, Nos. 1 & 2「合併号」, 3)に作成中で,その作成過程で,本ウェブページの「はじめに」に示した表1の結果を得ることができた。

 正確な値は,点群系のPLYファイルをメッシュ化してメッシュの欠陥を埋めたエンティティーか,メッシュ系のOBJなどをMeshLabで穴埋め処理したエンティティーに,Edit > Mesh > Measure Volumeを実行することで,得ることができる。

図1 点群系PLYファイルの3D像 onlyOoaeishi4.bin

大饗石だけのオブジェクトを抉りだした作業で得たのは点群系のPLYファイルなので,それをメッシュ化したエンティティーについての処理過程を示したいと思う。なお,メッシュ化は,Mesh\Delaunay 2.5D (XY plane) のコマンドで実行できる。このリンクはCloudCompareのマニュアルである。次にコピペする。

 図1では,斜面に載る大饗石を下方方面から上方面に眺めたものである。右手の垂直壁は日陰側で,杉が接して生えていて,LiDAR測量がこの裏の日向側からすると,撮影密度も多少は小さかったかも知れない。この点が後述するメッシュファイルが生まれた原因であったことは間違いない。

Menu

This tool is accessible via the ‘Edit > Mesh > Delaunay 2.5D (XY plane)’ menu.

Description

Computes a Delaunay 2D1/2 triangulation on a point cloud.

The point cloud is simply projected in 2D on the (XY) plane. Then the corresponding 2D points are triangulated and the mesh structure is applied to the 3D points.

By default the 2D Delaunay triangulation is done on the cloud convex hull. Therefore CloudCompare will ask the user to specify a maximum length for the triangle edges. This allows to remove the biggest triangles (generally on the boundary) that are not necessarily meaningful. If this value is left to zero, then all the triangles output by the Delaunay triangulation will be kept.

This works very well with rather flat clouds and properly oriented (i.e. with the Z dimension as the vertical one). If the point cloud is not properly oriented but is still rather flat in a direction, you should consider using the other version of this method Delaunay 2D (best LS plane).

Note: for 3D triangulation, refer to the qPoissonRecon plugin.

 ここに記述されている内容であれば,Delaunay 2.5D (XY plane) を実行することに問題はない。”specify a maximum length for the triangle edges” が理解できないので,デフォルトで実行した。これ自体,問題はないはずではある。

3 CloudCompareからMeshLabへ

 さて,表3では,二つの直方体で,一つ(段ボール3箱)は点群PLYを3Dメッシュ化したエンティティに対して体積計算を実施した。もう一つ(柱状石碑)は元々のファイル自体,OBJファイルにMeshLabで「穴」埋め作業を実施している。その結果,高い正確度を得ることができた。

 この大饗石の場合は点群PLYを大饗石だけ刳り抜いたものである。これ自体に時間がかかった。そして,3Dメッシュ化したエンティティーに対して体積計算を実施した。その結果が35㎥であった。これが体積の真値を示す筈である。このメッシュ化したエンティティーを使って,底抜け部分を塞ぐ作業をしてみたいと思って,昨日,実行してその過程を63枚のスクリーンショットで記録したのであるが,土台の穴埋めには今だ成功していない。

 今日はその続きをしようとしたが,
MeshLabによる、3次元測定データの穴埋め 2014-05-28
に巡りあった。筑波大の三谷さんのウェブページである。

 この観点を使って,まずは始めたいと思う。ただ,ここには入力ファイルの形式が示されていない。特に記述が無いということは,メッシュファイルである。これまでの体験を通じて,どうもメッシュファイルは像を結ぶ上で,スキャン対象の3Dオブジェクト像が変形してしまう可能性が高いようだ。

 そこで,大饗石の点群PLYファイルを呼び出せばいいはずだが,CloudCompareで大饗石だけ抉りだした結果はCloudCompareのbinファイルになっている。
 weblio辞書では,3Dファイル形式がレガシーと現行の2種類に分類され,PLY (ファイル形式)は,レガシーにのみ掲載され,Wavefront OBJ形式(.obj)とともに配置されている。ウィキペディアの内容と同じだ。コピペされている。でウィキペディアはより詳しいが,そこに,
MeshLab – PLY形式と3Dメッシュ間の変換、処理、可視化のためのオープンソースのWindows、Mac OS XおよびLinuxアプリケーション
CloudCompare – PLYファイルを扱うための別のオープンソースアプリケーション
とあった。驚きだ。

 binファイルを読み込んでcloudエンティティを選んで,File > Save >。ファイルの種類を先に,PLY meshとする。エクステンションは,.ply,なのだけど,PLY meshとある。OaeishiOnlySep07_2023.plyという名で保存した。

2 次に,MeshLabを開いて,File > Import Mesh >,で,OaeishiOnlySep07_2023.ply,が読み込めた。そうなんだなあ。

CloudCompareでは, VisableだけでなくNormalsにも✓した画像に似ている。

4 Poisson surface reconstructinoを使ったが

 前記のMeshLabによる、3次元測定データの穴埋め 2014-05-28
を実行しよう。これは,Poisson surface reconstruction に基づいている。操作情報は次の記述だけ。
「このような場合は、メッシュ操作で穴を埋めようとするのはほとんど無理なので、面の情報を破棄して、点群(法線情報を含む)からのメッシュ再構成をしてしまったほうがよいです。そこで、MeshLabに備わっている [Filters]の [Remeshing…]-[Surface Reconstruction: Poisson]を使ってみました。(オプションの Octree Depth は 8 に設定しました)」

図2 Surface Reconstruction: Screened Poisson

 このコマンドは,MeshLabのSurface Reconstruction Screened Poissonであり,これには,前述のKazhdan, M et al.のペーパーが引用されている。このパネルのHelpを参照した(図2)。

上記ウェブページではOctree Depth=8とだけあるが,他のパラメータも重要だ。現在のMeshLab 2022.02では,次のReconstruction Depthのようである。

Helpのオプション項目:

Merge all visible layers:デフォルトでは✓なしで,ママ。
Reconstruction Depth: デフォルト 8のママ。
Minimum Number of Samples: できるだけスムーズにするには高い値の方がいいようだ。デフォルトは1.5であるが,不確かだが10としよう。体積を求めるにはよりスムーズにした方がいいと思うからである。
Interpolation Weight: この値をゼロにすると,original (unscreened) Poisson Reconstructionになってしまう。このパネルを実行する意味が無くなると言って良いと思う。デフォルトは4で,4のママ。
Confidence Flag: デフォルトは✓なし。この場合,すべてのnormals法線はこの操作の前のunit-length(単位長)に揃えられる。デフォルトのママ。
Pre-Clean: デフォルトは✓なし。この場合,vertices (vertex) 関係の整理が実行されない。実行した方がいいと思うので,✓。
Number Thread: このreconstruction algorism 再建アルゴリズムの最大実行回数の意味であるがどういう役目を果たすのか,わからない。デフォルト 8のママ。

図3 Poisson meshの結果

 図3のように,実行した結果はスカートを穿いたようになった。底は抜けたままだ。残念っ。新しいレイヤーができただけなので,右クリックで “delete current mesh” を実行すれば削除できそうなので,一応,キープ。全くデフォルトで実行したのだが,その結果の違いがわからなかった。二つとも削除した。底抜けを埋めるのは全く無理。

5 Filters / Remeshing, Simplification and Reconstruction/ Close Holes

図4 Current mesh does not have any faces

さて,現状は,前日の出口無しに戻ってしまった。先ほどMeshLabに取り込んだPLYファイルを操作する。Filters / Remeshing, Simplification and Reconstruction/ Close Holes を実行すると,PreConditions’ Failureとして,Current mesh does not have any faces. とのメッセージだ。

新たなファイルだから当然だなあ。

 この点群PLYファイルに,Filters / Normals, Curvatures and Orientation / Compute normals for point sets, で点群の法線を生成する。Neighbour numをデフォルトの10で。Helpを見ると,Smooth Iteration欄がある。これを実行するかどうかで,像がスムーズになるかどうがわかるかも。

図5 Filters / Normals, Curvatures and Orientation / Compute normals for point sets

 実行したが全く変化なし。faceを作ることができない。CloudCompareでは問題なくできたのにMeshLabではできないなあ。仕方が無いのでSep05のものを使う。つまり,これはCloudCompareでPLY点群エンティティをメッシュ化したものである。

6 点群データを減らす

 点群は現在,Vertices: 615, 237, Faces: 1,230,423である。底抜けを埋めるのにポリゴン数を減らす必要があると考えた。
 Filters / Sampling / Clustered Vertex Sampling を実行する。Cell sizeの設定で,左の world unitを触ると,右のpercent値は連動して変化する。粗いモデルが欲しいのでworld unit値を大きくすれば良いと考えた(eg. 図6)。Applyを繰り返してCluste samples (Numbers)がどんどん作成されるがなかなか難しい。結局,自動で表示されていたディフォルトのworld unit値(図7)が一番よかった。No. 17を示したい。下部にはの情報がしめされている。Cluster samples (17)のVertices: 8,766 (624,003), Faces 0 (1,230,423)とある。( )内は処理前のものだ。

図6 world unit = 0.5

図7 world unit = 0.0965 デフォルト値

 で,これから,図7の点群に対して,新たにメッシュを作成することになる。Cluster samples (17)を選択して,Filters / Remeshing, Simplification and Reconstruction / Surface Reconstruction: Screened Poisson を選択する。Reconstruction Depth (15)> 10,Minimum Number of Samples (8) > 6で設定。応答なしで,タブの✖️をプッシュすると,MeshLab終了か待つかが出て見ている時に,出てきた。やっぱり,大きなスカートを穿いてる。図8はwireframe表示をしたものである。
 この図8には大饗石の3面,上面(大饗面),日陰の側面,日向の前面(斜面の低い方)である。図1には,ほぼ同じ面が見える。日陰の側面の壁の高さがかなり低いのが注目されるだろう。日陰の側面の,壁中部と下部は壁と認識されていない。つまり,大饗石のオブジェクトとはかなり異なったものとなっているのである。図7の点群は図1の点群PLY像と対応していて,大饗石を正しく表現しているが,メッシュ化された像は大饗石と異なる像を結んでいるのである。
 つまり,このことが点群で得られた体積53.4または53.9㎥と,メッシュ化されたエンティティーから得られた体積35.3㎥との,違いの根拠となっているのである。

図8 wireframeで表示

 底抜けの解消を図る過程で,思いも寄らない結果を得ることができた。
 なお,この過程で得られたレイヤーすべてを保存するには,図9のように,一応,レイヤーの表示をして,Save View State,と,Save All Files,に✓を入れた方が良いだろう。mlpは,MeshLab特有のbinファイルである。

図9 MeshLab mlpファイルの保存

以上,Sep. 7, 2023記。

7 メッシュファイルの限界だなあ。

 今日,昨晩の発見をもとに,種々試行して,メッシュよりも点群の方が信頼できることがわかった。点群ファイルを点群対応の計算式で計算すれば,まあそれなりの解を得ることができる。自由度がありすぎるのが,欠点ではある。

 で, 点群PLYをメッシュ化した時には,そのPLYにもともと内在していたものが出てくるようだ。それが,大饗石の体積の計算結果の点群計算とメッシュ計算に出てきてしまったのである。MeshLabで点群の編集をいくらしても,見かけ上,すごく良くても,問題点は内在していて,メッシュ化するともともとの歪んだ3D像が出てしまう。

 前章で,「このことが点群で得られた体積53.4または53.9㎥と,メッシュ化されたエンティティーから得られた体積35.3㎥との,違いの根拠となっているのである」を,本日攻めきった。

 MeshLabで,大饗石⋯⋯⋯⋯⋯4.mlp,の,Poisson meshを選んで,File > export mesh,を実行する。デフォルトと✓が入るところは全部✓(図10)。

図10 ポアッソンメッシュファイルをエキスポートする。

図11 PLY File Openパネル

 その結果,図10の次に,右下のコンソールに,Saved Mesh C:/Users/moto/Documents/win_moto_documents/win_3d_scan/大饗石metascan_LiDAR/Poisson mesh ply in 31 msec,と出る。
 それをCloudCompareに取り込む。図11のように,なんと,メッシュ出力したつもりだが,PLYになっている。
 ここでは省略しているが,CloudCompareのDB Treeでは,meshアイコンが表示されている。

図12 日向の側面

図13 日陰の側面

図14 裾をまずは切り取ったところ top view

 図12は日向の側面,図13は日陰の側面。segmentationは一気にはできない。図14では1回で切り取ったが,オーバーハングしているところもあるので,topビューで1回でsegmentationをしようとしたのはまずいと結果を廃棄した。
 大雑把から少しずつ細かく実施して行った。図24が汚いけど,仮の完成。これで体積計算してみたら,図27のように,29.6㎥。削り過ぎた。途中の段階で体積計算を繰り返していたらよかった。とにかく,35㎥と近くて,meshモデルの計算結果はポアッソンモデルに対応していることは明らかである。

 図28の,昨日実行したCluster samples (17)のcloudにはモデルが綺麗なので,これをメッシュ化したら,図29のようにやっぱり汚くなった。図28のようなモデルであっても,歪みは内在しているのである。点群モデルであってもそういった歪みを内在している。ソフト上での処理では解決できないのである。点群モデルを点群モデル用の計算アルゴリズムでやれば,まともな結果が現れるのである。図30に示すが,V=52.912(Matching cells 58.6%)であった。
 元の点群にはノイズが多く,この図30のモデルの結果を優先したい。

図15 スカートが取れて元の日陰の側面が

図16 余裕をもってポリゴンで囲む

図17 segment in

図18 confirmしてMesh.partだけ表示

図19 ポリゴンで削除対象を選択

図20 segment out

図21 回転して

図22 裏返して

図23 ポリゴンで選んで

図24 仮の完成だが

図25 最初の削除点群とともに

図26 objファイルとして保存

図27 meshの体積計算結果 29.6㎥

図28 昨日実行したCluster samples (17)のcloudを

図29 メッシュ化したらまた大きな歪みが V=35.0155

図30 点群で計算したらV=52.912 (Matching cells 58.6%)

以上,Sep. 8, 2023記。

8 柱状石碑メッシュ系OBJファイルで底抜けを塞ぐ

 柱状石碑にトライして,成功した。3Dメッシュモデルまたは3Dマッピングには必ず不要な空隙ができる。簡単にここでは穴と称するが,これを埋める操作は必須である。3Dスキャニングはオブジェクトの表面しか捉えることができない。オブジェクトは重力故に,その置かれた,または分布する場の3D情報が欠落する。その大きな穴を塞ぐ必要性は,特に,3Dプリンター出力の際に生じる場合が多いだろう。
 まずは,成功した実例を述べるが,結果的に言えば,塞ぐことでオブジェクトの3D像は歪み,体積を求めるには不都合となることがわかった。体積(や表面積)を求めるには,この3D像の底抜けは塞がない方が良い。この結論は体積(や表面積)を求めるのに大変都合が良い。穴埋め作業にはかなりの時間を割く必要があるからである。この実例を一つ,ここに紹介する。

 MeshLabに関する穴埋め作業が次のプレゼン資料に整理されている。
Simple Mesh Editing by Marco Callieri et al. https://vcg.isti.cnr.it/corsi/G3D_InfoUma/Slides_2021/06_MESH_EDITING.pdf

 穴埋めには,次の三つのステップ Cleaning掃除, Fixing修理, Remeshing再メッシュ化がある。このツールとして最も簡便で多用されているのは,
Remeshing, simplification and reconstruction->Close Holes
パラメータには次の4点がある。(MeshLab でメッシュの穴埋めを行なう)
Max size to be closed: ふさぐ穴の境界を構成するエッジの最大数。このエッジ数より小さい穴が処理対象。
Close holes with selected faces: 処理対象を選択されている面に限定するかどうか。
Select the newly created faces: 新たに追加された面を選択状態にするかどうか。処理前の選択面の選択は解除される。
Prevent creation of selfIntersecting faces: なるべく既存面と交差しないように面を追加するかどうか。

他に参考になるページは: MeshLabでゴミ削除後の3Dデータの穴を埋める方法

で,これが功を奏さない場合,次の文献に基づくコマンドである。
Screened Poisson Surface Reconstruction by MICHAEL KAZHDAN and HUGUES HOPPE
Filters > Remeshiing, Simplication, and Reconstruction > Surface Reconstruction Screened Poisson

Poisson Surface Reconstructions Experiments
Procedure:

Open the point cloud file in Meshlab.
Clean the point cloud by removing any outliers and irrelevant data.It also reudces the number of points to be processed.
Compute Vertex Normals. Go to Filters->Normals,Curvatures and Orientation->Compute Normals for point sets.We have used default meshlab parameters for computing the normals.
Apply Poisson Reconstruction. Go to Filters->Remeshing,Simplification and Reconstruction->Surface Reconstruction:Poisson. To obtain good results, you may have to experiment with giving different octree depth value.Normal direction may need to be flipped for orienting them outwards.(Filters->Normals,Curvatures and Orientation->Flip Faces)
To add color, Go to Filters->Sampling->Attribute Transfer.Select color transfer check box and source and destination files appropriately for mapping.

以上,Sep. 10, 2023

8.1  まずはポアソン面復元

 MeshLabの分析対象ファイル名は,英数字にしないと行けない。CloudCompareは2バイト文字でも問題は無いが。ただ,経験上,path過程が2バイト文字であっても問題はない。

図31, 32では,ポアソン再建コマンドを選ぶ。

図31 Filters > Remeshiing, Simplication, and Reconstruction > Surface Reconstruction Screened Poisson

図32のパラメータ指定に注目。最下段のPre-Cleanに✓が入っていない。

図32 Surface Reconstruction: Screened Poisson

図32, 33はエラーとエラーに対処。

図33 Failure of filter

図34 Pre-Cleanに✓

図35, 36: 地面にスカートができて,底抜けは相変わらず。

図35 地面にスカートが

図36 裏から見ると相変わらず底抜け

8.2  Close Hole

 Filters > Remeshing, Simplification and Reconstruction > Close Hole これを実行すると,manifoldエラーが出るので,前もって,
Filters > Cleaning and Repairing > Repair non Manifold Edges (デフォルトのRemove Facesのまま)(図37),Applyしたが,実行結果はゼロだった。つまり,不要だ。これはポアッソン再建実行後のためであろう。
 そして,Filters > Remeshing, Simplification and Reconstruction > Close Holeで,サイズを100に設定して(図38),Apply。実行結果はゼロ。これも,ポアッソン再建実行後のためであろう。サイズを10,000 に設定して(図39), Apply。

図37 Filters > Cleaning and Repairing > Repair non Manifold Edges (デフォルトのRemove Facesのまま)

図38 Filters > Remeshing, Simplification and Reconstruction > Close Hole 

図39 size=10,000で

 その結果,図40に合わせて,consoleでは,Closed 1 holes and added 117 new face,というメッセージ。柱状石碑メッシュの底の半分ほどが塞がっている。図41 に見えるように,sizeを 20,000 にして,Prevent creation of selfintersecting facesの✓は外してみた。図42のように底抜けが解消されている。

図40 consoleでは,Closed 1 holes and added 117 new face

図41 sizeを20000にして,
Prevent creation of selfintersecting facesの✓は外してみた

図42 底抜けは解消

 MeshLabでPoisson meshレイヤーを選んで,objファイルとしてエキスポートした。図43では,✓可能な3カ所を空欄にしたために,出力したobjファイルはあってもCloudCompareでは表示できなかった。図43に新たに赤い✓を入れているが,これをすることでCloudCompareで見ることができるようになる。図44はCloudCompareで見たものである。柱状石碑の底は,図43ではフラットであるが,CloudCompareでの表示,図44では丸くなっている。ファイル名は,/Poisson mesh.ply/ になっている。

図43 Poisson meshだけobj出力

図44 CloudCompareに取り込む

 図44の左ペーン下部のMeshウィンドウでは,Wireframeに✓を入れていない。

8.3  CloudCompareを使ってメッシュオブジェクトの体積計算

 図45のオブジェクトは,柱状石碑だけでなく,その周辺の小石散布面も含む。このオブジェクトの体積は,Edit > Mesh > Measure Volume,から,V=0.119938㎥と出た。底抜けがないので,エラーメッセージが出ない。まさに,これを待っていた。これまでのinvalidメッセージから回避できたのである。この底抜けが原因であることが,まあ,明らかになった。うれぴい。
 図46はこのオブジェクトを,柱状石碑とこの周辺の小石散布面に分割すべく,ポリゴン(赤い枠線)で区画した。

図45 全体に対して V= 0.119938 エラーメッセージは出ていない。

図46 柱状石碑の部分とそれ以外を分割するためにポリゴンで

 求めたいオブジェクト Mesh.part (図47)と,削除対象のオブジェクト Mesh.remaining(図48)を分割して,それぞれの体積を求めた。前者はV=0.0518695であるが,これは最初に提示した表1の実測値 0.0538に比べると,0.0519/0.0538 = 0.965で,元々の点群PLYを3Dメッシュ化したものの比1.006よりも真値からより離れていることがわかる。
 つまり,体積(や面積)を求める場合,点群やメッシュの小さな綻びを修復して,Edit > Mesh > Measure Volume (or Surface)を実行する手法が最も妥当の方法と言える。”The above volume might be invalid (mesh has holes)”のメッセージは,3Dスキャンオブジェクトに否応無く現れる底抜けの存在によるものであり,この意味で,体積(や面積)を求める際には,全く問題のないメッセージであることがわかるのである。

図47 segment-in,confirmして Mesh.partを表示して, この体積計算。 V=0.0518695

図48 Mesh.remaining V=0.0626984

 なお,CloudCompareやMeshLabでの作業結果を保存する場合,作業しているファイルが格納されているフォルダがデフォルトの場として用意されず,前回の作業pathが残っており,他のアプリ使用時の感覚で,保存作業を進めると,ウィンドウズPC内のエクスプローラーのファイル分布に混乱が生じる。
 元々のファイルがわからなくなった場合,コンソールには作業内容が秒単位で記録されているので,大変面倒なのであるが,机上またはデスクトップ上のテキストエディターに時刻とともに簡便な作業記録をした方がいいかも知れない。
 いまぼくが触っているファイルの呼び出し記録を次にメモしておく。
[15:08:18][I/O] File ‘C:/Users/moto/Documents/win_moto_documents/win_3d_scan/直方体撮影ファイル名再構成forCloudCompare/3D神武天皇遙拝所碑/jimmuhi230126scaniverse_obj/Poisson mesh.ply/’ loaded successfully

 図49では,先にMesh_remaining.objを保存し,次にMesh_part.objを保存しようとしている。保存すると,図50のコンソールにその所作の記録が残る。図51ではその結果をエクスプローラーで確かめている。

図49 Mesh.partを保存

図50 consoleに保存成功が示されている

図51 Explorerで保存されていることを確認

8.4  MeshLabで空隙を塞ぐ

 CloudCompareで分割した,mesh.partとmesh.remainingを,MeshLabで開いて,分割した際の大きな穴を塞ごうとした。
 mesh.remainingにあたる柱状石碑の周辺をまずは,トライした。

 まずは,図52のように,Filters > Remeshing, Simplification and Reconstruction > Close Holeで,Max size to be closed: 10,000,他は全✓。結果は,Closed 0 holes and added 0 new faces。1,000,000も実行,これも駄目。原因はPreventの✓を外さなかったためかも知れないが。

図52 Close holes Max size to be closed: 10,000 他は全✓。

 ポアッソンに期待。図53のパネル設定。

図53 Poisson Reconstruction Depth 12 Adaptive Octree 5 Minimum Number of Samples 10 Pre-Clean ✓。

 図54のように,穴が埋まった。

図54 塞がったようううう。

 図55のように,Poisson meshを選んで,これだけをobjファイルとしてエキスポート。

図55 171 それから個別に 全部選んで export

 さて,Mesh.partについては,図56のようにポアッソン再建のパラメータを入れたが,図57のように裳裾のようなものが生成され,底抜けは解消されない。図42の成功は,柱状石碑の回りの平たい砂利面が功を奏したようだ。図56のような切り口では図57のようなスカートになってしまう。これは大饗石の場合と同じだ。

図56 さて,Mesh.partだあ。

図57 できあがったもの やはり,スカートだ。 一応,全部保存。

 図54のように穴が解消しても体積値は変わらない。要するに,体積などを求めるには,穴を塞ぐという方向性は徒労に過ぎないのだ。

以上,0:26,Sep. 12, 2023記。

8.5  体積計算に最も適したファイル形式は
 本日Sep. 12, 2023の大饗石3Dスキャンファイルに係わる試行錯誤を通じて,点群PLYファイルが最も優れたものであることが明らかになった。使用アプリは,3Dファイルを取り扱うオープンソースのうち,最も普及しているCloudCompareとMeshLabである。
 最もポピュラーな3Dスキャンファイルの形式は,繰り返し述べているように,点群系のPLY,メッシュ系のFBXとOBJである。今日の両アプリでのFBXファイルのやり取りの過程で,FBXは少なくとも体積計算には適していないことがわかった。
 OBJとPLYは,場合によっては,テキストでの編集が可能で,二つのファイル形式の共通点も多い。この二つがどうもぼくにとっては最適なものらしい。点群はPLY,MeshLabはOBJである。これまでフラフラしていたので,ファイル形式を絞ることができて,勝手に,喜んでいる。
 以下,今日実施した一部をここに記したいと思う。

 CloudCompareで,FBXファイルを開いて,図58には日向側,図59には日陰側を示している。大饗石だけを分割した結果であるが,メッシュ系の場合,faceまたはwireframeの関係だろうが,分割作業の切り口が比較的スムーズでは無い。しかもPLYファイルに比べて欠落部分が大きい。スキャンで出来上がった3Dオブジェクトをsegmentationすると,切り口が粗くなってしまうようだ。元伊勢大饗石のLiDAR測量 を改めて見たのであるが,確かに間違いない。

図58 FBXファイルの日向側の壁面 ボロボロ

図59 FBX 日陰側の方がいいかもなあ。

以上,Sep. 12, 2023記。これから夜の散歩だ。23:52,帰宅。

大饗石のスキャニングファイル出力はPLY, XYZ, FBXに限定し