Выпуск 2D Векторов Физики Игр - PullRequest
2 голосов
/ 13 ноября 2010

Я работал над простой программой на C #, в которой Ball *1004* [X, Y] периодически увеличиваются.реализовать метод обнаружения столкновений, но я пытаюсь определить, как отразить мяч под углом, отражая его назад по той же линейной траектории.

dx = -dx //This bounces the ball back along the same linear path
dy = -dy

Решение Тригонометрия

theta = range between 0<theta<=360 depending on where it bounced
x = cos(theta)*time
y=  sin(theta)*time

Ответы [ 4 ]

9 голосов
/ 13 ноября 2010

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

Программа такого рода - отличная возможность для обучения как программированию, так и физике.Я рекомендую вам сначала написать программу, которая имитирует очень простое подпрыгивание.Как вы заметили, когда объект движется прямо вниз и попадает на горизонтальную поверхность, вы можете смоделировать отскок как просто реверсирование вертикальной составляющей скорости.Просто поймите это правильно;нет гравитации, нет ничего.Это отличное начало.

Затем попробуйте добавить отскакивание от горизонтальных стен тем же способом.

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

Затем добавьте гравитацию.Затем добавьте трение из воздуха.Затем добавьте тот факт, что мяч может вращаться.Добавьте эластичность, чтобы вы могли моделировать деформацию шара.

Как только вы доберетесь до этой точки, если вы захотите ввести случайность, вы сможете понять, как это сделать.Например, вы можете ввести случайность, сказав: «Хорошо, когда мяч ударяется о стенку и деформируется, я добавлю случайный элемент, который изменяет свою деформацию на 0-10%».Это изменит то, как симулятор отскакивает от мяча.Вы можете экспериментировать с различными видами случайности: например, добавлять случайные воздушные потоки.

3 голосов
/ 13 ноября 2010

Вы должны будете добавить в случайности самостоятельно. Перефразируя ваш вопрос: «Детерминистически он отскакивает от угла тета. Как я могу заставить его отскочить назад под углом тета + эпсилон, где эпсилон - какое-то случайное значение?»

Чтобы повернуть вектор, см. this . Вы просто укажете тета.

псевдокод:

RotateVector(vec):
    bounce_vec = [-vec.x vec.y];  //deterministic answer is negative x, normal y
    bounce_angle = acos(dot(vec,bounce_vec) / (norm(vec)*norm(bounce_vec)));
    modified_angle = bounce_angle + random_number();
    ca = cos(modified_angle);
    sa = sin(modified_angle);
    rotation_matrix = [ca -sa; sa ca];
    return rotation_matrix * vec;

В строке 3 используется закон косинусов для определения угла. В строке 4 этот угол изменяется случайным образом. Остальная часть функции поворачивает исходный вектор на ваш новый угол.

2 голосов
/ 13 ноября 2010

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

0 голосов
/ 13 ноября 2010

«случайно, хотя и применяется к основным законам физики», похоже на оксюморон.Однако ...

Если вы хотите, чтобы он подпрыгивал в случайном направлении , сохраняя текущую скорость , вы можете сделать что-то вроде этого (псевдокод):

  • сначала верните канонический путь (dx = -dx или dy = -dy в зависимости от столкновения)
  • , затем преобразуйте dx и dy в полярные координаты (тета и r)
  • небольшое дрожание тэты (+ или - на несколько градусов, в зависимости от вашего вкуса)
  • убедитесь, что тета не направляется к стене, которую вы только что отскочили
  • преобразовать тэту и r обратно в dx и dy

Это сохранит скалярный импульс.

...