Реалистичный отскок мяча (вне линии) в координатной сетке
Задача
Итак, я пытаюсь создать программу, которая заставляет мяч отскакивать от линии, вычисляя угол, который мяч сделал бы с линией - если бы это была пересекающаяся линия - и поворачивая эту линию вокруг точки пересечения, чтобы найти новый наклон. У меня есть все алгоритмы и формулы для всего, кроме той части, где я возвращаю наклон к импульсу мяча. Конечным продуктом всех вычислений (которые я убедился, что работают) является наклон линия и точка пересечения, или отскока. Если бы у меня был только наклон, как бы я мог сказать, в каком направлении мяч будет двигаться по наклону после отскока?Sidenote : Язык, на котором я работаю, - Java 1.8 с некоторой произвольной внешней графической библиотекой, но я не ищу код, чтобы просто подключиться к моему уже существующему коду, я ищу общее представление о том, что, по вашему мнению, я мог бы сделать. Кроме того, критически важным для проблемы является весь проект. на основе координат.
Большое спасибо за любой ввод или возможный ответ, и спросите меня, если вы хотели бы спецификации по проблеме!
1 ответ:
Www.cwynn.com/bounce это небольшая вещь html5 canvas, которую я сделал несколько лет назад, которая иллюстрирует, как op хотел справиться с "отказом"
У вас есть мяч B, который ударит линию L в точке столкновения C. B->C образует линию. Возьмите точку на этой линии за C и отразите ее через L, чтобы получить точку отражения R. Когда мяч ударяется о C, вы можете удалить его вектор направления и дать ему вектор C - >R. Однако вам нужно сбросить их скорость. Так что берите размер вектор направления, и масштабировать новый вектор направления, чтобы соответствовать.
Edit: решил добавить код (что заставило меня понять, что я забыл масштабировать их скорость)
//closestCollPt[0] is the line the 'player' will hit next var dist = player.position.dist(closestCollPt[0]); //the 'player' in my case is a circle, so this indicates collision if(dist < player.radius*2) { //the collision point to the reflection like I mentioned //in the text above var newDir = closestCollPt[0].vecTo(reflection); //I break out their parts, b/c I want to scale the vector //doable in one line, but hard to debug var newDirX = newDir.x; var newDirY = newDir.y; var newDirDist = newDir.dist(new Vector(0,0)); //for whatever reason I was calling the size of a vector //'dist' when I wrote this var currDirDist = player.direction.dist(new Vector(0,0)); //give the player the direction we got from Coll->Ref //scale it so their speed doesn't change player.direction = newDir.scale(currDirDist).scale(1/newDirDist); }
Решил добавить изображение...
Единственные "реальные" вещи-это мяч и коричневая линия"шарик" розовый, направляясь к точке контакта в центре на пути луча,
Проекция-это отражение шара через точку контакта, а отражение-это отражение точки проекции через точку контакта. линия.
Как только шар соприкоснется с коричневой линией, его вектор направления должен измениться с "пути" на "новый путь" (линия, которая находится на контакте и отражении)