我在C#中制作一个简单的Ray Traycer。对于我的视口,我有一个矩形类。
public class Rectangle3D
{
public readonly Point3D Point1;
public readonly Point3D Point2;
public readonly Point3D Point3;
public readonly Point3D Point4;
public Rectangle3D(Point3D point1, Point3D point2, Point3D point3, Point3D point4)
{
this.Point1 = point1;
this.Point2 = point2;
this.Point3 = point3;
this.Point4 = point4;
}
public Point3D FindCrossPoint(Ray ray)
{
//Intersection
}
我该怎么写这个函数呢。非常感谢您的帮助。P.S Point3D具有所有必需的功能。如交叉、归一化等。
好吧,让我们把它放在一个答案的形式中,而不是所有的注释。
将您的问题分解为子问题:
1) 找到矩形所在的平面,形式为Ax+By+Cz+D=0
两种方法:
方法一:
-
求出两条正交线的方程;根据定义,矩形的边缘将是正交的。
-
给定两条正交线,求出这些线定义的平面的方程,形式为
Ax+By+Cz+D=0
。
这里有一些提示:
-
假设两条正交线都穿过原点。使它们成为矢量。这两个向量的叉积是什么意思?
-
叉积向量和你要寻找的平面之间的关系是什么?具体来说,叉积矢量与常数A、B和C之间的关系是什么?
方法二:
- 在矩形上拾取三个不在一条线上的点;显然,任何三个角都可以。用
Ax+By+Cz+D=0
中的这些点代替x、y、z,得到三个新的方程;求解A、B、C和D的方程
2) 一旦有了平面的方程式,就可以计算出平面与光线的交点。
3) 现在有了交点——如果它存在,请记住,光线可能平行于平面,也可能完全在平面内——检查交点是否在矩形内。
- 提示:这是"这一点在多边形内吗"这一更普遍问题的一个特例