Я создаю свой собственный маленький игровой движок для обучения. Так в основном чисто Java. У меня есть Линии, которые определены начальной и конечной точкой (координаты x и y)
Теперь у меня есть шар с вектором скорости. Я хочу «отскочить» от стены, которую можно расположить под любым возможным углом. Как я могу узнать новый вектор скорости после столкновения? Я знаю точки S, P1 и P2 (см. Изображение)
Я думал о вычислении угла и изменении компонентов x и y. Но я не могу найти способ сделать это для всех возможных углов.
Я мог бы найти много решений для стен, которые параллельны границам холста, но нет общего решения. Как «большие» игровые движки справляются с этой распространенной проблемой?
edit :
Мои обновленные методы векторного класса:
public static Vector bounce(Vector normal, Vector velocity) {
Vector tmp = Vector.multiplication(2*Vector.dot(normal,velocity), normal);
return Vector.addition(tmp, velocity);
}
public static Vector multiplication(double multi, Vector n) {
Vector new_vector = new Vector(n.x * multi, n.y * multi);
return new_vector;
}
public static double dot(Vector a, Vector b) {
return a.x*b.x + a.y*b.y; // + a.z*b.z if you're in 3D
}
Моя тестовая функция :
@Test
public void testBounce() {
Vector normal_vector_corrected = new Vector(0, 1);
Vector start_velocity = new Vector(3, -3);
Vector bounced_vector = Vector.bounce(normal_vector_corrected, start_velocity);
System.out.println("normal vector: "+normal_vector_corrected);
System.out.println("start_velocity: "+start_velocity);
System.out.println("bounced_vector "+bounced_vector);
}
Вывод такой:
normal vector: <Vector x=0,00, y=1,00>
start_velocity: <Vector x=3,00, y=-3,00>
bounced_vector <Vector x=3,00, y=-9,00>
Согласно моим расчетам, bounced_vector
должно быть вместо x = 3, y = 3. Где моя ошибка? (Мой пример как изображение:)
edit2: я обнаружил, что это должно быть return Vec.add(tmp, v);
. Кроме того, мне пришлось инвертировать вектор скорости.