世界を動かす技術を、日本語で。

発散定理による爆速ボリューム計算のユーモラスな手法 (2018)

概要

  • 三角形メッシュ による閉じた3D形状の 体積計算の高速アルゴリズム を解説
  • 発散定理 を利用し、表面積分に帰着
  • 各三角形ごとに 一定回数の演算 のみで計算可能
  • O(n) の計算量で、非常に高速
  • 実用性や既存研究との関係も簡潔に紹介

三角形メッシュの体積計算アルゴリズム

  • 入力は 単純閉曲面の三角形メッシュ
  • 体積Vは、領域R上の三重積分V=∭R1dVとして定義
  • 発散定理より、 体積=ベクトル場Fの発散の体積分=Fの表面積分
    • ここでF(x, y, z) = <x, 0, 0>を選択
    • このときdiv F = 1となる
  • よって体積Vは、メッシュ表面S上の積分に変換
    • V = ∬S F(x, y, z)・dS
  • メッシュは三角形T_iの集合で構成
    • 各三角形T_iの3頂点T_{i0}, T_{i1}, T_{i2}を用いる
    • Δ1 = T_{i1} - T_{i0}, Δ2 = T_{i2} - T_{i0}
  • 各三角形のパラメータ表示:r(u,v) = T_{i0} + uΔ1 + vΔ2 (0≤u, v, u+v≤1)
  • 面積要素はΔ1×Δ2(外積)で計算可能
  • 積分の簡略化により、各三角形について
    • V_i = (1/6) * (Δ1×Δ2)x * (T{i0x} + T_{i1x} + T_{i2x})
  • 総体積は全三角形で合計
    • V = (1/6) ∑{i=0}^{n-1} (Δ1×Δ2)x * (T{i0x} + T{i1x} + T_{i2x})

アルゴリズムの性能と特徴

  • 数値積分や微分不要、単純な加減乗算のみ
  • ループは三角形数nに対してO(n)
  • 各三角形あたり
    • 加算7回、乗算3回
    • 全体で加算8n-1回、乗算3n+1回(合計11n回の浮動小数点演算)
  • CPU性能のみでも非常に高速
    • 例:Raspberry Piで60fps動作時、約3000万三角形/フレーム処理可能

背景と関連研究

  • 発散定理の復習3Dグラフィックスへの応用 が動機
  • 同様のアルゴリズムはCha Zheng, Tsuhan Chenの論文(Efficient Feature Extraction for 2D/3D Objects in Mesh Representation)にも記載あり
  • 導出法は異なるが、 理論的裏付けと実用性 を再確認できる内容

まとめ

  • 三角形メッシュの体積計算 を発散定理で効率化
  • O(n)の高速アルゴリズム
  • 実装容易かつ高精度
  • 3Dグラフィックスや計算幾何分野での応用価値

Hackerたちの意見

こういう投稿大好き!シンプルで、早くて、AIなしで、新しいことを学べるから。

(2018)

メッシュから三角形を全部取ってきて、その三角形と平面上の投影との間にあるプリズムみたいな多面体の体積を計算するのと同じじゃない?それで、投影がある方向を向いてたらプラス、別の方向を向いてたらマイナスにするっていう。こういう式は基本的な幾何学に基づいてるよね。

90年代に調査や地図エンジニアリングのCADアプリでそんなことやったのを覚えてるよ。ドロネー三角形分割の後に、近似体積を計算するのは簡単だよね。でも、これはもっと一般的な解決策かも。

これを逆にして、発散定理の直感的な「証明」ができるか気になるな。

うん、これは著者が導いたものの本質だね(幾何学的な議論じゃなくて微積分を使ったけど、結果は驚くことに同じ)。2Dのアナロジーは理解しやすいよ:ポリゴンの面積を計算するには、各辺とそのx軸への投影で形成される台形の符号付き面積の合計を求める。右から左の台形の負の面積が、左から右の台形の余分な面積をちょうど打ち消すことが分かる(x軸の下にある辺の場合は、ちょうど「欠けている」面積を加えることになる)。

そうそう。同じような微積分のアイデアを使って、ある点でディラック質量の発散があって他の場所ではゼロのベクトル場について考えることもできるよ。そうすると、多面体がある点を含むかどうかを判断するために面で合計できる式が得られる。また、適切なベクトル場の場合、面がその点に対して作る立体角というシンプルな幾何学的解釈があるんだ。

それとその投影との間のプリズムのような多面体の体積を計算すること。ここでの重要なポイントは、この投影を明示的に計算する必要がないってことだね。

1994年の論文を思い出すなぁ、あのトラペゾイダルルールを再発明したやつ。

うん、アルゴリズムとその導出は基本的で、学部レベルの数学ができる人にはかなり明白だと思う。でも、もっと多くの人が数学を楽しんでるのを見るのは嬉しいね!

お腹が言ってるのは、素朴な式は三角形のピラミッドの体積を原点に向かって符号付きで足してるってこと。どうやらそれが導かれたみたい。これは、各辺の三角形の面積を足して2Dポリゴンの面積を計算する一般化だね。GISデータで地図のポリゴン面積を計算した数学キャンプで教わったよ。AIが出る前は数学の知識を得るのが難しかったけど、こんなに難しかったとは思わなかった。「メッシュをレンダリングして、そのレンダリングをサンプリングするのと同じ」という著者の言ってることは全然分からないな。

お腹が言うには、ナイーブな公式は三角錐の体積を原点に向けて符号付きで合計するってことだね。うん、それもいけるけど、ちょっと遅い公式だよ、sum(det(v1,v2,v3))/6。これは各三角形をyz平面に投影してできたプリズム+ピラミッドの形を合計してる感じだね。

Hacker Newsで議論の続きを見る