iPhone LiDAR×Blenderで体積算出しようぜ!

iPhone LiDAR×Blenderで体積算出しようぜ!

タイトルは、iOS LiDARといえばiwama氏の超有用note記事「iPhone LiDAR × CloudCompareで体積算出しようぜ!」へのリスペクトをこめて。

note.com

CloudCompareは使い慣れなくてちょっと心の壁があるので、普段使いのBlenderではできないかな?  と思ってやってみたら、なかなか簡単に良い感じにできたので、同じ道をたどる人のためここに手順を残します。

基本的にはiwama氏のプロセスをBlenderで再現するというアプローチで書いてみます。

元noteは点群データを使っていましたが、ここではメッシュデータを使います。スキャンデータをOBJかFBXで書き出しておきましょう。

余談ですが、つい最近リリースされたBlender 4.1では、ファイルをビューポートにドラッグ&ドロップでモデルインポートできるようになりました、それはずっと欲しかったやつ…!

wiki.blender.jp

メッシュに欠損がある場合はリメッシュで埋める

上部とか下部にデータの欠損がある場合は、穴を埋める必要がありますが、その検索ワードで出て来るクリーンアップの「穴をフィル」コマンドだと、形状によってはうまく行かない場合が多々あります。

そんなときに使えるやっつけ機能は、モディファイヤー→生成→リメッシュ→シャープ

「オクツリー深度」を上げていくとメッシュが細かくなっていくので、必要なディティールが出る辺りまで適宜調整してみてください。

うん、良さそうです。

Anthropic Claude3にお願いしてPythonスクリプトで体積を算出する

※これを書きながらもっと簡単な方法を見つけたので、体積計算したいだけの人は次項に進んでください。

ダメもとの気持ちで、GPT-4より賢いと話題のClaude3にお願いしてスクリプトを書いてもらいました。※このへんはGPT-4oリリース前に書いた文章です。

claude.ai


プロンプト

「Blender4のPythonで、選択したオブジェクトの体積を求めるスクリプトを書いてください。」

結果

はい、Blender 4のPythonで選択したオブジェクトの体積を求めるスクリプトを書きます。

import bpy
import bmesh

# 選択されたオブジェクトを取得
obj = bpy.context.active_object

# メッシュデータを取得
mesh = obj.data
bm = bmesh.new()
bm.from_mesh(mesh)

# 体積を計算
volume = bm.calc_volume()

# 結果を出力
print(f"選択されたオブジェクトの体積は {volume} です。")

# bmeshを破棄
bm.free()

このスクリプトでは、以下の手順で選択されたオブジェクトの体積を計算しています。

  1. bpy.context.active_objectで選択されているオブジェクトを取得します。
  2. オブジェクトのメッシュデータをobj.dataで取得します。
  3. bmeshモジュールを使って一時的なBMeshオブジェクトを作成し、メッシュデータをBMeshにコピーします。
  4. bm.calc_volume()メソッドで体積を計算します。
  5. 計算した体積の値を出力します。
  6. 最後にbm.free()でBMeshオブジェクトを破棄します。

このスクリプトを実行すると、選択されているオブジェクトの体積が出力されます。BMeshを使うことで、複雑な形状のオブジェクトでも正確な体積を計算できます。

ご不明な点がありましたら、お気軽にご質問ください。


もっと地道に細かく区切って体積計算しては足してくようなのが出てくると思っていましたが、メッシュをBMeshというのに変換することで一発で体積計算できるっぽいです、すごい!簡単!

標準アドオン「3D Print Toolbox」でできた

この記事を書きながら、「あ、そういえばBlenderの3Dプリントツールに体積計算機能があった気がするな?」と思い出して確認したら、ありました。

編集→プリファレンス→アドオン→検索ボックスに「print」→「3Dプリントツールボックス」を有効にして

モデルを選択して統計→「体積」ボタンを押すだけ。面積も出せます。

ちなみにアドオンのソースを確認してみたら、こちらもbm.calc_volume()を使っていました。 遠回りしたものの、理解度は上がったのでよし。

以上です!