与えられた平面と交差する小さな立方体(グリッドボクセル)のリストを取得したいようです。
最も簡単なアプローチ:
キューブエッジとプレーンの交差を検出します。
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の両方)線場合のボクセル配列を生成するために、より高度な方法があります。おそらく似た何かがe
とr
は、すべてのキューブのために同じままなので、一度それらを計算すること
// 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-平面交差テストコードである平面ボクセル化のためにも注意が存在します後で使用してください。
出典
2017-12-22 06:17:10
MBo
私のアルゴリズムを一度行って、変更を説明してください。私はそれを働かせることができます。ありがとう –
Emm ...あなたのアルゴリズムは何ですか?あなたのチェックは正しくない - それは偽陽性の結果を生み出すことができます。そして私はあなたに手がかりを与えました - すべての小さな立方体をチェックするブルートフォースを取り除く方法。 – MBo
プログラマーの初心者であるため、私はあなたが私の小切手を少し修正することができれば本当にうれしいでしょう。私はアルゴリズムをコーディングするのが少し難しいと思っています。 –