【问题标题】:Is this plane-ray intersection code correct?这个平面射线相交代码是否正确?
【发布时间】:2012-11-11 03:45:55
【问题描述】:

我的 Plane 类有两个字段:

public Vector3 Norm; //normal vector 
public double Offset; //signed distance to origin

这是我用于交集的代码,不知道是否正确。我加倍 检查了我的方程式和所有内容,但我想从人们那里获得反馈 对此更有经验。

public override Intersection Intersect(Ray ray)
{
    // Create Intersection.
    Intersection result = new Intersection();

    // Find t.
    double t = - (Vector3.Dot(Norm,ray.Start) + Offset) / (Vector3.Dot(Norm, ray.Dir));
    if (t < 0) // the ray does not hit the surface, that is, the surface is "behind" the ray
        return null;

    // Get a point on the plane.
    Vector3 p = ray.Start + t * ray.Dir;

    // Does the ray intersect the plane inside or outside?
    Vector3 planeToRayStart = ray.Start - p;
    double dot = Vector3.Dot (planeToRayStart, Norm);
    if (dot > 0) {
        result.Inside = false;
    } else {
        result.Inside = true;
    }

    result.Dist = t;
    return result;
}

另外,如果 t 接近 0,我不确定该怎么办?我应该检查 epsilon 和有多大 epsilon 应该是什么?另外我不确定我是否正确检查光线是否与平面相交 从内到外?

谢谢

【问题讨论】:

    标签: game-physics raytracing


    【解决方案1】:

    您的代码看起来大部分都很好,请参阅this slide。由于您的平面本质上定义为从特定点开始的一组光线(封装在偏移参数中)并且与法线向量正交,因此您只需将定义插入查看光线上的点为了确定视线上的哪个点定义了这样的正交射线。

    如果您的观察光线在平面内,问题将是。在这种情况下,观察光线和法线光线将是正交的,因此它们的点积将为 0,您将得到除以 0 的异常。您需要提前检查:如果观察向量与法线的点积为 0,则表示观察光线平行于平面,因此要么没有相交,要么存在无限多交叉点(射线在平面内)。无论哪种方式,我认为对于光线追踪,您通常只会说没有交点(即,没有要渲染的内容),因为在后一种情况下,您正在查看一个二维平面,因此您不会什么都看不见。

    我认为您没有任何理由需要特别处理“接近 0”​​。光线要么平行于平面,没有要渲染的东西,要么不平行,它与平面恰好在一个点相交。您最终会遇到浮点舍入错误,但这只是渲染中的一个小错误来源,无论如何只是场景的近似值。只要您保持尺寸相当大,浮点错误应该是微不足道的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-02-14
      • 1970-01-01
      • 1970-01-01
      • 2014-07-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多