2012-01-10 17 views
3

Hei。ゲームを作っており、3D空間でのみ正方形や長方形に光線の交差点を探しています。ウェブを検索して多くの解決策を見つけましたが、私が理解できるものは何も2Dとラインセグメントの交差点スクリプトを持っていませんが、私はそれを3Dにしなければなりません。 どちらの側からも正方形または長方形と交差することは重要ではありませんが、交差点ベクトルを再度取得できる必要があるため、後で同じ光線交差点の他の交差点の前後に発生した場合は距離をテストできます。いけないexapleを表示する2Dを変更する必要があります知っているが、新しいとの両方を掲示作っ:Pythonや他の類似のスクリプト言語で3Dのレイと正方形/長方形の交差

どれ例が大幅に

編集

を理解されるであろう。

//this is the exaple it test a ray onto a plane then look to se if that point is in the rectangle and saves it to test for distanse later 
list Faces; //triangle faces 
list Points; // 

vector FindPoint(){ 
    //calcute the point of intersection onto the plane and returns it 
    //if it can intersect 
    //else return ZERO_VECTOR 
} 

integer point-in-quadrilateral(){ 
    //return 1 if the point is in the rectangular on the plane 
    //else return 0 
} 

default{ 

    state_entry(){ 
     integer n = (Faces != []); //return number of elements 
     integer x = 0; 
     while(x < n){ 
      vector intersection = FindPoint(FromList(Faces, x)); //take  out a element and runs it trough the function 
      if(intersection != ZERO_VECTOR){ 
       integer test = point-in-quadrilateral(FromList(Faces,  x)); //find out if the point is in rectangular 
       if(test == 1){ //if so 
        Points += intersection; //save the point 
       } 
      } 
      ++x; 
     } 

     float first; //the distanse to the box intersection 
     integer l = (Points != []); 
     integer d; 
     while(d < l){ 
      if(Dist(FromList(Points, d)) < first) //if the new distanse  is less then first 
       return 0; //then end script 
      ++d; 
     } 
    } 

} 


//this is the 2D version 
vector lineIntersection(vector one, vector two, vector three, vector four){ 
float bx = two.x - one.x; 
float by = two.y - one.y; 
float dx = four.x - three.x; 
float dy = four.y - three.y; 
float b_dot_d_perp = bx*dy - by*dx; 
if(b_dot_d_perp == 0.0) { 
    return ZERO_VECTOR; 
} 
float cx = three.x-one.x; 
float cy = three.y-one.y; 
float t = (cx*dy - cy*dx)/b_dot_d_perp; 
if(LineSeg){ //if true tests for line segment 
    if((t < 0.0) || (t > 1.0)){ 
     return ZERO_VECTOR; 
    } 
    float u = (cx * by - cy * bx)/b_dot_d_perp; 
    if((u < 0.0) || (u > 1.0)) { 
     return ZERO_VECTOR; 
    } 
} 

return <one.x+t*bx, one.y+t*by, 0.0>; 

}

答えて

3

R3の線のベクトル方程式を作成し、それをテストしている矩形の平面内のその線の交点を求めます。その後、解のポイントが境界内にあるかどうかをテストするだけで十分です。

t = (a * (x0 - rx) + b * (y0 - ry) + c * (x0 - rz))/(a * vx + b * vy + c * vz) 

a(x - x0) + b(y - y0) + c(z - z0) = 0 

は、あなたの矩形が

に位置し、平面の方程式である:

ソリューションのパラメータtはで見つけることができます

<x, y, z> = <rx + vx * t, ry + vy * t, rz + vz * t> 

は問題の行のベクトル式です。

なお:

<rx, ry, rz> 

は、ベクトル方程式の初期点であり、

<vx, vy, vz> 

は、パラメータtを差し込む、上記式その後

の方向ベクトルでありますあなたのベクトル方程式にあなたの距離をテストするためのポイントを与えるでしょう。

enter image description here

+0

レスポンスありがとうございます。あなたはそれのいくつかの部分をexplaneできますか? "x0 y0 z0"イコライザはx、y、zの等価になり、2番目の方程式はゼロになりますか?もしそうなら、それぞれの値をどのように計算するのですか? – TeaWave

+0

本質的に、はい。x0、y0、z0は、あなたの四角形と同じ平面にあるSOMEポイント(任意のポイントでもよい)の値です。その式の中のx、y、zについては、上に列挙した線方程式(r_ + v_ * t)の値を差し込みます。あなたはコードを書く上でどのように計画を立てることができますか?おそらくあなたがうまくいったと言った2dバージョンの例でしょうか?私はそれをより良く説明できるかもしれません。 –

+0

exapleと2D版のメインポストを編集しました。 a、b、cが平面の単位ベクトルであれば、何らかの創造力を発揮し、負傷していますか?線方程式のx0、y0、z0であるか?複数の組み合わせを実行しましたが、ゼロに等しくすることができます。 – TeaWave

1

あなたが3Dで、正方形/長方形の座標軸かと整合しているかどうかを言うことはありません。 3D矩形Rが空間上で任意の方向を向いていると仮定すると、ここでは1つの方法があります。 最初にあなたの光線をの飛行機に、を含む飛行機に置き換えます。R。これは、Rを乗算し、Rの平面上に配置する スケールファクタSを必要とし、Sについて解くことによって達成することができます。これにより、飛行機に点pが表示されます。今座標 面{XY、YZZX}のいずれかの上に、平面を投影し、RP。常に法線ベクトルに対して垂直に投影するのは避けなければなりません。常に可能です。そして、射影平面上の四辺形問題を解く。

開始する前に、線分がRの3D平面にあるかどうかを確認してください。そうであれば、それを個別に処理してください。

+0

レスポンスありがとうございます。四角形と四角形は3Dで任意の方法で回転できます。だから、私が正しく理解すれば、あなたが書いた部分は、まずRを含む平面にあなたの光線rを近づけます。これは、rを乗算してそれをRの面に置き、sを求めるにはスケールファクターを必要とすることによって達成できます。 Joel Carnettによって与えられた解は、それから与えられた交点ベクトルの点を使用し、それが境界内にあるかどうかを見つけるために点四辺形で解決します。 – TeaWave

+0

はい、あなたはそれを理解しています。私は明らかに高すぎるレベルに答えましたが、ジョエルは本質的に私が散文で説明した方程式を明確に表現しています。 –

6

もし点(=ベクトル)と光線と方向ベクトル、および点(=ベクトル)の長方形と側面を表す2つのベクトルを定義するときに溶液が非常に容易です。

Dがその方向を表す単位ベクトルであり、tは、その長さである、R0は、光線の起点であり、光線がR0 + t * Dとして定義されていると仮定する。

矩形は、コーナーポイントP0と、辺(辺の長さに等しい長さ)を表す2つのベクトルS1S2で表すことができます。表面に垂直な別のベクトルNが必要です。これは、外積に沿った単位ベクトルに等しく、S1S2です。

今、光線がPの矩形と交差すると仮定します。次に、光線の方向、Dは、通常のNとゼロでない角度にする必要があります。これはD.N < 0にチェックすることで確認できます。

交点を見つけるには、P = R0 + a * Dとします(ポイントは光線上にある必要があります)。今すぐaの値を見つける必要があります。ベクトルP0Pを探します。これはNに垂直でなければなりません。これはP0P.N = 0を意味し、a = ((P0 - R0).N)/(D.N)に減少します。

ここでポイントがrectの中にあるかどうかを確認する必要があります。これを実行するには、およびQ2P0Pに沿ってS2に沿って投影Q1を投影します。内側にある点の条件は、0 <= length(Q1) <= length(S1)0 <= length(Q2) <= length(S2)です。

この方法は、矩形だけでなく、あらゆるタイプの平行四辺形に適しています。

+0

良いポストをありがとう。あなたの投稿は問題の三角測量を助け、解決しました – TeaWave

+0

それは素晴らしいです。ありがとうございました! – Mikaelblomkvistsson

関連する問題