慣性テンソルの計算


10

少し複雑で長い質問ですが、認めますが、まだよく理解できていないので、できる限り説明していきます。

ショートバージョン:オブジェクトの形状に基づいて慣性テンソルを計算するための一般的なc ++ / physx式はありますか?

ロングバージョン: 物理学では、x、y、zの慣性テンソルを指定する必要があります。現在、それを行う方法は、質量に基づいた比率にすぎません。したがって、オブジェクトがX軸で長く、YとZで細く、質量が10000の場合、ZとYを7000に、Xを3000に設定します(これは正確ではありませんが、あくまでも参考です)。

これは比較的うまく機能しますが、最大の問題は、どこかに関節の不安定性がある場合、何が最もうまく機能するかを理解するまでテンソルで推測し続けなければならないことです。非常に大きな物理シミュレーションがあり、20以上のジョイントのうち1つが他のすべてのジョイントの安定性を失わせている場合、これは非常に時間がかかる可能性があります。

私が取り組んでいるのは、オブジェクトの境界ボックスを取り、うまくいけば比較的正確なテンソルを計算する関数です。私はhttp://en.wikipedia.org/wiki/List_of_moment_of_inertia_tensorsから数学の一部を取り、基本的に以下のようなローテーションで以下のように機能する関数を作成しました。

幅w、高さh、奥行きd、および質量mの直方体 ここに画像の説明を入力してください

または、次のように回転が端にある場合:

ここに画像の説明を入力してください ここに画像の説明を入力してください

したがって、これは私たちが行ってきた方法と同様の結果を私に与えるようですが、それが一般的な使用で機能することを確認せずにこの方法に切り替えたくありません。以下は、立方体と中央のピボットを含む最初の画像に基づく関数のコードです。

NxVec3 CalculateInertiaTensor( VisBoundingBox_cl boundingBox, float m )
{
    float width = boundingBox.GetSizeX();
    float height = boundingBox.GetSizeZ();
    float depth = boundingBox.GetSizeY();

    float xTensor = 0.083f * m*(height*height + depth*depth);
    float yTensor = 0.083f * m*(width*width + depth*depth);
    float zTensor = 0.083f * m*(width*width + height*height);

    return NxVec3(xTensor, yTensor, zTensor);
}

これが正しい方法であることを保証できません(最も正確な方法は、境界ボックスの代わりに実際の形状を使用することです)。慣性テンソルと数学にはあまり詳しくありませんが、数値を返すようです私たちが使用していたものとかなり似ています。これを行うより良い方法があるかどうか、ここにいる誰かが偶然知っていますか?


3
オブジェクトを四面体に分解できる場合は、テンソルの線形性と、四面体の慣性モーメントの基本式(たとえば、Wolfram Alphaでこれを見つけることができます)を使用して正確な計算を行うことができるはずですテンソル。バウンディングボックスメソッドに関する私の懸念は、オブジェクトが埋めるBBの量に実際に依存することです。たとえば、太い楕円と細長いらせんばねの違いを想像してみてください。
Steven Stadnicki

入力いただきありがとうございます。そして、あなたは正しいです。たとえば、「A」形のオブジェクトがあると、私の主な問題が出てきます。BBを使用すると、テンソルが正しく戻されません。私はあなたの情報をチェックします、ありがとう!
ムンゴイド2012

どういたしまして。これをより具体的に具体化したいのであれば、適切な回答を作成できるはずですが、それで十分です。
Steven Stadnicki

あなたが喜んでそうするなら、それは素晴らしいでしょう!私はしばらくこれを理解しようと努めてきましたが、私はまだこの領域で少し
ばかり

回答:


7

グリーンの定理を使用して体積積分を表面積分に変換することに基づく通常の定式化は適用されないため、これは難しい問題であることを示唆しました。したがって、実際には図の四面体分解を提供する必要がありますが、それは正しくないことを。形状が均一な密度である限り(これは、とにかくすでに作成している近似であり、おそらくほとんどの状況で完全に妥当なものです)、体積積分は表面積分に単純化でき、後者はさらに単純化できます。さらに良いことに、かなり見栄えの良いアルゴリズムがあり、これを行うためのコードがネット上にあります。で見てhttp://www.cs.berkeley.edu/~jfc/mirtich/massProps.html、モーメントと質量中心を計算するための彼のアルゴリズムを説明するブライアン・ミルティッチのページ。それはこの面であなたのニーズのほとんどすべてをカバーするはずです。これは、シェイプのエクスポート時またはインポート時にツールとして一度に実行したいものですが、すべてのフレームで実行する必要があるものではないことに注意してください。質量中心に関する慣性テンソルと残りの形状情報を格納するだけで、他の軸に関する慣性モーメントのテンソルを見つける必要がある場合は、標準の定理を使用してそれを導出できます。

うまくいけば、これであなたが必要とするものをカバーできるでしょう-私が手助けできることがもっとあるなら、私に知らせてください!


4

私はこれを自分でやったことはありませんが、任意のメッシュのクイックソリューションを作成する必要がある場合は、オブジェクト内に十分な質点を生成して近似し、それらから慣性テンソルを計算します。

ポイントは、シェイプのバウンディングボックスの内側に均一に生成され、実際のシェイプの外側にあるポイントは破棄されます。これにより、ポイントがシェイプの内側にあるかどうかをチェックするだけで問題が軽減されます。


0

ほとんどのゲームアプリケーション(つまり、「爆破物」)では、上記の直方体の方程式を使用するだけで十分でしょう。オブジェクトが境界ボックスを横切る対角線ではなく、軸に沿って配置されている場合は、機能するはずです。ODEなどの一部のゲーム物理エンジンは、慣性テンソルの主対角の項のみを使用します。それらのために、あなたのオブジェクトは正しく機能するために少なくともおおよそ軸に整列する必要があります。

私は1997年にFalling BodiesでMirtichのアルゴリズムを使用しました。これはうまく機能しますが、クリーンなジオメトリ、つまりトポロジ的に正しい閉じた非自己交差メッシュが必要です。穴がある場合、慣性計算は完全に偽の結果を生成します。凸型のジオメトリのみを使用したので、最初にQHullを実行して衝突用の凸型の船体を取得し、それから慣性を計算しました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.