Решение импульсной траектории биллиардного выстрела

Я использую пулю, чтобы сделать симулятор пула, и мне нужно точно моделировать снимки, которые по-человечески возможны. Чтобы найти импульс, чтобы применить к битку, я использую местоположения объектного шара, центра кармана и битка.

Общий сценарий выстрела http://www.poolplayers.com/wp-content/uploads/2013/03/372-TangentLine-2.jpg

В ситуациях, когда траектория движения битка похожа на прицельный шар (угол удара около 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's center of mass (using general form of applyImpulse to later use rel_pos for english
cueBallBody->applyImpulse(cueImpulse,btVector3());

Надеюсь, этого достаточно. Я долгое время боролся с этой ошибкой, и теперь этот очень большой проект, над которым я работал почти два года, зависит от решения этой проблемы! Даже если вы не видите, что не так с моим кодом, но у вас есть альтернативная стратегия для нахождения импульса — мне очень хотелось бы услышать это, потому что я боюсь, что у меня больше нет идей.

10

Решение

Если вы хотите сделать сложную физику, которая включает вращение шара, то я рекомендую бильярдный тип физики:

Пример:

http://www.real-world-physics-problems.com/physics-of-billiards.html

http://archive.ncsa.illinois.edu/Classes/MATH198/townsend/math.html

Если вам нужна более простая физика, я рекомендую скорее «Столкновение шара с шаром» для 2D или «Столкновение сферы с шаром» для 3D. Быстрый поиск в Google, вы найдете множество примеров того, как его реализовать.

Примеры:

http://www.hoomanr.com/Demos/Elastic2/

Столкновение шара с мячом — обнаружение и обработка

Время:

Я рекомендую рассчитать метку времени, когда произошло столкновение. Рассчитайте всю свою физику до этого момента времени (до столкновения). Это будет ваша позиция призрачного шара. Рассчитайте столкновения, в том числе новые скорости шаров. Затем рассчитайте всю свою физику за оставшийся период времени (после столкновения).

Направление:

То, что вы описываете, на самом деле имеет смысл (с точки зрения физики) для меня. Если шар движется вверх (если вы посмотрите на свою диаграмму), то передача импульса будет больше вверх, и вам придется сделать небольшую компенсацию в направлении за него. Правильный путь — выписать формулу для 2D-скорости при столкновении и расположении с направлением и обработать ее таким образом.

Обновить:
Простой способ: поверните призрачный шарик вокруг сталкивающегося шарика в направлении, противоположном ошибке, градусы поворота относительно степеней неисправности / расстояния.

1

Другие решения

Визуально это выглядит так, как будто вы не учитываете энергию, которая поступает в биток и впоследствии остается с битой.

Вещи, чтобы проверить:

  1. Как выглядит ошибка: случайная или неправильный ответ?

    • Если вы добавите случайные маленькие значения к входам, что произойдет?
    • Если вы делаете точечный график под разными углами, как выглядит линия тренда?
    • Если вы делаете точечный сюжет на разных расстояниях, какова тенденция?
  2. Значимые цифры

    • Google говорит мне, что btVector3 можно использовать поплавки или двойники. Плавания имеют ~ 24 двоичных знака точности, и страшно видеть, как быстро они могут потерять значащие цифры. (Возможно, внутри нормализуется?) Вы пробовали использовать удвоения?
    • Вы используете цифры разного масштаба? Когда вы доберетесь до крайних углов, вы можете увидеть, что x-координаты или x-смещения приближаются к нулю и что их масштабирование может быть потеряно в арифметике с плавающей запятой. Так же бывает, если вычесть два числа, которые практически одинаковы.

Удачи.

0

По вопросам рекламы [email protected]