2013-07-15 121 views
0

今天我注意到XNA 4.0中的Plane.Transform似乎没有给出我预期的结果。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} 

为什么会出现这种情况?

回答

2

我不能完全解释为什么,但传递的变换方法(你的规模矩阵)的矩阵被应用到平面,您规模从0.1走到10

3×3之前反转保存比例和旋转数据的矩阵部分应用于平面的法线,这就是为什么您的法线被缩放的原因。

矩阵的第4行被应用到平面的D部分,因为您的比例矩阵在那里全部为零(除了m44有1),平面的D部分保持不变。

缩放一个平面没有多大意义,因为除了D部分之外,一个平面本质上是无量纲的。为了交叉测试目的,法线应始终保持在单位长度,因此缩放法线是没有意义的。如果您想要缩放D部分,则可以简单地使用myPlane.D *= 0.1f;而不是尝试使用矩阵进行转换。

猜测如下:

一个可能的原因矩阵求逆是因为有思考的d部分的两种方式。

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