WPF Matrix3D.Rotate()函数是否不准确?

时间:2010-07-23 10:50:29

标签: c# wpf matrix rotation transformation

我正在尝试围绕WPF,我正处于使用Matrix3D结构在坐标空间之间进行转换的阶段。

在意识到WPF在Point3D和Vector3D之间存在差异(那两个小时我永远不会回来......)我可以设置翻译矩阵。我现在正在尝试引入一个旋转矩阵,但它似乎给出了真空结果。这是我的世界坐标转换代码......

    private Point3D toWorldCoords(int x, int y)
    {


        Point3D inM = new Point3D(x, y, 0);


        //setup matrix for screen to world
        Screen2World = Matrix3D.Identity;

        Screen2World.Translate(new Vector3D(-200, -200, 0));
        Screen2World.Rotate(new Quaternion(new Vector3D(0, 0, 1), 90));

        //do the multiplication
        Point3D outM = Point3D.Multiply(inM, Screen2World);

        //return the transformed point
        return new Point3D(outM.X, outM.Y, m_ZVal);


    }

翻译似乎工作正常,然而旋转90度似乎恢复了浮点数。矩阵的偏移行似乎偏离了一个小因子(无论是哪种方式为0.000001),这会在渲染上产生锯齿。有没有我在这里缺少的东西,或者我只是需要手动围绕矩阵?

干杯

1 个答案:

答案 0 :(得分:2)

即使使用双精度数学,矩阵乘法也会出现舍入误差。

您正在执行4次乘法,然后对新矩阵中每个元素的结果求和。

最好将Screen2World矩阵设置为翻译矩阵,而不是将单位矩阵乘以平移,然后再乘以旋转。这是两次矩阵乘法,而不是舍入误差的一次和(两次以上)。