0

今日、XNA 4.0 の Plane.Transform が期待どおりの結果をもたらさないようであることに気付きました。

var s = Matrix.CreateScale(0.1f);
var p = new Plane(new Vector3(1.0f, 0.0f, 0.0f), 1.0f);
var p = Plane.Transform(p, s);

平面のマグニチュードが 0.1f になると予想していましたが、代わりに距離が 1 で、法線の長さが 10 です。

{Normal:{X:10 Y:0 Z:0} D:1}

なぜこれが起こるのですか?

4

1 に答える 1

2

理由を完全に説明することはできませんが、変換メソッド (スケール マトリックス) に渡されるマトリックスは、平面に適用される前に反転されるため、スケールは .1 から 10 になりました。

スケールと回転データを保持するマトリックスの 3x3 セクションは、平面の法線に適用されるため、法線がスケーリングされます。

マトリックスの 4 行目はプレーンの D 部分に適用されるため、スケール マトリックスにはすべてゼロが含まれているため (1 の m44 を除く)、プレーンの D 部分は変更されません。

平面はその D 部分を除いて本質的に無次元であるため、平面のスケーリングは全体的にあまり意味がありません。法線は、交差テストの目的で常に単位長に保つ必要があるため、法線をスケーリングしても意味がありません。また、その D 部分をスケーリングしたい場合myPlane.D *= 0.1f;は、マトリックスで変換する代わりに単純に行うことができます。

憶測は次のとおりです。

マトリックス反転の考えられる理由の 1 つは、D 部分について 2 つの考え方があるためです。

1.) 原点から平面までの距離。

2.) 平面から原点までの距離。

どちらも同じ値ですが、方向に関して反対の符号が付いています。MS は、D を平面から原点までの距離と考えることにしました。これは、方向が法線方向の反対であることを意味します。おそらく、これには正当な理由がありましたが、私にはわかりません。ほとんどの場合、Plane.Transform() メソッドで行列の反転が強制されます。次の図を参照してください: http://msdn.microsoft.com/query/dev10.query?appId=Dev10IDEF1&l=EN-US&k=k(MICROSOFT.XNA.FRAMEWORK.PLANE);k(DevLang-CSHARP)&rd=true

于 2013-07-15T12:17:53.290 に答える