Obliczanie tensorów bezwładności

10

Trochę złożonego i długiego pytania, które, przyznaję, jeszcze nie bardzo dobrze rozumiem, więc postaram się wyjaśnić jak najlepiej.

Krótka wersja: Czy istnieje ogólna formuła c ++ / physx do obliczania tensorów bezwładności na podstawie kształtu obiektu?

Wersja długa: dla naszej fizyki musimy określić tensory bezwładności x, yiz. Obecnie sposób, w jaki to robimy, jest po prostu stosunkiem masy. Więc jeśli obiekt jest długi na osi X i cienki na Y i Z, a masa wynosi 10000, ustawimy Z i Y na 7000, a X na 3000. (To nie jest dokładne, ale tylko dać pomysł)

Działa to stosunkowo dobrze, ale naszym największym problemem jest to, że gdzieś występuje niestabilność połączenia, musimy zgadywać na tensorach, dopóki nie ustalimy, co działa najlepiej. Może to być bardzo czasochłonne, jeśli mamy bardzo dużą symulację fizyki, a jedno z ponad 20 stawów powoduje utratę stabilności przez pozostałe.

Pracuję nad funkcją, która weźmie obwiednię obiektu i, mam nadzieję, obliczy stosunkowo dokładne tensory. Wziąłem trochę matematyki z http://en.wikipedia.org/wiki/List_of_moment_of_inertia_tensors i stworzyłem funkcję, która w zasadzie działa następująco dla podobnych rotacji poniżej.

Solidny prostopadłościan o szerokości w, wysokości h, głębokości d i masie m wprowadź opis zdjęcia tutaj

Lub jeśli obrót jest na końcu, tak:

wprowadź opis zdjęcia tutaj wprowadź opis zdjęcia tutaj

Wydaje mi się, że daje to wyniki podobne do tego, w jaki sposób to robiliśmy, ale nie chcę przełączać się w ten sposób, nie upewniając się, że będzie on działał do ogólnego użytku. Poniżej znajduje się kod mojej funkcji oparty na pierwszym obrazie z sześcianem i środkową osią obrotu.

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

Nie mogę zagwarantować, że jest to właściwy sposób (ponieważ najdokładniejszym sposobem jest użycie rzeczywistego kształtu zamiast ramki ograniczającej) i nie znam zbyt dobrze tensorów bezwładności i matematyki, ale wydaje się, że zwracają liczby dość podobny do tego, którego używaliśmy. Czy ktoś tu wie, czy istnieje lepszy sposób na zrobienie tego?

Mungoid
źródło
3
Jeśli potrafisz rozłożyć obiekt na czworościany, powinieneś być w stanie użyć liniowości tensora wraz z podstawową formułą dla momentu bezwładności czworościanu (możesz to znaleźć na przykład w Wolfram Alpha), aby obliczyć dokładny napinacz. Moje obawy związane z metodą ramki ograniczającej polegałyby na tym, że tak naprawdę zależy to od tego, ile twoich BB wypełnia obiekt; wyobraź sobie na przykład różnicę między grubą elipsoidą a smukłą śrubową sprężyną.
Steven Stadnicki
Dzięki za wkład. I masz rację, mój główny problem pojawia się, gdy jest powiedzmy obiekt w kształcie litery „A”, BB sprawi, że tensory wrócą niepoprawnie. Sprawdzę twoje informacje, dzięki!
Mungoid
Nie ma za co - jeśli chcesz, abym to szczegółowo przedstawił, powinienem być w stanie ułożyć na nim właściwą odpowiedź, ale to powinno wystarczyć, aby zacząć.
Steven Stadnicki
Jeśli chcesz, to byłoby niesamowite! Próbuję to rozgryźć przez jakiś czas, ale wciąż jestem trochę młodym adeptem w tej dziedzinie, więc coraz bardziej się
mylę

Odpowiedzi:

7

Chciałem zasugerować, że jest to trudny problem, ponieważ zwykłe sformułowania oparte na użyciu twierdzenia Greena do przekształcania całek objętościowych w całki powierzchniowe nie mają zastosowania, a więc faktycznie musisz zapewnić tetraedryczny rozkład swojej figury - ale okazuje się, że że to nie jest poprawne. Tak długo, jak twój kształt ma jednolitą gęstość (co jest i tak przybliżeniem, które już robisz, przypuszczalnie i jest całkowicie rozsądny w większości przypadków), to całki objętościowe można uprościć do całek powierzchniowych, a to drugie uprościć jeszcze bardziej. Co więcej, wydaje się, że istnieje dość dobrze wyglądający algorytm i kod w sieci, aby to zrobić; spójrz na http://www.cs.berkeley.edu/~jfc/mirtich/massProps.html, Strona Briana Mirticha opisująca jego algorytmy do obliczania momentów i środka masy. Powinien pokryć prawie wszystkie twoje potrzeby na tym froncie. Zauważ, że jest to coś, co chcesz zrobić raz, albo jako narzędzie przy eksporcie kształtu lub podczas importu, ale nie jest to coś, co musisz zrobić dla każdej klatki; po prostu przechowuj tensor bezwładności wokół środka masy wraz z resztą informacji o kształcie, a jeśli kiedykolwiek będziesz musiał znaleźć tensor dla momentów bezwładności wokół jakiejś innej osi, możesz użyć standardowych twierdzeń do jego wyprowadzenia.

Mam nadzieję, że powinno to pokryć to, czego potrzebujesz - jeśli jest coś, w czym mogę spróbować pomóc, daj mi znać!

Steven Stadnicki
źródło
4

Nigdy tego sam nie zrobiłem, ale gdybym musiał napisać szybkie rozwiązanie dla dowolnych siatek, prawdopodobnie wygenerowałbym wystarczającą liczbę punktów masy wewnątrz obiektu, aby go przybliżyć i obliczyć z nich tensory bezwładności.

Punkty można generować równomiernie wewnątrz obwiedni kształtu, a następnie odrzucać te, które są poza rzeczywistym kształtem. Zmniejszyłoby to problem do sprawdzenia, czy punkt znajduje się w kształcie.

sprzedać
źródło
0

W przypadku większości gier (np. „Wysadzanie rzeczy w powietrze”) użycie równania dla prostokątnej bryły podanej powyżej jest prawdopodobnie wystarczające. Pod warunkiem, że obiekt jest wyrównany do osi, a nie po przekątnej przez obwiednię, powinno to działać. Niektóre silniki fizyki gier, takie jak ODE, używają terminów tylko na głównej przekątnej tensora bezwładności. Dla nich twoje obiekty muszą być co najmniej z grubsza wyrównane względem osi, aby działały poprawnie.

Użyłem algorytmu Mirticha w Falling Bodies w 1997 roku. Działa dobrze, ale musisz mieć czystą geometrię - poprawną topologicznie zamkniętą nierozdzielającą się siatkę. Jeśli są dziury, obliczenia bezwładności przyniosą całkowicie fałszywe wyniki. Użyłem tylko geometrii wypukłej, więc najpierw uruchomiłem QHull, aby uzyskać wypukły kadłub do celów zderzeniowych, a następnie obliczyłem z tego bezwładność.

John Nagle
źródło