2017-12-22 27 views
0

3つの頂点から平面の方程式を見つけました。 境界ボックス(つまり大きなキューブ)がある場合、平面が大きなキューブを切り取るグリッドの位置(小さな立方体)はどのようにして決定できますか。3つの頂点から形成された平面でカットされたグリッドを決定する

私は現在、このアプローチを以下午前:

各小立方体の中心は、(X P、Y P、ZP)は、すなわち平面に垂直距離を計算すると言う、(XPの+ B Ypと+ C * Zpのは+ d)/(SquareRoot Of(a^2 + b^2 + c^2))。これは、(smallCube * SquareRoot(3)の長さ)/ 2以下でなければなりません。 この基準が満たされれば、この小さな立方体の位置で大きな立方体を切断すると仮定します。

、B、C、Dは、フォーム斧+の平面の係数は、ある+ CZ + D = 0

誰かが私に教えてできるかどうか私があれば、私は、本当に喜んでいるだろう何か間違っている(または)、他の簡単なアプローチをしている。

答えて

1

与えられた平面と交差する小さな立方体(グリッドボクセル)のリストを取得したいようです。

最も簡単なアプローチ:

キューブエッジとプレーンの交差を検出します。

aX0 + bY + c*Z0 + d = 0 

及びYは、立方体の範囲にあることをチェックする:例えば、AABの垂直エッジとの交点(X0、Z0が一定である)は、未知のYは、この方程式を解くことによって計算されるかもしれません。小さいキューブ座標(0, ky=Floor(Y/VoxelSize), 0)を取得し、次に隣のボクセルを順番にチェックする(プレーン係数を考慮して実際の候補のみをチェックする)。

candidates: 
0,ky,0 
1,ky,0 
0,ky-1,0 
0,ky+1,0 
0,ky,1 

Amanatides /ウーアルゴリズム等(2Dおよび3Dの両方)線場合のボクセル配列を生成するために、より高度な方法があります。おそらく似た何かがerは、すべてのキューブのために同じままなので、一度それらを計算すること

// Test if AABB b intersects plane p 
int TestAABBPlane(AABB b, Plane p) { 
    // Convert AABB to center-extents representation 
    Point c = (b.max + b.min) * 0.5f; // Compute AABB center 
    Point e = b.max - c; // Compute positive extents 

    // Compute the projection interval radius of b onto L(t) = b.c + t * p.n 
    float r = e[0]*Abs(p.n[0]) + e[1]*Abs(p.n[1]) + e[2]*Abs(p.n[2]); 

    // Compute distance of box center from plane 
    float s = Dot(p.n, c) - p.d; 

    // Intersection occurs when distance s falls within [-r,+r] interval 
    return Abs(s) <= r; 
} 

(いくつかの説明が含まれています)。ここ

this pageからAABB-平面交差テストコードである平面ボクセル化のためにも注意が存在します後で使用してください。

+0

私のアルゴリズムを一度行って、変更を説明してください。私はそれを働かせることができます。ありがとう –

+0

Emm ...あなたのアルゴリズムは何ですか?あなたのチェックは正しくない - それは偽陽性の結果を生み出すことができます。そして私はあなたに手がかりを与えました - すべての小さな立方体をチェックするブルートフォースを取り除く方法。 – MBo

+0

プログラマーの初心者であるため、私はあなたが私の小切手を少し修正することができれば本当にうれしいでしょう。私はアルゴリズムをコーディングするのが少し難しいと思っています。 –

関連する問題