Atalet Tensörlerinin Hesaplanması


10

İtiraf edeceğim, henüz çok iyi anlamıyorum, bu yüzden olabildiğince iyi açıklamaya çalışacağım, karmaşık ve uzun bir soru.

Kısa Versiyon: Bir cisim şekline dayalı atalet tensörlerini hesaplamak için genel bir c ++ / physx formülü var mı?

Uzun Versiyon: Fizik için x, y ve z atalet tensörlerini belirtmemiz gerekiyor. Şu anda bunu yapma şeklimiz kütleye dayalı bir orandır. Bir nesne X ekseninde uzun ve Y ve Z üzerinde ince ise ve kütle 10000 ise, Z ve Y'yi 7000 ve X'i 3000'e ayarlayacağız. (Bu kesin değil, sadece bir fikir vermek için)

Bu nispeten iyi çalışıyor, ancak en büyük sorunumuz bir yerde ortak kararsızlık olduğunda, neyin en iyi olduğunu anlayana kadar tensörlerde tahmin etmeye devam etmemiz gerekiyor. Çok büyük bir fizik simülasyonumuz varsa ve 20+ eklemden biri diğerlerinin stabilitesini kaybetmesine neden oluyorsa, bu çok zaman alıcı olabilir.

Üzerinde çalıştığım şey, bir nesnenin sınırlayıcı kutusunu alacak ve umarım nispeten doğru tensörleri hesaplayacak bir işlevdir. Bazı matematik http://en.wikipedia.org/wiki/List_of_moment_of_inertia_tensors aldım ve temelde aşağıdaki benzer rotasyonlar için aşağıdaki gibi çalışan bir işlev yaptım.

Genişlik w, yükseklik h, derinlik d ve kütle m katı küboid resim açıklamasını buraya girin

Veya rotasyon bir sondaysa, şöyle:

resim açıklamasını buraya girin resim açıklamasını buraya girin

Yani, bu bana bunu yapma şeklimize benzer sonuçlar veriyor gibi görünüyor, ancak genel kullanım için çalışacağından emin olmadan bu yola geçmek istemiyorum. Küp ve orta pivotlu ilk görüntüye dayanan fonksiyonumun kodu aşağıdadır.

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);
}

Bunu yapmanın doğru yolu olduğunu garanti edemiyorum (en doğru yol sınırlayıcı bir kutu yerine gerçek şekli kullanmaktır) ve atalet tensörleri ve matematiğe çok aşina değilim ama sayıları döndürüyor gibi görünüyor kullandıklarımıza oldukça benzer. Burada daha iyi bir yol olup olmadığını bilen var mı?


3
Nesnenizi tetrahedra'ya ayırabilirseniz, tam olarak hesaplamak için bir tetrahedronun atalet momenti anı için temel formülle birlikte tensörün doğrusallığını kullanabilmelisiniz (örneğin bunu Wolfram Alpha ile bulabilirsiniz). tensör. Sınırlama kutusu yöntemi ile ilgili benim endişe gerçekten BB ne kadar nesne doldurur bağlıdır; Örneğin, bir yağlı elipsoid ile ince bir sarmal yay arasındaki farkı düşünün.
Steven Stadnicki

Giriş için teşekkürler. Ve haklısın, asıl sorunum, 'A' şeklinde bir nesne olduğunda ortaya çıkıyor, BB tensörleri yanlış geri getirecek. Bilgilerinizi kontrol edeceğim, teşekkürler!
Mungoid

Rica ederim - eğer bunu daha ayrıntılı bir şekilde etmemi istiyorsan, ondan doğru bir cevap oluşturabilmeliydim, ama bu seni başlatmak için yeterli olmalı.
Steven Stadnicki

Eğer istekli olsaydı, bu harika olurdu! Bir süredir bunu anlamaya çalışıyorum ama yine de bu alanda biraz acemiyim, bu yüzden kendimi gittikçe daha fazla karıştıracağım = -)
Mungoid

Yanıtlar:


7

Bunun zor bir problem olduğunu önerecektim çünkü hacim integrallerini yüzey integrallerine dönüştürmek için Green Teoremini temel alan olağan formülasyonlar geçerli değildir ve bu yüzden aslında figürünüzün tetrahedral ayrışmasını sağlamak zorundasınız - ama dönüyor bu doğru değil. Şekliniz eşit yoğunlukta olduğu sürece (zaten zaten yaptığınız bir tahmin, muhtemelen ve çoğu durumda mükemmel derecede makul olanı), o zaman hacim integralleri yüzey integrallerine basitleştirilebilir ve ikincisi daha da basitleştirilebilir. Daha da iyisi, bunu yapmak için internette oldukça iyi görünümlü bir algoritma ve kod var gibi görünüyor; http://www.cs.berkeley.edu/~jfc/mirtich/massProps.html adresine bir göz atın, Brian Mirtich'in momentleri ve kütle merkezini hesaplama algoritmalarını anlatan sayfası. Bu cephedeki hemen hemen tüm ihtiyaçlarınızı karşılamalıdır. Bunun, şeklin dışa aktarılması veya içe aktarma sırasında bir araç olarak bir kez yapmak isteyeceğiniz bir şey olduğunu unutmayın, ancak her kareyi yapmanız gereken bir şey değildir; sadece atalet tensörünü kütle merkezi hakkında şekil bilgisinin geri kalanıyla birlikte saklayın ve başka bir eksenle ilgili eylemsizlik momentleri için tensörü bulmanız gerekiyorsa, bunu elde etmek için standart teoremleri kullanabilirsiniz.

Umarım bu ihtiyacınız olanı kapsamalıdır - yardım etmeye çalışabileceğim daha fazlası varsa, bana bildirin!


4

Bunu kendim hiç yapmadım, ancak keyfi ağlar için hızlı bir çözüm yazmak zorunda kalsaydım, muhtemelen nesnenin içinde yaklaşık olarak tahmin edip atalet tansörlerini bunlardan hesaplamak için yeterli kütle noktası üretirdim.

Noktalar şeklin sınırlayıcı kutusunun içinde homojen olarak oluşturulabilir ve daha sonra gerçek şeklin dışında kalanlar atılabilir. Bu, sadece bir noktanın şeklin içinde olup olmadığını kontrol etme problemini azaltacaktır.


0

Çoğu oyun uygulaması için (yani, "şeyleri havaya uçurmak"), denklemi yukarıda verilen dikdörtgen bir katı için kullanmak muhtemelen yeterince iyidir. Nesnenin, sınırlayıcı kutuda çapraz değil, eksene hizalanmış olması koşuluyla, çalışması gerekir. ODE gibi bazı oyun fiziği motorları, yalnızca atalet tensörünün ana köşegenindeki terimleri kullanır. Onlar için, doğru çalışması için nesnelerinizin en azından kabaca eksenle hizalanması gerekir.

Mirtich'in algoritmasını 1997'de Falling Bodies'da kullandım. İyi çalışıyor, ancak temiz geometriye sahip olmalısınız - topolojik olarak doğru kapalı kendiliğinden kesişmeyen bir ağ. Delikler varsa, atalet hesaplaması tamamen sahte sonuçlar verecektir. Sadece dışbükey geometri kullandım, bu yüzden önce çarpışma amacıyla dışbükey bir gövde elde etmek için QHull'u çalıştırdım, sonra ataleti hesapladım.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.