3D空间中的射线/矩形交叉

时间:2015-06-11 15:42:36

标签: c++ geometry intersection raytracing

我无法计算线条/光线是否与3d空间中的矩形(在平面上)相交。

我搜索过,我找到的唯一的东西是Ray and square/rectangle intersection in 3D,但我不能完全理解最后的步骤以及如何将它应用于我的系统。

所以我有一个Ray

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
}

这就是我被困的地方......

我知道它之前已经得到了回答,但我不能让它适用于我的系统,所以非常感谢你的帮助。

2 个答案:

答案 0 :(得分:0)

您现有的dotProd测试只是告诉您光线的方向是正常还是远离正常。

您可能想要做的是:

  1. 从平面获取起点和终点的距离;
  2. 如果两个距离都有相同的符号,那么停止 - 没有交叉点;
  3. 否则计算交叉点 - 如果起始距离为s且结束距离为e,那么它必须位于该行的s / (s - e)点;
  4. 对该点执行一个矩形点测试:如果它的x在盒子的x范围内,并且它的y在盒子的y范围内,则它在内部,并且光线照射到矩形。否则就没有。

答案 1 :(得分:0)

  

“你能告诉我投影到2D的方法吗?”

也许这会有所帮助。请注意,矩形的投影是凸四边形(通常不是矩形),因此您需要进行四次LeftOf( )测试以验证包含 投射点。

<小时/> RectProjection 您可以在很多地方找到LeftOf( ),包括this textbook

不要忘记测试矩形是否位于与 xy 平面正交的平面中,在这种情况下,您应该投影到 xz - 或者 YZ - 平面。