Решение траектории движения бильярдных выстрелов

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

Common shot scenario
(источник: 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());

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

Ответ 1

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

Пример:

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

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

Если вам нужна более простая физика, я рекомендую скорее "Ball to Ball Collision" для 2D или "Sphere to Sphere collision" для 3D. Быстрый поиск в Google, вы найдете множество примеров того, как его реализовать.

Примеры:

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

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

Время:

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

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

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

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

Ответ 2

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

Что нужно проверить:

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

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

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

Желаем удачи.