Я использую пулю, чтобы сделать симулятор пула, и мне нужно точно симулировать снимки, которые по-человечески возможны. Чтобы найти импульс, чтобы применить к битку, я использую местоположения объектного шара, центра кармана и битка.
(источник: poolplayers.com)
В ситуациях, когда траектория движения битка подобна объектному шару (angular удара около 180 градусов), все работает отлично, и объектный шар опускается в карман. Но, похоже, чем более угловат траектория выстрела, тем больше погрешность для импульса, который я генерирую. Я пробовал много вещей, чтобы исправить это: отрегулировать границы столкновения мяча, масштабировать мир больше, отключить трение и реституцию и многое другое, но, похоже, ничто не меняет это поведение.
Вот соответствующие фрагменты моего кода:
//assume p = pocket center, b = object ball center, c = cue ball center
//first find the position of the ghost ball, ie the target point of collision for the cue ball
btVector3 ghostPos = b+(b-p).normalize()*(2.0f*BALL_RADIUS);
//then use the normal between the ghostball and cue ball as the impulse, scaled by the shots total distance
btVector3 cueImpulse = (ghostPos-c).normalize()*((p.distance(b)+ghostPos.distance(c))*HIT_RATIO);
//finally apply the impulse to the cueball center of mass (using general form of applyImpulse to later use rel_pos for english
cueBallBody->applyImpulse(cueImpulse,btVector3());
Надеюсь, что достаточно информации. Я долгое время боролся с этой ошибкой, и теперь этот очень большой проект, над которым я работаю почти два года, зависит от решения этой проблемы! Даже если вы не видите, что не так с моим кодом, но у вас есть альтернативная стратегия для нахождения импульса - мне очень хотелось бы услышать это, потому что я боюсь, что у меня больше нет идей.