Я ищу алгоритм, который бы соответствовал ограничивающей рамке внутри окна просмотра (в моем случае сцена DirectX). Я знаю об алгоритмах для центрирования ограничивающей сферы в орфографической камере, но для этого нужен и ограничивающий прямоугольник, и перспективная камера. Я не могу просто изменить FOV, потому что это приложение имеет FOV в качестве редактируемой пользователем переменной, поэтому оно должно перемещать камеру.
У меня есть большинство данных:
- У меня есть верхний вектор для камеры
- У меня есть центральная точка ограничивающей рамки
- У меня есть вектор поиска (направление и расстояние) от точки камеры до центра окна.
- Я проецировал точки на плоскости, перпендикулярной к камере, и получил коэффициенты, описывающие, насколько максимальные/минимальные X и Y-координаты находятся внутри или вне плоскости просмотра.
Проблемы, которые у меня есть:
- Центр ограничивающей рамки не обязательно находится в центре окна просмотра (т.е. он ограничивает прямоугольник после проецирования).
- Так как поле зрения "искажает" проекцию (см. http://en.wikipedia.org/wiki/File:Perspective-foreshortening.svg) Я не могу просто использовать коэффициенты как масштабный коэффициент для перемещения камера, потому что она будет превышать/понижать желаемую позицию камеры.
Как найти положение камеры так, чтобы он заполнил область просмотра как можно точнее, как пиксель (исключение составляет, если соотношение сторон далека от 1.0, нужно только заполнить одну из оси экрана)?
Я пробовал другие вещи:
- Использование ограничивающей сферы и касательной, чтобы найти масштабный коэффициент для перемещения камеры. Это не работает, потому что это не учитывает перспективную проекцию, а во-вторых, сферы - плохие ограничивающие объемы для моего использования, потому что у меня много плоской и длинной геометрии.
- Итерирование вызовов функции, чтобы получить меньшую и меньшую ошибку в позиции камеры. Это несколько сработало, но иногда я могу столкнуться с странными краевыми случаями, когда положение камеры слишком сильно перерегулируется, а коэффициент ошибки увеличивается. Кроме того, при этом я не возвращал модель, основанную на положении ограничивающего прямоугольника. Я не мог найти надежный и надежный способ сделать это надежно.
Помогите пожалуйста!