C++ Обнаружение столкновения между двумя точками и отскок от нормали в случае столкновения

У меня есть наземная настройка различных точек, некоторые из которых плоские, а другие - под углом, я пытаюсь проверить, есть ли столкновение между угловыми точками (не выровненными по оси).

У меня есть векторный массив, состоящий из двух поплавков в каждой точке — это каждая из точек земли.

Вот изображение того, как выглядит земля. http://i.imgur.com/cgEMqUv.png?1?4597

На данный момент я хочу проверить столкновения между точками 1 и 2, а затем перейти к остальным.

Я буду использовать пункты 1 и 2 в качестве примера.

g1x = 150; g2x = 980;
g2x = 500; g2y = 780;

dxdy этого dx = 350 и dy = -200.

Нормальный x этого - dy, а нормальный y - -dx

nx = -200;
ny = -350;

нормализовано, это длина между точками 1 и 2, которая равна 403,11.

nx/нормализованный = -0,496 ny/нормализованный = -0,868

//get position of object - Don't know if its supposed to be velocity or not
float vix = object->getPosition().x;
float viy = object->getPosition().y;

//calculate dot product - unsure if vix/viy are supposed to be minused
float dot = ((-vix * nrmx) + (-viy * nrmy)) * nrmx; //= -131.692

Верна ли эта информация для вычисления нормального и скалярного произведения между двумя точками.

Как я могу проверить, есть ли столкновение с этой линией, а затем отразить по нормали.

Спасибо :) любые изменения приветствуются.


person JamesLJ    schedule 15.04.2014    source источник
comment
Я предлагаю вам взять книгу по линейной алгебре (или даже по игровой математике). Если у вас есть одна из этих проблем, то, вероятно, у вас будет больше подобных. Для начала изучите такие вещи, как векторная проекция или en.wikipedia.org/wiki/Distance_from_a_point_to_a_line. .   -  person Cramer    schedule 16.04.2014


Ответы (1)


Скажем, у вас есть частица в положении x, движущаяся со скоростью v, и граница определяется линией между a и b.

Мы можем найти, как далеко вдоль границы (как дробь) частица сталкивается, спроецировав c-a на b-a< /b> и делением на длину ||b-a||. Это,

u = ((c-a).((b-а)/||б-а||))/||б-а|| == (c-a).(b-a) / | |b-а||2.

Если u > 1, то частица пролетает границу со стороны b, если u ‹ 0, то частица пролетает границу со стороны сторона. Точка столкновения будет

c = a + u b.

Время до столкновения можно найти, решив

x + t v = a + s (b-a)

для т. Матрицу отражения можно найти здесь. Но его нужно будет повернуть на 90 градусов (или pi/2), чтобы вы отражали ортогонально линии, а не поперек нее.

С точки зрения нескольких границ, рассчитайте время до столкновения для каждой из них, отсортируйте по этому времени (отбрасывая отрицательное время) и проверьте наличие столкновений по списку. Как только вы нашли тот, с которым вы столкнетесь, вы можете переместить свою частицу в точку столкновения, отразить ее скорость, изменить delta t и переделать все заново. снова (игнорируя тот, с которым вы только что столкнулись), поскольку вы можете столкнуться с более чем одной границей в крайнем случае (понятно? Это математическая игра слов).

Линейная алгебра может быть забавной, и вы можете делать с ней гораздо больше, знакомство с линейной алгеброй позволяет вам делать некоторые важные вещи. Удачи!

person Cramer    schedule 15.04.2014