Немного сложный и длинный вопрос, который, я признаю, я еще не очень хорошо понимаю, поэтому постараюсь объяснить как можно лучше.
Короткая версия: существует ли общая формула 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 и сделал функцию, которая в основном работает следующим образом для аналогичных вращений ниже.
Или, если вращение заканчивается, вот так:
Таким образом, это, кажется, дает мне результаты, которые похожи на то, как мы это делали, но я не хочу переходить на этот способ, не убедившись, что он будет работать для общего пользования. Ниже приведен код моей функции, основанный на первом изображении с кубом и центральной осью.
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);
}
Я не могу гарантировать, что это правильный способ сделать это (поскольку наиболее точный способ - использовать фактическую форму вместо ограничивающего прямоугольника), и я не очень хорошо знаком с тензорами инерции и математикой, но, похоже, он возвращает числа довольно похоже на то, что мы использовали. Кто-нибудь здесь случайно знает, есть ли лучший способ сделать это?