Использование массы в Bullet

Мне жаль задавать такой простой вопрос о пуле. Однако у меня возникла проблема. Вот настройка:

У меня есть мир без гравитации. Когда я нажимаю клавишу, в центре мира создается поле 1x1x1. Когда я щелкаю правой кнопкой мыши, прямоугольник размером 0,05 * 0,05 * 0,05 создается в положении камеры и «выстреливается» в том направлении, в котором вы смотрите. Вот тут-то и начинается беда.

Когда маленький куб сталкивается с большим кубом, взаимодействие кажется неправильным. Вы ожидаете, что коробка в 1/8000 размера другой будет иметь очень небольшой эффект. И все же большой куб летит, как если бы он был с кубом такого же размера. Я предположил, что это потому, что я создал оба объекта с одинаковой массой.

Чтобы подтвердить это, я применяю направленную вверх силу в 1 ньютон (или любую другую единицу измерения, используемую пулей). Оба объекта ускоряются с одинаковой скоростью.

Мой код для создания объектов выглядит следующим образом:

btMotionState *state = new btDefaultMotionState(btTransform(btQuaternion(0, 0, 0, 1), btVector3(0, 0, 0)));
btConvexHullShape* shape = new btConvexHullShape();
for(unsigned int i = 0; i < vertices.size(); ++i) {
    shape->addPoint(toBt(vertices[i]));
}
shape->setMargin(0.01f);

btScalar mass = 1.f;
btVector3 inertia;
shape->calculateLocalInertia(mass, inertia);
shape->setMargin(0.01f);
btRigidBody::btRigidBodyConstructionInfo ci(mass, state, shape, inertia);
body = new btRigidBody(ci);

Я ожидаю, что виновником является строка btScalar mass = 1.f;.

Ожидается ли, что я вычислю массу своих объектов? Это достаточно просто для куба, но как насчет какой-нибудь странной выпуклой формы? Есть ли способ заставить пулю сделать это за меня?


person BWG    schedule 23.02.2014    source источник


Ответы (1)


Да, виновата масса. Представьте, что ваша большая коробка — это пустой деревянный ящик, а ваша маленькая коробка — сплошной железный куб. Огромная разница в размерах, но одинаковая масса. Теперь ваша физика кажется правильной, верно?

Да, вы должны обеспечить массу. Считаете ли вы это или просто указываете, что «эта коробка весит 20 кг», решать вам. На самом деле ожидание того, что кто-то другой рассчитает массу за вас, только усугубит вашу проблему, потому что вам придется указать материалы, плотность материала и распределение материала ваших объектов, помимо его геометрии. Если вы хотите пойти по этому пути, существует множество других инструментов, которые помогут вам в таких вычислениях. Но я уверен, что вы согласитесь, что просто определить массу путем проб и ошибок намного проще.

person Jonas Bötel    schedule 24.02.2014
comment
Ну, таким образом, вам тоже придется вычислять центр масс самостоятельно, не так ли? Итак (для нетривиальных форм) вам также нужно знать форму и плотность, не так ли, и метода проб и ошибок будет недостаточно? - person Rup; 24.02.2014
comment
Спасибо за ответ. Думаю, мне придется потратить некоторое время на расчет объема выпуклой оболочки или переключиться на объект типа triangleMesh. Мои данные настроены таким образом, поэтому я действительно думаю, что это будет правильный путь. - person BWG; 24.02.2014
comment
@BWG Гораздо привычнее знать вес объекта, чем его объем и плотность. Что вы моделируете? - person weston; 24.02.2014
comment
@Rup вычисление центра масс — одна из задач, которые выполняет calculateLocalInertia. - person weston; 24.02.2014
comment
@weston Я начинаю с куба, а потом хочу разрезать его на мелкие кусочки. Я понятия не имею, с чего даже начать для расчета массы нарезанных частей. Мне также (я думаю) придется вычислить центр масс. Могу ли я использовать рассчитанный вектор инерции (shape->calculateLocalInertia()) для аппроксимации массы моего объекта? Инерция маленького куба намного меньше, чем у большого куба. - person BWG; 24.02.2014
comment
@BWG нет, вы должны предоставить массу. Но calculateLocalInertia вычисляет для вас центр масс. Если у вас есть составной объект, то, как я полагаю, вы указываете массу для каждой части. - person weston; 24.02.2014
comment
@BWG Нет. Инерция влияет на то, насколько сложно вращать объект. Масса влияет на то, насколько трудно ее двигать. Для кубов с одинаковой плотностью существует преобразование между ними, но в целом нет. - person Jonas Bötel; 24.02.2014