2012-06-17 1 views
2

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

х, у // диапазон [0..S) х [0..S) // пикселей координаты

Теперь давайте преобразования пикселей координаты параметрических координат плоскости камеры:

xp = x/S * 2 – 1; 
yp = y/S * 2 – 1; 

Xp, Yp // диапазон [-1..1] х [-1..1]

расчет основе камеры:

//eye - camera position 
//up - camera up vector 
//look_at - camera target point 

vec3 w = normalize(look_at-eye); 
vec3 u = cross(up,w); 
vec3 v = cross(w,u); 

так ра Направление у должен иметь следующие координаты:

vec3 dir = look_at – eye + xp*u + yp*v; 
ray3 ray = {eye, normalize(dir)}; 
+0

Я не понимаю. Почему так много расчетов? Разве луч не должен находиться между камерой и представляющей интерес точкой зрения на камеру? Просто вектор между двумя точками? –

ответ

2

Я думаю, что ошибка здесь:

самолет
vec3 dir = look_at – eye + xp*u + yp*v; 

Изображение должно иметь нормальный вектор w, и либо между глазом и посмотреть на точку (более распространенный путь в лучевых индикаторах), или быть за глазом (более точно моделирует реальную камеру-обскуры). Итак, давайте создадим скаляр zoom_factor. Положительное число поместит плоскость перед глазом, а отрицательный поместит ее за глаз (и перевернет изображение).

В центре плоскости изображения, таким образом:

eye + zoom_factor*w 

Точка (xp, yp) на плоскости изображения, таким образом:

eye + zoom_factor*w + xp*u + yp*v 

Теперь вы хотите, чтобы направление быть от глаз до этой точки на этой плоскости изображения:

vec3 dir = eye + zoom_factor*w + xp*u + yp*v - eye; 

в eye s отменить, так это упрощается:

vec3 dir = zoom_factor*w + xp*u + yp*v 

Это предполагает xpyp каждый в диапазоне, как (-0.5, 0.5). Заметим, что (0, 0) является средой плоскости изображения с этой компоновкой.

+0

спасибо. исправлено. – innochenti

 Смежные вопросы

  • Нет связанных вопросов^_^