私は簡単なヘルパーメソッドを書いています。whochは点から飛行機までの距離を計算します。しかし、それは無意味な結果を返すようです。私がプレーンを作成するために持っているコードはこうです:飛行機までの距離
Plane = new Plane(vertices.First().Position, vertices.Skip(1).First().Position, vertices.Skip(2).First().Position);
かなり単純ですが、私はあなたが同意すると思います。 3点を使用してXNA平面構造を作成します。私はすぐにこの後に今
、:
foreach (var v in vertices)
{
float d = Math.Abs(v.ComputeDistance(Plane));
if (d > Constants.TOLERANCE)
throw new ArgumentException("all points in a polygon must share a common plane");
}
私は飛行機を構築するために使用される頂点の同じセットを使用して、私はその例外がスローされます!数学的には、これらの3つの点が平面上になければならないので、これは不可能です。
マイComputeDistance方法は次のとおりです。
public static float ComputeDistance(this Vector3 point, Plane plane)
{
float dot = Vector3.Dot(plane.Normal, point);
float value = dot - plane.D;
return value;
}
ASIはそれを理解し、これが正しいです。だから私は何が間違っていますか?または、XNAの実装でバグが発生する可能性がありますか?
いくつかのサンプルデータ:私はここに数学を理解し、完全にわからないんだけど、私はその
float value = dot - plane.D;
がすべき(特にhttp://mathworld.wolfram.com/Point-PlaneDistance.htmlからの式に基づいて)疑い、
Points:
{X:0 Y:-0.5000001 Z:0.8660254}
{X:0.75 Y:-0.5000001 Z:-0.4330128}
{X:-0.75 Y:-0.5000001 Z:-0.4330126}
Plane created:
{Normal:{X:0 Y:0.9999999 Z:0} D:0.5} //I believe D should equal -0.5?
Distance from point 1 to plane:
1.0
'Constants.TOLERANCE'の値は何ですか? – DGH
TOLERANCE = 1e-5f – Martin
しかし、許容値は問題ではありません。遠方で編集したばかりの新しいサンプルデータからわかるように、比較的広大です。 – Martin