Несоответствие генерации лучей - PullRequest
1 голос
/ 27 марта 2010

Я написал код, который генерирует луч от «глаза» камеры к плоскости обзора на некотором расстоянии от глаза камеры:

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). Однако, когда камера находится в каком-либо другом положении, не все необходимые лучи генерируются для изображения.

Есть предложения, что может пойти не так? Может быть, что-то не так с моими уравнениями?

Спасибо за помощь.

Ответы [ 2 ]

0 голосов
/ 01 апреля 2010

Причина, по которой мой код не работал, заключалась в том, что я обрабатывал значения x, y, z отдельно. Это неправильно, поскольку камера может быть направлена ​​в любом направлении, и, следовательно, если бы она была направлена ​​вниз по оси x, координаты x были бы одинаковыми, создавая increments из 0 (что неверно). Вместо этого необходимо выполнить интерполяцию угловых точек (где точки имеют координаты x, y, z). Пожалуйста, смотрите ответ в соответствующем сообщении: 3D-координата 2D-точки для данной камеры и плоскости обзора

0 голосов
/ 27 марта 2010

Вот придирка, которая может не иметь ничего общего с вашей проблемой:

Когда вы делаете это:

R3Vector dx = scene->camera.right * radius * tan(scene->camera.xfov);
R3Vector dy = scene->camera.up * radius * tan(scene->camera.yfov);

Я предполагаю, что векторы right и up нормализованы, верно? В этом случае вы хотите sin не tan. Конечно, если углы fov малы, это не будет иметь большого значения.

...