2013-07-20 217 views
-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 
    } 

我該怎麼去寫這個函數。非常感謝幫助。 P.S Point3D具有所有必需的功能。如交叉,規範等等

+0

我試圖通過代表三角形矩形,然後檢測碰撞,但這樣複雜的真快。我沒有說你們寫我問的代碼,我該怎麼寫。相信我,即使它看起來像這樣,我也不會懶惰。我對這個領域也很天真。謝謝。 –

+0

我在3D中做過直線交集。但我不明白如何做一個矩形 –

+0

好吧,你可以在3D中與* plane *相交嗎? –

回答

2

好吧,讓我們把這個答案的形式,而不是所有的這些意見。

下打破你的問題爲子問題:

1)發現,該矩形位於,形式Ax+By+Cz+D=0兩種方法飛機:

方法一:

  • 查找兩條正交線的方程;根據定義,矩形的邊緣將是正交的。

  • 給出兩條正交線,找出如何得到線所定義的平面方程,形式爲Ax+By+Cz+D=0

這裏一些提示:

  • 假設兩個正交線雙雙經歷了原點。讓他們成爲矢量。這兩個向量的交叉積是什麼意思?

  • 什麼是跨產品載體和你正在尋找的平面之間的關係?具體來說,叉積矢量與常數A,B和C之間的關係是什麼?

方法二:

  • 選出三個在不位於一個行中的矩形的點;顯然任何三個角落都可以做到。在X,Y,Z在Ax+By+Cz+D=0使三個新的方程替換那些點;求解A,B,C和D的方程。

2)一旦得到平面方程,求出平面與光線的交點。

3)現在,你有交叉點 - 如果存在的話,記住,光線可能是與平面平行,或可能在飛機上是完全 - 檢查,看看是否交點是在矩形內。

  • 提示:這是一個更爲普遍的問題「這是多邊形內的這個點」的特例。