Камера XNA 2D теряет точность

Я создал 2D-камеру (код ниже) для игры сверху вниз. Все работает нормально, когда позиция игроков близка к 0,0x и 0,0y.

К сожалению, по мере увеличения расстояния у преобразования возникают проблемы, примерно при 0,0x 30e7y (да, это 30 миллионов лет) камера начинает дрожать, когда игрок движется (камера обновляется с положением игрока в конце каждого обновления). большие расстояния, миллиард + камера даже не отслеживает игрока, так как я предполагаю, что любая ошибка в матрице слишком сильно усиливается.

Мой вопрос: есть ли проблема в матрице или это стандартное поведение для экстремальных чисел.

Метод преобразования камеры:

public Matrix getTransform()
{
    Matrix transform;

    transform = (Matrix.CreateTranslation(new Vector3(-position.X, -position.Y, 0)) *
            Matrix.CreateRotationZ(rotation) * Matrix.CreateScale(new Vector3(zoom, zoom, 1.0f)) *
    Matrix.CreateTranslation(new Vector3((viewport.Width / 2.0f), (viewport.Height / 2.0f), 0)));

    return transform;
}

Метод обновления камеры:

Он запрашивает положение объекта с учетом его идентификатора, он возвращает базовый Vector2, который затем устанавливается в качестве положения камеры.

if (camera.CameraMode == Camera2D.Mode.Track && cameraTrackObject != Guid.Empty)
{
    camera.setFocus(quadTree.getObjectPosition(cameraTrackObject));                    
}

Если кто-то увидит ошибку или расскажет мне, почему матрица борется, я был бы очень благодарен.


person user3170345    schedule 07.01.2014    source источник
comment
Это очень странно. Я предполагаю, что нужны эти очень большие числа (в миллионах)? Как мое первое предложение было бы уменьшить это, если возможно.   -  person tjheslin1    schedule 08.01.2014
comment
Я придумал обходной путь и опубликовал причину ошибки ниже, спасибо за комментарий: D   -  person user3170345    schedule 08.01.2014


Ответы (1)


Я действительно нашел причину этого, я должен был подумать об этом.

Я использую числа с плавающей запятой одинарной точности, которые имеют точность только до 7 цифр. Это нормально для меньших чисел (примерно до отметки в 2,5 миллиона, которую я нашел). Все, что сверх этого, и функции умножения в матрице начинают получать ошибки точности, когда числа с плавающей запятой начинают усекаться.

Лучшее решение для моей конкретной проблемы - ввести некоторое искусственное масштабирование (мне нужны очень большие числа, поскольку симуляция проводится в пространстве). Я ограничил свои миры 5 миллионами единиц в квадрате (+/- 2,5 миллиона единиц) и предложу другой способ гранулирования мира.

Я также нашел здесь хороший ответ:

дрожание вершин при больших значениях положения камеры

И хорошая статья, в которой более подробно обсуждаются плавающие точки:

Что должен знать каждый компьютерный ученый об арифметике с плавающей запятой

Спасибо за мнения и комментарии !!

person user3170345    schedule 08.01.2014