我的 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 应该是?我也不确定是否正确检查光线是否与平面相交
从内还是外?
Thanks
您的代码看起来大部分都很好,请参阅这张幻灯片 http://www.cs.princeton.edu/courses/archive/fall00/cs426/lectures/raycast/sld017.htm。由于您的平面本质上被定义为从特定点(封装在偏移参数中)开始并且与法向量正交的一组光线,因此您只需将视图光线上的点的定义插入到为了确定视线上的哪个点定义了这样一条正交光线。
问题在于您的视线是否在平面上。在这种情况下,观察光线和法线光线将是正交的,因此它们的点积将为 0,并且您将得到除以 0 的异常。您需要提前检查这一点:如果观察向量与法线的点积为 0,则意味着观察光线与平面平行,因此要么不存在交点,要么存在无限数量的交点。相交(射线在平面内)。不管怎样,我认为对于光线追踪,你通常会说没有交点(即没有任何可渲染的东西),因为在后一种情况下,你正在正面看着一个二维平面,所以你不会什么也看不见。
我不认为你有任何理由需要专门处理“接近 0”。光线要么与平面平行且无需渲染,要么不平行且与平面恰好相交于一点。最终您会遇到浮点舍入错误,但这只是渲染中的一个小错误源,无论如何,它只是场景的近似值。只要保持尺寸相当大,浮点误差就应该很小。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)