Я немного опоздал на эту вечеринку.Но я наткнулся на эту тему, когда смотрел на ту же проблему.Я потратил целый день на изучение этого вопроса и работал над некоторыми прекрасными статьями, которые я нашел здесь: http://www.antongerdelan.net/opengl/virtualcamera.html
В итоге я начал с матрицы проекции и работал в обратном направлении.Я получил ту же формулу, которую вы упомянули в своем посте выше.(где cot (x) = 1 / tan (x))
radius_pixels = (radius_worldspace / {tan(fovy/2) * D}) * (screen_height_pixels / 2)
(где D - расстояние от камеры до ограничивающей сферы цели)
Я использую этот подход копределите радиус воображаемого трекбола, который я использую для вращения своего объекта.
Кстати, Флориан, вы можете извлечь фови из матрицы проекции следующим образом:
Если вы возьмете компонент Sy изМатрица проекции, как показано здесь:
Sx 0 0 0
0 Sy 0 0
0 0 Sz Pz
0 0 -1 0
where Sy = near / range
and where range = tan(fovy/2) x near
(вы можете найти эти определения на странице, на которую я ссылался выше)
если вы замените диапазон в приведенном выше уравнении Sy, вы получите:
Sy = 1 / tan(fovy/2) = cot(fovy/2)
перестановка:
tan(fovy/2) = 1 / Sy
взяв арктан (обратный загар) с обеих сторон, мы получим:
fovy/2 = arctan(1/Sy)
так,
fovy = 2 x arctan(1/Sy)
Не уверен, если вы все еще заботитесь - это было какое-то время!- но, может быть, это поможет кому-то еще.