C# .Net Matrix3D Transform()的具体功能是什么/我为什么得到无穷大;?
我正在尝试对一些3D点进行透视变换。(如果有帮助,我将尝试应用所描述的算法)。但基本上,我有一个矩阵3d,它有以下值:C# .Net Matrix3D Transform()的具体功能是什么/我为什么得到无穷大;?,c#,wpf,matrix,3d,C#,Wpf,Matrix,3d,我正在尝试对一些3D点进行透视变换。(如果有帮助,我将尝试应用所描述的算法)。但基本上,我有一个矩阵3d,它有以下值: HasInverse = true IsAffine = false IsIdentity = false M11 = 1.000000000000000 M12 = 0.0 M13 = 0.0 M14 = 0.0 M21 = 0.0 M22 = 1.000000000000000 M23 = 0.0 M
HasInverse = true
IsAffine = false
IsIdentity = false
M11 = 1.000000000000000
M12 = 0.0
M13 = 0.0
M14 = 0.0
M21 = 0.0
M22 = 1.000000000000000
M23 = 0.0
M24 = 0.0
M31 = 0.0
M32 = 0.0
M33 = -1.0101010101010102
M34 = 0.0
M44 = 0.0
OffsetX = 100
OffsetY = -1.0101010101010102
OffsetZ = 0.0
当我使用这个矩阵对310120,0的点进行变换时
Point3D p = new Point3D(310, 120, 0);
Point3D pointResult = new Point3D();
pointResult = (Point3D)TheMatrix.Transform(p);
。。。我在结果中得到(无穷,无穷,-无穷)。transform()方法到底做了什么?为什么我会得到这个结果?MSDN只是说这个方法
通过矩阵x3d转换指定的点3d并返回
结果
遍历源代码有点痛苦,但以下是我能收集到的
Transform
在内部调用一个名为MultiplyPoint
(两个源方法如下所示)的方法,该方法生成一个变量w
,x、y、z和相应值的乘积之和,_m11、_m21、_m31。这些变量是通过一种称为NormalizedAffineInvert
的方法乘以倒数和转置得到的。我不会发布所有的源代码,但是
我所能想象的是,w
以某种方式等于0。由于您说IsAffine=false
,因此输入除法逻辑并除以零,从而导致无限
。请注意,调用public方法Invert()
将在内部调用NormalizedAffineInvert
。你曾经调用过这个方法吗
#region Transformation Services
/// <summary>
/// Transforms the given Point3D by this matrix, projecting the
/// result back into the W=1 plane.
/// </summary>
/// <param name="point">Point to transform.
/// <returns>Transformed point.</returns>
public Point3D Transform(Point3D point)
{
MultiplyPoint(ref point);
return point;
}
您的
点3D
首先通过附加1:
p_h = (310, 120, 0, 1)
然后,将变换应用为乘法:
p_h* = p_h * M
= (410, 119, 0, 0)
然后,执行w剪辑(透视变换所必需的)。w片段将向量除以其w分量(最后一个维度)。因为这是零,所以得到的结果是无限的
问题在于矩阵“M44
。将此设置为1,您应该会没事。至少,矩阵的最后一列应该包含一些值。如果它们都是零,你将得到一个无限的结果
p_h* = p_h * M
= (410, 119, 0, 0)