У меня проблемы с вычислением, пересекает ли линия / луч прямоугольник (то есть на плоскости) в трехмерном пространстве.
Я искал, и единственное, что я нашел, было Пересечение луча и квадрата / прямоугольника в 3D но я просто не могу понять последние шаги и как применить его для моей системы.
Итак, у меня есть луч
struct Ray
{
Vector3 m_startPoint; // P0
Vector3 m_direction; // Direction Unit Vector
float m_length; // Ray length
};
и у меня есть четырехугольник, определенный
struct Quad
{
Vector3 p1;
Vector3 p2;
Vector3 p3;
Vector3 p4;
Vector3 normal;
}
Сначала я вычислил, будет ли луч когда-либо попадать в плоскость, используя скалярное произведение.
float dotProd = D3DXVec3Dot(&ray.m_direction, &quad.normal);
if (dotProd < 0) // if <0 ray will travel into the plane
{
// Get the point of intersection
float distToIntersection
//Vector3D intersectPoint = ray.m_startPoint + (distToIntersection * ray.m_direction);
// Check whether the point of intersection is within the bounds of the Quad
}
И вот тут я застреваю …
Я знаю, что на него уже отвечали, но я не могу заставить его работать для моей системы, поэтому буду очень признателен за помощь.
Ваш существующий тест dotProd просто сообщает вам, является ли направление вашего луча нормальным или нет.
Что вы, вероятно, хотите сделать, это:
s
и конечное расстояние e
тогда это обязательно в точке s / (s - e)
вдоль линии;«Не могли бы вы показать мне метод проецирования на 2D?»
Может быть, это поможет. Обратите внимание, что проекция прямоугольника представляет собой выпуклый четырехугольник (обычно это не прямоугольник), поэтому вам понадобится четыре LeftOf( )
тесты для проверки включения
прогнозируемой точки.
Ты можешь найти LeftOf( )
во многих местах, в том числе этот учебник.
Не забудьте проверить, лежит ли прямоугольник в плоскости, ортогональной к ху-самолет, в этом случае вы должны проецировать на XZ— или уг-самолет.