3D空间中光线/矩形相交问题

3

我遇到了计算线段/射线是否与三维空间中的矩形相交的问题。这个矩形在平面上。我进行了搜索,唯一找到的是Ray and square/rectangle intersection in 3D,但我无法理解最后几步以及如何将其应用于我的系统。

所以我有一个射线

struct Ray
{
  Vector3 m_startPoint;  // P0
  Vector3 m_direction;   // Direction Unit Vector
  float m_length;         // Ray length
};

and I have a quad defined by

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
}

我现在遇到了困难...

我知道之前已经有人回答过这个问题,但是我无法在我的系统上使其正常运行,因此真的需要一些帮助。


我不确定你的“Quad”结构体是否完全定义了一个四边形。即使我将它们折叠到平面上,我怎么知道例如(0,0)和(1,1)是否定义了一个高度为零的四边形,其中(1,1)是一个基向量,还是一个以(0,1)和(1,0)为基向量的1x1四边形,或者是任何其他四边形?你是假设轴对齐吗? - Tommy
@Tommy 你好,嗯,可能吧。无论如何,我会调整四元数的定义,使其更易于使用。 - unknownSPY
我建议您首先执行光线-平面相交计算,然后一旦您在平面上获得了交点,通过投影到2D来确定它是否在矩形内部或外部。 - Joseph O'Rourke
@JosephO'Rourke,这正是我想做的,你可以向我展示一下在二维平面上投影的方法吗?谢谢。 - unknownSPY
2个回答

2
"你能向我展示在二维平面上投影的方法吗?" 或许这个可以帮到你。请注意,矩形的投影是一个凸四边形(通常不是矩形),因此您需要进行四个“LeftOf()”测试以验证投影点的包含性。您可以在许多地方找到“LeftOf()”,包括这本教材。不要忘记测试矩形是否位于垂直于xy平面的平面上,在这种情况下,您应该将其投影到xz平面或yz平面中的任何一个。"

0

你现有的dotProd测试只能告诉你光线的方向是沿着法线还是远离它。

你可能想要做的是:

  1. 获取起点和终点到平面的距离;
  2. 如果两个距离都具有相同的符号,则停止 - 没有交点;
  3. 否则计算交点 - 如果起始距离为s,结束距离为e,则必须在该点s /(s-e)沿着该行;
  4. 对点执行矩形内测试:如果其x在框的x范围内,其y在框的y范围内,则它在内部,光线击中矩形。否则不会。

你好,起点和终点是什么意思?你是指射线的起始点和结束点,还是指射线的开始和结束? - unknownSPY
是的,抱歉,那句话表述不清楚。所以起点就是字面上的 m_startPoint。终点是 m_startPoint + m_length * m_direction(假设有适当的运算符且方向为单位长度)。 - Tommy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接