2014-12-22 2 views
0

Я создаю простой физический движок. Основываясь на некоторых знаниях предшествующего векторного исчисления, я написал здесь этот код, который принимает компоненты x и y вектора мгновенного направления «u» и x и y компонент вектора, который является линией, с которой шар сталкивается с «v» и возвращает двойную «тету», которая является углом между входящим шаром и линией.Вычислительные углы столкновения

private double computeAngle(double uXComponent, double uYComponent, 
     double vXcomponent, double vYComponent) { 
    return Math.acos(((uXComponent * uYComponent) + (uYComponent * vYComponent))/(Math.sqrt((uXComponent * uXComponent) + (uYComponent * uYComponent)) * Math.sqrt((vXcomponent * vXcomponent) + (vYComponent * vYComponent)))); 
} 

Программа продолжает использовать этот код для определения новых компонентов скорости.

xVelocity *= Math.cos(theta); 
yVelocity *= Math.sin(theta); 

Однако если линия ровная т.е. v = < 500, 0> и мяч движется в простой параболической кривой и прыгающий через линию самого первого отскока всегда прямо вверх (xVelocity очень близко 0) , По существу, значение для theta очень близко к pi/2 (ближе, чем действительно должно быть).

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

+1

Для получения более подробной помощи отправьте сообщение [MCVE] (http://stackoverflow.com/help/mcve) (Минимальный полный проверяемый пример) или [SSCCE] (http://www.sscce.org/) (короткий, самосохраненный, правильный пример). –

+0

См. Также приведенный подход [здесь] (http://stackoverflow.com/a/25306319/230513). – trashgod

ответ

0

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

Объект с массой m1, движущийся со скоростью v1, который сталкивается с другим объектом с массой m2 и скоростью v2 под углом theta, может быть смоделирован как столкнувшийся в этих уравнениях.

m1*v1 + m2*v2*cos(theta) = (m1 + m2) * v3 * cos(phi) //This is for the x axis 
m1*v1 + m2*v2*sin(theta) = (m1 + m2) * v3 * sin(phi) //This is for the y axis 

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

This SO answer рассказывает о том, как рассчитать угол отклонения от стены. По существу; с учетом скорости, которая сталкивается с выровненной по оси стенкой, умножьте заданную координату на -1. Учитывая, что я просто буду копировать дословно в этот момент, я просто скажу, следуя ссылке, и если это сработает, тогда этот вопрос будет дублировать.

+0

Если я использую первые уравнения для шара, отскакивающего от статической настенной интуиции, скажут, что масса стены бесконечна и скорость равна нулю. Это оставляет вас неопределенной формой (бесконечность * 0). Что касается второго связанного ответа, это решение работает только для выровненных по оси стен, как вы упомянули. Я привел пример стены, выровненной по оси, только для ясности моей проблемы.Я обеспокоен тем, что для любого столкновения и угла моей стены, если угол около 90 градусов, он слишком округлен. – alltrue

0

Ошибка в моем коде была простой логической ошибкой. Формула для угла между двумя векторами formula for angle between vectors

Моим кодом был

Math.acos(((uXComponent * uYComponent) + (uYComponent * vYComponent))/(Math.sqrt((uXComponent * uXComponent) + (uYComponent * uYComponent)) * Math.sqrt((vXcomponent * vXcomponent) + (vYComponent * vYComponent))) 

и это должно было быть

Math.acos(((uXComponent * vXComponent) + (uYComponent * vYComponent))/(Math.sqrt((uXComponent * uXComponent) + (uYComponent * uYComponent)) * Math.sqrt((vXComponent * vXComponent) + (vYComponent * vYComponent))) 

(В скалярном произведении векторов мне нужно исправить умножение x-компонент как векторов v, так и u)

Смежные вопросы