Math XNA4.0中的平面变换

Math XNA4.0中的平面变换,math,3d,xna,xna-4.0,Math,3d,Xna,Xna 4.0,今天我注意到XNA4.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} 为什么会发生这种情况?我无法完全解释为什么

今天我注意到XNA4.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}

为什么会发生这种情况?

我无法完全解释为什么传递给变换方法的矩阵(您的比例矩阵)在应用于平面之前会反转,因此您的比例从.1变为10

矩阵中保存缩放和旋转数据的3x3部分将应用于平面的法线,这就是法线被缩放的原因

矩阵的第四行应用于平面的D部分,因此,由于比例矩阵中的所有零(m44除外,m44的值为1),因此平面的D部分保持不变

总体而言,缩放平面没有多大意义,因为除了D部分,平面基本上是无量纲的。为了进行交叉测试,法线应始终保持单位长度,因此缩放法线没有意义。如果你想缩放D部分,它可以是
myPlane.D*=0.1f而不是尝试使用矩阵对其进行变换

猜测如下:

矩阵求逆的一个可能原因是,有两种方法来考虑D部分

1.)从原点到平面的距离

2.)从平面到原点的距离

两者具有相同的值,但在方向上符号相反。MS选择将D视为从平面到原点的距离,这意味着方向与法线方向相反。最有可能的是,这有很好的理由,但我不知道。这很可能迫使在Plane.Transform()方法中进行矩阵求逆。如图所示: