2015-10-07 4 views
0

Я работаю над проектом, для которого я должен вычислить координаты экрана данного мировой точки.Есть ли способ избежать деления на 0 при растрировании?

Я прочитал некоторые материалы и организовал эту задачу на четыре подзадачи:

  1. Умножить мир точечных с обратной ТРС-матрицей моей камеры получить точку в камере координата.
  2. Умножить координаты точки в камере с матрицей проецирования для получения точка в координатах отсечения. Матрица проекции выглядит следующим образом

    (1/tan (fov * 0.5 * PI/180)), 0, 0, 0; 
    0, (1/tan (fov * 0.5 * PI/180)), 0, 0; 
    0, 0, - ((f + n)/(f - n)), - (2 * f * n/(f - n)); 
    0, 0, -1, 0; 
    
  3. Умножить точки в вырезке координат с 1/W получить точку в NDC.
  4. Конвертировать ndc в Координаты экрана.

Это прекрасно работает, но я натолкнулся на некоторые странные результаты и ошибки. Оказывается, что значение ш от точки в координатах вырезку обращается в 0, если г значение точки в камере координат 0. Это приводит к делению на 0 на шаге 3.

ли я пропустить что-то или это нормально? Есть ли способ вычислить положение экрана точек на оси z камеры или я должен просто проверить, (z == 0) и вернуть середину экрана?

+2

самым эффективным будет добавление чека – Ulterior

ответ

1

Вы делаете центральную проекцию. В координатах камеры центром проецирования является начало координат. Плоскость проекции - любая плоскость, параллельная плоскости x-y перед камерой (т. Е. Z! = 0).

Теперь представьте, что произойдет с точкой, которая имеет z = 0 в координатах камеры. Его проекционный луч будет параллелен плоскости проекции. Таким образом, у него нет изображения на плоскости. Это то, что указывает деление на ноль.

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

Итак, вставьте чек if z in camera coordinates < near then ignore. Или если у вас есть левая система координат ... > -near ...

+0

Благодарим за подробное объяснение. Я подумал об этом и понял, что единственный способ, чтобы любая точка на плоскости x-y была близкой плоскостью отсечения 'n <= 0' и' fov> = pi'. – user2699453

+0

Даже тогда эти точки не имеют изображения. –