Нужна помощь при столкновении и повороте круга? - Игровая физика

Итак, у меня есть куча мячей:

Ignight Balls


То, что я пытаюсь понять, - это сделать следующие круги:

  • Повернуть на основе поверхностей, которые они касаются

  • Исправить проникновение столкновения при работе с несколькими касающимися объектами.


EDIT: Это то, что я имею в виду под ротация

alt text

  • Бал 0 будет вращаться против часовой стрелки, поскольку он опирается на Ball 3

  • Ball 5 будет вращаться по часовой стрелке, поскольку он опирается на Ball 0


Несмотря на то, что решения для этого универсальны, только для записи я использую Javascript и SVG, и предпочел бы реализовать это сам, а не использовать библиотеку.

Помощь будет очень оценена. Благодарю!:)

Ответы

Ответ 1

Вот несколько ссылок, которые, я думаю, помогут вам в ваших поисках:

Box2D

Продвинутая физика персонажей

Javascript Ball Simulation

Box2D имеет то, что вы ищете, и его открытый исходный код, я считаю. Вы можете скачать файлы и посмотреть, как они делают то, что делают, чтобы добиться вашего эффекта.

Дайте мне знать, если это поможет, пытаясь лучше ответить на вопросы здесь. :)

РЕДАКТИРОВАТЬ:

Так что я пошел дальше и подумал об этом чуть больше, чтобы дать некоторое представление о том, как я буду подходить к этому. Посмотрите на изображение ниже:

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

alt text

Ответ 2

С физической точки зрения кажется, что вы хотите сохранить как линейные, так и angular momentum.

В качестве отправной точки вы хотите установить ODE матрицы, которые моделируют оба, а затем выполняют некоторую линейную алгебру для их решения. Я лично использовал бы Numpy/Scipy (возможно, используя разреженный массив) для этого решения. Но есть много подходов (sympy приходит на ум). Какие модули вы хотите использовать?

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

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

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