Я написал код, который генерирует луч от «глаза» камеры к плоскости обзора на некотором расстоянии от глаза камеры:
R3Ray ConstructRayThroughPixel(...)
{
R3Point p;
double increments_x = (lr.X() - ul.X())/(double)width;
double increments_y = (ul.Y() - lr.Y())/(double)height;
p.SetX( ul.X() + ((double)i_pos+0.5)*increments_x );
p.SetY( lr.Y() + ((double)j_pos+0.5)*increments_y );
p.SetZ( lr.Z() );
R3Vector v = p-camera_pos;
R3Ray new_ray(camera_pos,v);
return new_ray;
}
ul
- верхний левый угол плоскости просмотра, а lr
- нижний левый угол плоскости просмотра. Они определены следующим образом:
R3Point org = scene->camera.eye + scene->camera.towards * radius;
R3Vector dx = scene->camera.right * radius * tan(scene->camera.xfov);
R3Vector dy = scene->camera.up * radius * tan(scene->camera.yfov);
R3Point lr = org + dx - dy;
R3Point ul = org - dx + dy;
Здесь org
- центр плоскости обзора, при этом radius
- это расстояние между плоскостью просмотра и глазом камеры, dx
и dy
- это смещения в направлениях x и y от центра. плоскости обзора.
Функция ConstructRayThroughPixel(...)
отлично работает для камеры, у которой глаз (0,0,0). Однако, когда камера находится в каком-либо другом положении, не все необходимые лучи генерируются для изображения.
Есть предложения, что может пойти не так? Может быть, что-то не так с моими уравнениями?
Спасибо за помощь.