Вычисление направления луча камеры в 3D world pixel

Я хочу рассчитать направления лучей от камеры к позициям пикселей (в мировых координатах) с заданной высотой, как описано в этой статье. Размер изображения камеры 640,480. Я откалибровал внутренние параметры камеры и откорректировал каждое изображение. Я измерил физическое расстояние между камерой и фоновой плоскостью (29 см), как показано здесь:

1 см переводится в 25 пикселей (при условии квадратичных пикселей). Мой первый подход состоял в том, чтобы вычислить на основе пиксель - и положение камеры следующим образом:

float3 pixPos = (float3)(u, v, z);
float3 camPos = (float3)(height/2, width/2, 29*25);
float3 ray = normalize(pixPos-camPos);

где u,v-координаты изображения от 0,0 до высоты, ширина и z-мои (уже оцененные) значения высоты. Это, кажется, неправильный путь. Я уже сделал поиск и нашел ответ, но описанное там решение не включает высоты пикселей (z здесь).

1 ответов


я решал ту же проблему несколько лет назад, когда писал дипломную работу. Вот часть его, которая описывает, как создать камеру для raytracing..

прежде всего вам нужно определить систему координат камеры. Это ортонормированная система координат, то есть все три базисных вектора перпендикулярны друг другу и имеют одинаковый размер (не обязательно "один"). Также вам нужно указать, если ваша система координат камеры правой рукой или левша!--28--> (я буду говорить о левша). Сначала вам нужно определить up vector (вектор показывает вам, что такое ось y на экране) и camera direction vector (так вектор от положения глаза к середине вашей плоскости проекции). Тогда вы вычислите left vector (или правый вектор, если вам нужно) (который указывает, где именно находится ось x на экране) по cross product на up vector и camera direction vector. Теперь, поскольку только вектор направления камеры и левый вектор перпендикулярны, вы должны сделать one more cross product of camera direction vector и left vector (вектор Y на изображении).

таким образом, вы получите систему координации камеры, как этот

left handed camera coordination system

нет, вы должны определить, насколько велик ваш проекционный экран в мировых координатах. Это может быть иногда сложно, поэтому вы также можете определить его двумя углами phi and theta angles (phi и theta) и расстояние от положения глаз (назовем это d).

вы получаете u vector и v vector. (the x вектор-это вектор, который определяет ось x на экране, так что это left vector или правый вектор, зависит от handedness) Линейной комбинацией этих двух векторов u и v вы можете вычислить любую позицию на экране проекции. Коэффициенты alphaalpha и beta хотя представляет расстояниях the point от середины экрана проекции.

так alpha coefficient и beta coefficient, где s и r are x и y координаты на вашем расчетном изображении и imageWidth и imageHeight соответствующие размеры.

так как вы можете видеть на этом изображении

projection plane

конечное положение любой точки на плоскости проекции составляет point on projection plane.

тогда расчет запрошенного вектора desired vector.