2010-12-14 10 views
4

私は簡単なヘルパーメソッドを書いています。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 
+0

'Constants.TOLERANCE'の値は何ですか? – DGH

+0

TOLERANCE = 1e-5f – Martin

+0

しかし、許容値は問題ではありません。遠方で編集したばかりの新しいサンプルデータからわかるように、比較的広大です。 – Martin

答えて

6

Planeは、Dがプレーンノーマルにポイントの1つの投影ではなく、むしろこれの否定であるように実装されているようです。これをベクトルを投影すると考えることができます平面からへの原点は法線上にあります。いずれの場合においても

、私は

float value = dot + plane.D; 

float value = dot - plane.D; 

を変更すると、物事を修正する必要があることを信じています。 HTH。

+1

あなたが一度言ったら、それはとても分かります!ありがとうございます。 – Martin

1

[OK]を実際には

float value = dot/plane.D; 

EDIT:Ok、以下のコメントに記載されているように、これは機能しませんでした。私の最善の提案は、リンクやGoogleの「点と飛行機の距離」を見て、数式を別の方法で実装しようとすることです。

+0

私は非常に単純な言葉でそれを表現するこの答えからここで働いていました:http://social.msdn.microsoft.com/Forums/en/xnaframework/thread/226600b4-0de4-4bac-bc55-a4d9b84dd92f – Martin

+0

@マーティン:Okその提案に正しく従っているように見えます。しかし、この計算式は、この計算を説明している3つか4つのサイトのいずれとも一致しません。あなたは私のアイデアを試してもらえますか? – DGH

+0

確かに、どうしてですか? – Martin