Ответ 1
Если вы приравниваете мировое происхождение (0,0,0) к фокусу камеры (центр проекции, как вы его называете), и вы предполагаете, что камера указывает вдоль положительной оси z, тогда ситуация выглядит так: плоскость х = 0:
Здесь оси z (горизонтальные) и y (вертикальные). Подстрочный индекс v
предназначен для "окна просмотра" или экрана, а w
- для мира.
Если я правильно понял ваш смысл, вы знаете h
, высоту экрана в пикселях. Кроме того, zw
, yv
и xv
. Вы хотите знать yw
и xw
. Обратите внимание, что этот расчет имеет (0,0) в центре окна просмотра. Настройте соответствующим образом обычную систему координат экрана с (0,0) в верхнем левом углу. Примените немного триггеров:
tan(43/2) = (h/2) / f = h / (2f), so f = h / ( 2 tan(43/2) )
и аналогичные треугольники
yw / zw = yv / f also xw / zw = xv / f
Решение:
yw = zw * yv / f and xw = zw * xv / f
Обратите внимание, что предполагается, что "фокусное расстояние" камеры равно в направлении x. Это не обязательно. Для лучшей точности в xw
вы должны пересчитать с помощью f = w / 2 tan(57/2)
, где w
- ширина экрана. Это связано с тем, что f
не является истинным фокусным расстоянием. Это просто постоянная конверсия. Если пиксели камеры квадратные, а оптические объекты не имеют аберраций, эти два вычисления f
дают тот же результат.
NB: В удаленной (неподходящей) статье OP, казалось, говорило, что это не zw, которое известно, а длина D гипотенузы: происхождение до (xw, yw, zw). В этом случае обратите внимание на zw = D * f / sqrt(xv² + yv² + f²)
(при условии, что пиксели камеры являются квадратными, при этом необходимо масштабирование, если нет). Они могут действовать как указано выше.