Рекомендация физического движка, которая может правильно имитировать игру в пул [закрыто]

13

Я делаю игру, похожую на бильярд. Эта игра требует правильных (или очень точных) отражательных отскоков. Я пробовал Box2D и Bullet Physics , но у них обоих есть эта проблема.

иллюстрация

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

  1. Это происходит после того, как медленно движущийся шар падает на стену.
  2. Иногда быстро движущийся шар внезапно замедляется.

Я нахожу физический движок, который может максимально точно смоделировать игру в пул без этих проблем. Могу ли я получить некоторые рекомендации? Сейчас я копаю Newton Game Dynamics , но я не уверен, что движок покажет, что я хочу. Я рассматриваю движок PhysX как следующую пробу, и должен сделать свой собственный, если ничего не работает. Но очевидно, что это займет очень много времени, поэтому я бы не хотел этого делать. Я буду очень признателен, если вы сэкономите мое время. И, конечно, приветствуется решение с Box2D / Bullet Physics.

Я работаю с C / C ++ / Objective + C на iOS.


Я прилагаю свою конфигурацию с Box2D.

стены

  • статическая форма коробки
  • линейное / угловое демпфирование = 0,1
  • реституция = 1,0
  • трение = 100
  • плотность = 10
  • пуля = ложь
  • фиксированное вращение = ложь
  • инерционная шкала = 1,0

Яйца

  • динамическая форма сферы
  • линейное / угловое демпфирование = 0,1
  • реституция = 1,0
  • трение = 100
  • плотность = 20
  • пуля = правда
  • фиксированное вращение = ложь
  • инерционная шкала = 1,0
Eonil
источник
3
Скорее всего, двигатель не ошибается, но вы не устанавливаете свойство или делаете его неправильно.
Коммунистическая утка
Возможный дубликат Есть ли алгоритм для игры в пул?
bummzack
Я тестировал с плотностью 1 и трением 0,0 ~ 0,1, он продолжает прилипать.
Эонил

Ответы:

8

Несколько решений.

  1. Для Box2D установите b2_velocityThresholdв b2Settings.hфайле. В моем случае я установил его на 0.0fи это сработало! Масса, трение, демпфирование НЕ были проблемой. Проверьте эту ветку обсуждения для более подробной информации. http://www.box2d.org/forum/viewtopic.php?f=3&t=6906&p=30782#p30782

  2. Используя другой физический движок. Newton Game Dynamics настроил выполнение этого по умолчанию правильно. Однако использование динамики Ньютона в iOS возможно, но это несколько сложнее, чем другие. Я использовал несколько дней, настраивая его для iOS.

Я также спрашиваю на форумах BulletPhysics. Я обновлю это, когда получу решение.

-- (редактировать) --

В Bullet есть некоторые пороговые атрибуты, но я не могу найти точно такую ​​же вещь b2_velocityThreshold.

Это выглядит похоже, но не сработало.

btRigidBody->setContactProcessingThreshold(0.0f)
Eonil
источник
6

Box2D будет делать то, что вы хотите, но вы должны установить константы восстановления (отказов) для настенных и шаровых светильников. Для игры в пул вы, вероятно, захотите начать с идеального восстановления и высокого трения, но с линейным и угловым демпфированием, и отрегулировать оттуда.


источник
Я перепробовал много конфигураций за несколько дней, но это все еще происходит. Могу ли я получить один хороший пример ...?
Eonil
3
Для Box2D ваши значения плотности и трения кажутся очень большими.
4

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

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

Brandon
источник
0

У меня была эта проблема, и для меня решением было обеспечить идеальную реституцию.

Так что для меня это sqrt 0,5 для всех объектов. Потому что sqrt (r1 * r1 + r2 * r2) == 1 в идеальной ситуации.

Уэстон
источник