【问题标题】:Ray/Rectangle intersection in 3D space3D 空间中的射线/矩形相交
【发布时间】:2015-08-27 10:08:46
【问题描述】:

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

我已经搜索过,唯一找到的是Ray and square/rectangle intersection in 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
}

这就是我卡住的地方......

我知道它之前已经回答过,但我无法让它适用于我的系统,所以非常感谢一些帮助。

【问题讨论】:

  • 我不确定您的 Quad 结构是否完全定义了一个四边形。即使我将它们折叠到飞机上,我怎么知道例如? (0, 0) 和 (1, 1) 是否定义了以 (1, 1) 为基向量的零高度四边形或以 (0, 1) 和 (1, 0) 为基向量的 1x1 四边形,或任何完全其他四边形?您是否假设轴对齐?
  • @Tommy 嗨,嗯,可能。我将调整 Quad 定义,使其更易于使用。
  • 我建议您首先执行ray-plane intersection 计算,然后,一旦您在平面上确定了交点,确定它是在矩形内部还是外部(通过投影到 2D)。
  • @JosephO'Rourke 这就是我想做的事情,你能告诉我投影到 2D 的方法吗?谢谢

标签: c++ geometry intersection raytracing


【解决方案1】:

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

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



你可以在很多地方找到LeftOf( ),包括this textbook

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

【讨论】:

    【解决方案2】:

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

    你可能想做的是:

    1. 获取起点和终点到平面的距离;
    2. 如果两个距离的标志相同,则停止 - 没有交叉路口;
    3. 否则计算交点——如果开始距离是s,结束距离是e,那么它必然在沿线的点s / (s - e)
    4. 对该点执行矩形内点测试:如果它的 x 在盒子的 x 范围内,并且它的 y 在盒子的 y 范围内,那么它在盒子的内部并且光线照射矩形。否则不会。

    【讨论】:

    • 你好,起点和终点是什么意思?你是指光线的开始和结束还是光线?
    • 是的,抱歉,不清楚。所以起点实际上是m_startPoint。终点是m_startPoint + m_length * m_direction(假设有适当的运算符并且该方向是单位长度)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-25
    • 2012-02-26
    • 1970-01-01
    相关资源
    最近更新 更多