剛体シミュレーションで使用するために、(必ずしも凸状ではない) オブジェクトの境界を表す三角形メッシュが与えられ、内部の密度が一定であると仮定して、質量と慣性テンソル (慣性モーメント) を計算したいと考えています。
5 に答える
トリメッシュが閉じていると仮定すると(凸面であるかどうかにかかわらず) 方法があります!
dmckee が指摘しているように、一般的なアプローチは、各表面三角形から四面体を構築し、次に明白な数学を適用して、各テットからの質量とモーメントの寄与を合計することです。体の表面にくぼみがあり、基準点が何であれ、内部ポケットを作るときにトリックが発生します.
したがって、開始するには、基準点を選択します (モデル座標の原点で問題ありません)。ボディの内側にある必要さえありません。すべての三角形について、その三角形の 3 つの点を基準点に接続して、四面体を形成します。トリックは次のとおりです。三角形の表面法線を使用して、三角形が基準点に向かっているのか、それとも離れているのかを判断します (これは、法線のドット積の符号と、三角形)。三角形が基準点とは反対側を向いている場合、その質量とモーメントを通常どおりに処理しますが、基準点の方を向いている場合 (基準点とソリッド ボディの間に空きスペースがあることを示唆しています)、そのテトの結果を無効にします。 .
これが効果的に行うことは、ボリュームのチャンクを過剰にカウントし、それらの領域がソリッド ボディの一部ではないことが示されたら修正することです。体に泡だらけのフランジとグロテスクな折り目がたくさんある場合 (そのイメージを理解しましたか?)、ボリュームの特定の部分が多額の係数で過大にカウントされる可能性がありますが、メッシュが閉まっている。このように作業すると、オブジェクト内の空間の内部バブルを処理することもできます (法線が正しく設定されていると仮定します)。その上、各三角形は独立して処理できるため、自由に並列化できます。楽しみ!
後付け: 内積がゼロまたはゼロに近い値を与えるとどうなるか疑問に思うかもしれません。これは、三角形の面が平行である場合 (法線が垂直である場合) にのみ発生し、基準点への方向を実行します。これは、面積が小さいかゼロの縮退テットでのみ発生します。つまり、tet の貢献を加算または減算する決定は、tet が何らかの貢献をするつもりがない場合にのみ疑わしいということです。
これについては、D. Eberly の著書「Game Physics, Second Edition」で説明されています。2.5.5 章とサンプル コードはオンラインで入手できます。(見つけたばかりで、まだ試していません。)
また、式が機能するために多面体が凸面である必要はなく、単純でなければならないことに注意してください。
vtkMassPropertiesを見てみましょう。 これは、ボリュームを囲むサーフェスを考えると、これを計算するためのかなり堅牢なアルゴリズムです。
多面体が複雑な場合は、多次元積分によく使用されるモンテカルロ積分の使用を検討してください。囲んでいる超立方体が必要になり、特定の点が多面体の内側にあるか外側にあるかをテストできる必要があります。モンテカルロ積分は遅いので、辛抱強く待つ必要があります。
いつものようにウィキペディアから始めて、さらに読むために外部リンクのページをたどってください。
(モンテカルロ積分に慣れていない人のために、ここで質量を計算する方法を説明します。含まれている超立方体でポイントを選択します。point_total
カウンターに追加します。それは多面体にありますか? はいの場合、point_internal
カウンターに追加します。これをたくさん行います (収束を参照)。と誤差範囲の推定。) 次に、
mass_polyhedron/mass_hypercube \approx points_internal/points_total
.
慣性モーメントの場合、基準軸までのポイントの距離の 2 乗で各カウントに重みを付けます。
注意が必要な部分は、点が多面体の内側にあるか外側にあるかをテストすることです。そのための計算幾何学アルゴリズムがあると確信しています。