Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# .Net Matrix3D Transform()的具体功能是什么/我为什么得到无穷大;?_C#_Wpf_Matrix_3d - Fatal编程技术网

C# .Net Matrix3D Transform()的具体功能是什么/我为什么得到无穷大;?

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

我正在尝试对一些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  
 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)