-1

我在 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
    }

我将如何编写这个函数。非常感谢您的帮助。PS Point3D 具有所有需要的功能。比如交叉,归一化等...

4

1 回答 1

3

好吧,让我们以答案的形式来代替所有这些评论。

将您的问题分解为子问题:

1)找到矩形所在的平面,形式Ax+By+Cz+D=0有两种方法:

方法一:

  • 求两条正交线的方程;根据定义,矩形的边缘将是正交的。

  • 给定两条正交线,找出如何以Ax+By+Cz+D=0.

这里有一些提示:

  • 假设两条正交线都经过原点。使它们成为向量。这两个向量的叉积是什么意思?

  • 叉积向量与您要寻找的平面之间有什么关系?具体来说,叉积向量与常数 A、B 和 C 之间的关系是什么?

方法二:

  • 选取矩形上不成一条直线的三个点;显然任何三个角都可以。将 x、y、z in 中的这些点替换为Ax+By+Cz+D=0三个新方程;求解 A、B、C 和 D 的方程。

2)一旦你有了平面方程,计算出平面与射线的交点。

3) 现在你有了交点——如果存在,请记住,光线可能平行于平面或可能完全在平面内——检查交点是否在矩形内。

  • 提示:这是“这个点在多边形内”这个更普遍的问题的一个特例。
于 2013-07-20T02:33:33.443 回答