Найти в Дзене
Степан Гончаров

Коллизии

Хотел конечно написать одну большую статью, но думаю, что лучше напишу половину сейчас, половину потом. И да - снова коллизии. Но сегодня будет что-то новенькое. А именно коллизии в 3D. Собственно сегодня я расскажу про пересечение прямой и плоскости в пространстве, а потом про пересечение ограниченного треугольника и прямой. Началось всё с того что я немного погуглил, чтоб что-нибудь подтолкнуло на путь решения задачи, но так как вы читаете эту статью, ничего определенного мне не удалось найти. Тогда я решил зайти из далека и посмотреть, как представляется прямая в пространстве. Очень распространенная тема представления прямой как пересечения 2х плоскостей. Но как вы понимаете, это не тот вариант, который может помочь составить уравнение исходя из 2х точек.
Тогда я решил, что можно представить прямую AB как систему x = A.x + t(A.x-B.x) y = A.y + t(A.y-B.y) z = A.z + t(A.z-B.z) Затем я брал уравнение плоскости, заданной некоторыми точками C,D и E как N = cross(CD,CE) N.x*x + N.y*y

Хотел конечно написать одну большую статью, но думаю, что лучше напишу половину сейчас, половину потом.

И да - снова коллизии. Но сегодня будет что-то новенькое. А именно коллизии в 3D. Собственно сегодня я расскажу про пересечение прямой и плоскости в пространстве, а потом про пересечение ограниченного треугольника и прямой.

Началось всё с того что я немного погуглил, чтоб что-нибудь подтолкнуло на путь решения задачи, но так как вы читаете эту статью, ничего определенного мне не удалось найти. Тогда я решил зайти из далека и посмотреть, как представляется прямая в пространстве. Очень распространенная тема представления прямой как пересечения 2х плоскостей. Но как вы понимаете, это не тот вариант, который может помочь составить уравнение исходя из 2х точек.

Тогда я решил, что можно представить прямую AB как систему

x = A.x + t(A.x-B.x)
y = A.y + t(A.y-B.y)
z = A.z + t(A.z-B.z)

Затем я брал уравнение плоскости, заданной некоторыми точками C,D и E как

N = cross(CD,CE)
N.x*x + N.y*y + N.z*z + D_ = 0

где D_ = -(N.x*C.x + N.y*C.y + N.z*C.z)

после чего можно было просто просто подставить числа

N.x*(A.x + t(A.x-B.x)) + N.y*(A.y + t(A.y-B.y)) + N.z*(A.z + t(A.z-B.z)) + D_ = 0

и выразить t

t = -(N.x * A.x + N.y * A.y + N.z * A.z + D_) / ((A.x - B.x) * N.x + (A.y - B.y) * N.y + (A.z - B.z) * N.z)

И, таким образом, данная непростая задача оказывалась так просто решена.

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

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

-2

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

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

На этом собственно и всё.

кодик прикреплен

-3