Направление для двумерного вектора только по одной оси

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

Чтобы получить направление для луча, я делаю следующее:

(quad.position + quad.velocity) - quad.position

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

Я использую это направление, используя этот луч для проверки столкновения между другими четырехугольниками. Это можно сделать, рассчитав точное время вдоль луча, когда произошло попадание. Я делаю это, имея положение 2-го четырехугольника - начало луча (положение 1-го четырехугольника) / направление луча. Очевидно, что когда одна из осей направления равна 0, я получаю ошибку DivideByZero.

Мне было интересно, что я могу сделать, чтобы исправить это поведение. Мне предстояло еще сделать рейкастинг, но как бы бесконечный. Или, другими словами, сделайте приведение лучей, но по прямой линии вдоль оси, имеющей 0 в качестве направления. Когда я передаю какое-то произвольное число, например 0,00001, все работает, но луч немного отклоняется от прямой линии, которую я хочу.

Я искал в Интернете, но не могу найти ничего полезного.


person Qlii256    schedule 24.07.2020    source источник
comment
Я не знаю, что вы делаете, когда делите один вектор на другой, но я почти уверен, что это не лучший способ проверки на столкновение.   -  person Beta    schedule 24.07.2020
comment
Это примерно так: scratchapixel.com/lessons/3d-basic-rendering/   -  person Qlii256    schedule 24.07.2020
comment
После YT исходный код можно найти здесь: github.com/ OneLoneCoder/olcPixelGameEngine/blob/master/Videos/ В частности, функция RayVsRect.   -  person Qlii256    schedule 24.07.2020


Ответы (1)


  • Вектор имеет нулевую длину только тогда, когда компоненты ВСЕ равны нулю, например {x:0, y:0, z:0}.

  • Только когда вектор имеет нулевую длину, его направление не определено.

То же самое относится к векторам во всех измерениях 2D, 3D, 4D, ..., nD и даже к одномерным векторам.

Чтобы получить длину (величину) вектора, используйте теорему Пифагора

eg

vec = {x: 1, y: 1, z: 1}
length = (vec.x ^ 2 + vec.y ^ 2 + vec.z ^ 2) ^ 0.5
// AKA length = sqrt(vec.x * vec.x + vec.y * vec.y + vec.z * vec.z)

// in 2D
vec = {x: 1, y: 1}
length = (vec.x ^ 2 + vec.y ^ 2) ^ 0.5

Если вектор имеет нулевую длину, то он ничего не может перехватить.

vec = {x: 0, y: 0, z: 0}
if (vec.x == 0 && vec.y == 0 && vec.z == 0) { return NO_INTERCEPT }

Математика, на которую вы ссылались, в комментариях не приведет к делению на ноль, если вектор имеет длину, например, {x:0, y:1} length == 1 верно.

Я предполагаю, что вы неверно истолковали математику в ссылке.

person Blindman67    schedule 25.07.2020
comment
После некоторого исследования вы на 100% правы, что, получив величину вектора (длину), я могу использовать его для управления лучом. - person Qlii256; 26.07.2020