Приблизьте все это к сфере и примените следующую формулу, умноженную на отношение пиксель / модель к единице.
Вы можете рассчитать отношение пиксель-модель-единица измерения путем рендеринга единичной сферы по известной координате z. Хорошая вещь о сфере является то, что ее ширина всегда будет диаметром, независимо от того, откуда вы смотрите. Подробнее см. перспективная проекция .
Редактировать : Хорошо, что сфера независима от направлений. Независимо от поля или сферы вам нужно указать направление вектора камеры и вектора вверх . Если у вас есть это, единственным неизвестным является глубина z с точки зрения глаза. Оттуда вы можете рассчитать положение глаза по:
eye := (center.x, center.y, center.z) - depth * (camera.x, camera.y, camera.z)
Из формулы Bx := Ax * Bz / Az
Вы можете получить Bz := Bx * Az / Ax
.
Позвольте мне определить координату модели 1.0 равной 1.0м.
Предположим, сфера радиусом 1,0 м с расстояния 100,0 м имеет ширину 20 пикселей.
Bz := 1.0 * 100.0 / 10
Bz := 10.0
Теперь предположим, что ваша ограничительная рамка имеет ширину 200,0 м, что делает Ax равным 100,0, а ширина экрана 1024 пикселя, что составляет Bx 512 пикселей.
Az := (Ax / Bx) * Bz
Az := (100.0/512.0) * 10.0
Az := 1.953m
В приведенных выше единицах измерения между м и пиксель поглощается Bz.
Предположим, вектор повышения (0, 0, 1), вектор камеры (1, 0, 0) и центр (0, 0, 0).
eye := center - depth * camera
eye := (0, 0, 0) - 1.953 * (1, 0, 0)
eye := (-1.953, 0, 0)