2016-11-10 5 views
0

3D平面上のプレーヤーで、彼の周りのオブジェクトと衝突する可能性のあるゲームを作りたいと思います。私は、ゲーム内のすべての3Dモデルを入力できない不可視矩形でラップすることで衝突を起こす予定です。私は各頂点の最高点と最低点を見つけるために各頂点のX、Y、Zの最小/最大を計算するコードを書いています。これをどのように直角プリズムにするのですか?ここでX、Y、Z頂点の最小/最大を使用して方形プリズムを計算する方法

は、これまでの私のコードです:

public CollisionModel(List<Vector3f> vert) { 
    float xLow = 1000; 
    float xHigh = 0; 
    float yLow = 1000; 
    float yHigh = 0; 
    float zLow = 1000; 
    float zHigh = 0; 
    for(Vector3f v : vert) { 
     if(v.x > xHigh) { 
      xHigh = v.x; 
     } else if(v.x < xLow) { 
      xLow = v.x; 
     } 
     if(v.y > yHigh) { 
      yHigh = v.y; 
     } else if(v.y < yLow) { 
      yLow = v.y; 
     } 
     if(v.z > zHigh) { 
      zHigh = v.z; 
     } else if(v.z < zLow) { 
      zLow = v.z; 
     } 
    } 
} 
+1

私はあなたが頂点の意味を混同していると思います。あなたは最高と最低のポイントを持つことができるように '頂点'について話します。頂点自体が3D空間内のポイントではありませんか? – nhouser9

+0

他に何が必要ですか? 8つの(x、y、z)の組み合わせを頂点として使用してください。 – Bubletan

+0

申し訳ありませんが、私は非常に明確ではなかった、私は頂点の配列を反復処理することによって、3Dモデルの最高と最低、そして最も遠い、最も遠い、そして最も遠い頂点を見つけようとしています。私はこれらの点を見つけることができたら、モデル自体の周りに直角プリズムを作ることができたと思いました。 –

答えて

1
  1. min,maxの初期値は0,1000ハードコーディングされていない最初の頂点でなければなりません!
  2. min,maxがあり、という境界ボックスがあります。これはプリズムと呼ばれています。

ここで、衝突テストを行う必要があります。問題はオブジェクトが移動/回転する可能性が高いことです。最初にボックスに変形を適用する必要があります。そこで、境界ボックスの頂点を最初に構築しましょう。

p0 = (xLow , yLow , zLow ) 
p1 = (xHigh , yLow , zLow ) 
p2 = (xHigh , yHigh, zLow ) 
p3 = (xLow , yHigh, zLow ) 
p4 = (xLow , yLow , zHigh) 
p5 = (xHigh , yLow , zHigh) 
p6 = (xHigh , yHigh, zHigh) 
p7 = (xLow , yHigh, zHigh) 

今すぐそれらのそれぞれにオブジェクトtransformationsを適用:3Dでは8ポイントです。最後に、衝突テストを追加する必要があります。したがって、2つの境界ボックスが衝突するかどうかをテストすることが最も一般的です。そのためには、bbox1(q0..q7)の稜線がbbox2(p0..p7)の任意の面と交差するかどうかをテストする必要があります。顔は以下のとおりです。

p0,p1,p2,p3 
p4,p5,p6,p7 
p0,p1,p5,p4 
p1,p2,p6,p5 
p2,p3,p7,p6 
p3,p0,p4,p7 

とエッジラインは次のとおりです。交差点自体の

q0,q1 
q1,q2 
q2,q3 
q3,q0 
q4,q5 
q5,q6 
q6,q7 
q7,q4 
q0,q4 
q1,q5 
q2,q6 
q3,q7 

あなたは式(私はあなたのためにそれを導き出すか、検索するのが面倒だ)が、ここで最初のグーグルグーグルする必要があります私が見つけたヒット:

はいよあなたは直面している三角形対線の交差点を2つの結合された三角形として使うことができます...また、別のオプションもあり、それは他のbboxの座標系に変換して、x,y,z = minそしてmaxとし、他の2つの座標が範囲内にあるかどうかをテストしてください。

関連する問題