Розрахунок тенерів інерції


10

Трохи складне і тривале запитання, яке, зізнаюся, я ще не дуже добре розумію, тому спробую і пояснити якнайкраще.

Коротка версія: Чи існує загальна формула c ++ / physx для обчислення тензорів інерції на основі форми об'єктів?

Довга версія: Для нашої фізики нам потрібно вказати тензори інерції x, y та z. В даний час так, як ми це робимо, це майже просто співвідношення, виходячи з маси. Отже, якщо об’єкт довгий на осі X і тонкий на Y і Z, а маса 10000, ми встановимо Z і Y на 7000 і X на 3000. (Це не точно, але просто для того, щоб дати уявлення)

Це працює досить добре, але наша найбільша проблема полягає в тому, що десь є спільна нестабільність, ми повинні продовжувати здогадуватися про тензори, поки не з'ясуємо, що найкраще працює. Це може зайняти багато часу, якщо у нас дуже велике фізичне моделювання, і один з 20+ суглобів змушує всі інші втрачати стабільність.

Я працюю над функцією, яка візьме обмежувальний ящик об'єкта і, сподіваємось, обчислить відносно точні тензори. Я взяв частину математики з 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,), щоб обчислити точний тензор. Моє занепокоєння методом обмежувальної коробки полягатиме в тому, що це дійсно залежить від того, яку кількість вашого ББ об'єкт заповнює; уявіть, наприклад, різницю між жировим еліпсоїдом та стрункою гвинтовою пружиною.
Стівен Стадницький

Дякуємо за вклад. І ви правильно, моє головне питання виникає тоді, коли є, скажімо, об’єкт у формі "А", ВВ змусить тензори повернутися неправильно. Я перевірю вашу інформацію, дякую!
Мангоїд

Запрошуємо вас - якщо ви хочете, щоб я детальніше розробив це, я повинен мати змогу скласти належну відповідь, але цього має бути достатньо, щоб ви почали працювати.
Стівен Стадницький

Якби ви хотіли, це було б приголомшливо! Я деякий час намагався розібратися в цьому, але я все-таки трохи поблакав у цій галузі, тому я в кінцевому підсумку заплутався все більше і більше = -)
Mungoid,

Відповіді:


7

Я збирався припустити, що це складна проблема, оскільки звичайні формулювання, засновані на використанні теореми Гріна для перетворення інтегралів об'єму в поверхневі інтеграли, не застосовуються, і тому ви насправді повинні забезпечити тетраедричне розкладання вашої фігури - але це виявляється Зрозуміло, що це не правильно. Поки ваша форма має однакову щільність (це приблизне значення, яке ви вже робите в будь-якому випадку, імовірно, і цілком розумне для більшості обставин), то інтеграли об'єму можна спростити до поверхневих інтегралів, а останні спростити ще більше. А ще краще, здається, що в мережі є досить гарний алгоритм і код для цього; подивіться на http://www.cs.berkeley.edu/~jfc/mirtich/massProps.html, Сторінка Брайана Міртіха, що описує його алгоритми обчислення моментів та центру маси. Він повинен покрити майже всі ваші потреби на цьому фронті. Зауважте, що це щось, що ви хочете зробити один раз, або як інструмент для експорту форми або під час імпорту, але не те, що вам потрібно робити для кожного кадру; просто збережіть тензор інерції щодо центру маси разом з іншою інформацією форми, і якщо вам коли-небудь знадобиться знайти тензор на моменти інерції щодо якоїсь іншої осі, то для його отримання ви можете використовувати стандартні теореми.

Сподіваємось, це повинно покрити те, що вам потрібно - якщо є більше, з чим я можу спробувати допомогти, просто дайте мені знати!


4

Я ніколи цього не робив сам, але якби мені довелося написати швидке рішення для довільних сіток, я, мабуть, генерував би достатньо масових точок всередині об'єкта, щоб наблизити його та обчислити тензори інерції від них.

Точки можна формувати рівномірно всередині обмежувальної коробки форми, а потім відкидати ті, які знаходяться поза фактичною формою. Це зменшило б проблему до просто перевірки, чи є точка всередині форми.


0

Для більшості ігрових додатків (тобто "підірвання матеріалів") просто використання рівняння для прямокутного твердого тіла, наведеного вище, мабуть, досить добре. За умови, що об'єкт розташований по осі, а не по діагоналі через обмежувальний ящик, це повинно працювати. Деякі двигуни фізики ігор, такі як ODE, використовують лише терміни на головній діагоналі тензора інерції. Для них ваші об’єкти повинні бути принаймні приблизно вирівняні по осі, щоб правильно працювати.

Я використовував алгоритм Міртіха в «Falling Bodies» ще в 1997 році. Він добре працює, але ви повинні мати чисту геометрію - топологічно правильну закриту непересічну сітку. Якщо є дірки, обчислення інерції дасть абсолютно хибні результати. Я використовував тільки опуклу геометрію, тому спершу запустив QHull, щоб отримати опуклий корпус для цілей зіткнення, а потім обчислив інерцію від цього.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.