Вычислительный FOVX (openGL)
При работе с перспективами openGL я не совсем уверен, как вычислить fovx из fovy. Я читаю разные вещи в разных местах, и я не получаю правильное поведение, используя любой метод, который я нашел. Так может кто-нибудь сказать мне, учитывая fovy камеры и соотношение сторон, как я могу рассчитать fovx камеры? Если требуются какие-либо другие данные, это нормально, просто дайте мне знать, что мне нужно. Огромное спасибо заранее!
4 ответа
Правильный:
fieldOfViewX = 2 * atan(tan(fieldOfViewY * 0.5) * aspect)
Неправильно, особенно по крупным аспектам, см. Комментарии @gman ниже:
Aspect ratio === width/height
fovy ~= "height"
==> fovx = fovy * aspect
Тестовое задание:
Fovy = 60 degs
Aspect = 4:3 ~= 1.33
Fovx = 60*1.33 = 80
80/60 = 4:3 (fovs match, yay)
Для "разумных" областей / аспектов простой метод "разумно" близок к истине, но если у вас есть экстремальные аспекты, вы получите fovx > 180 градусов, что вам не нужно.
Вот хорошая ссылка:
http://wiki.panotools.org/Field_of_View
Обратите внимание, что соотношение сторон - это не то же самое, что соотношение сторон поля зрения, и правильные соотношения, приведенные на этой странице, должны использоваться для соотнесения углов поля зрения.
Джава:
double d = (viewportHeight * 0.5) / Math.tan(Math.toRadians(fovY * 0.5));
fovX = (float) (2 * Math.toDegrees(Math.atan((viewportWidth * 0.5) / d)));
Вы смотрели на формулы здесь?: