Является ли функция WPF Matrix3D.Rotate() неверной?

В настоящее время я пытаюсь окунуться в 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 в любом случае), что приводит к алиасингу на рендерах. Я что-то здесь упустил, или мне просто нужно вручную округлить матрицу?

Ваше здоровье


person XenoByteZero    schedule 23.07.2010    source источник


Ответы (1)


Даже в математике с двойной точностью будут ошибки округления при умножении матриц.

Вы выполняете 4 умножения, а затем суммируете результаты для каждого элемента в новой матрице.

Возможно, было бы лучше установить матрицу Screen2World в качестве матрицы перевода для начала, а не умножать матрицу идентичности на ваш перевод, а затем на вращение. Это два матричных умножения, а не одно, и (более чем) удвоенная ошибка округления.

person ChrisF    schedule 23.07.2010