我在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具有所有需要的功能。如交叉,规范化等......
答案 0 :(得分:2)
好吧,让我们以答案的形式而不是所有这些评论。
将问题分解为子问题:
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)现在您有交叉点 - 如果它存在,请记住,光线可能与平面平行或者可能完全在平面内 - 检查交叉点是否在矩形内。< / p>