Вы в основном хотите использовать сохранение импульса (всегда) и сохранение энергии (при условии, что вы хотите идеально упругое столкновение). Симпатичный маленький график и уравнения показаны здесь . (На рисунке объекты имеют одинаковый размер, но размер не имеет значения. Все, что имеет значение, это масса двух окружностей или сфер и угол наклона линии или плоскости между двумя поверхностями в момент столкновения - - которая будет просто перпендикулярна линии, которая имеет центры и точку контакта.)
Это основы, тогда вы можете справиться с различными вариациями следующими способами:
если оба объекта движутся во время удара :
Чтобы справиться со случаем, когда оба объекта движутся, проще всего преобразовать их в систему отсчета, где один неподвижен, а затем снова вернуться. Таким образом, вычтите векторную скорость объекта № 2 из обоих объектов № 1 и № 2 (давая нулевой скорости объекта № 2), выполните вычисление, а затем добавьте эту же векторную скорость к обоим объектам. Конечно, вы могли бы записать полное уравнение для этого, но проще просто преобразовать и преобразовать обратно.
чехол для одного объекта, зафиксированного на всем протяжении :
Если вы хотите удерживать один из объектов неподвижным, вы просто используете угол падения , равный угол отражения , то есть найдите касательную плоскость (3D) или линию (2D) в время удара (это будет просто линия или плоскость, перпендикулярная линии между центрами, которая также будет включать точку контакта) и отскок объекта от этой плоскости / линии. (Вы можете видеть в уравнениях, что это в основном тот случай, когда один объект имеет бесконечную массу, и иногда проще просто сделать это таким образом, если, скажем, вы уже написали это для обоих объектов, которые могут свободно перемещаться.)
чехол для одного объекта, перемещаемого курсором мыши :
Если один объект перемещается с помощью курсора мыши, я предполагаю, что вы хотите, чтобы он выглядел так, как будто он имеет бесконечную массу, то есть курсор полностью закрепляет объект точно в том месте, где находится курсор. В этом случае просто скомбинируйте два предыдущих случая, то есть преобразуйте все движения в систему отсчета объекта курсора (вычтя его скорость из всего), выполните расчет, как для объекта, который удерживается фиксированным, а затем добавьте тот же самый Скорость, чтобы преобразовать обратно. (Было бы неплохо, имхо, иметь объект курсора подвижным, но удерживаемым демпфирующей пружиной в месте расположения курсора, но это отдельная проблема.)