我正在尝试围绕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),这会在渲染上产生锯齿。有没有我在这里缺少的东西,或者我只是需要手动围绕矩阵?
干杯
答案 0 :(得分:2)
即使使用双精度数学,矩阵乘法也会出现舍入误差。
您正在执行4次乘法,然后对新矩阵中每个元素的结果求和。
最好将Screen2World
矩阵设置为翻译矩阵,而不是将单位矩阵乘以平移,然后再乘以旋转。这是两次矩阵乘法,而不是舍入误差的一次和(两次以上)。