В каком месте делать определение видимой поверхности и как?

Проблема видимости может быть решена путем сортировки полигонов по глубине (алгоритм Пейнтера) и поддержки алгоритма Ньюэлла в тех случаях, когда экстенты z перекрываются. Алгоритм Ньюэлла объясняется здесь и здесь. Точки 3 и 4 включают сравнение каждой вершины многоугольника 1 с плоскостью многоугольника 2.

Чтобы получить правильный результат, мы должны сделать сравнение после отсечения (так как многоугольник после отсечения может измениться, чтобы полностью находиться на противоположной стороне плоскости другого многоугольника с точки зрения). Отсечение выполняется после проекции (так как матрица проекции определяет усечку, с которой нужно обрезаться), что означает, что мы должны сравнивать вершины с плоскостью после проекции.

Кроме того, мы должны нормализовать векторы, так как значения x, y и z в проекционном пространстве применимы только в их собственном контексте w.

После нормализации у нас больше нет линейной глубины, а это означает, что значение z двух полигонов становится ближе, если вы переместите их ближе к дальней плоскости. Расчет нормалей, расстояния от точки до плоскости или чего-либо еще, необходимого для определения того, с какой стороны плоскости находится точка, потерпит неудачу в пространстве с нелинейной глубиной.

Итак, как выполнить шаг "Все ли вершины P лежат глубже, чем плоскость Q"?

1 ответ

После сужения проблемы до "Как я мог вернуть обрезанный многоугольник обратно в пространство, где его нормальный вектор мог быть вычислен (имеется в виду мировое пространство или пространство глаза)", мне показался подход: нам нужно обратить вспять наши операции конвейера, описание здесь,

Чтобы избежать нетривиальной математики, возвращающейся из пространства окна обратно в пространство клипа, мы можем кэшировать координаты клипа при переходе по конвейеру. Тогда нам просто нужно преобразовать координаты клипа с помощью обратной матрицы проекции. Тогда обрезанные координаты будут находиться в глазном пространстве, и мы сможем выполнить сравнение плоскости вершин (например, по точечному произведению нормали плоскости к вектору и эталонному вектору или проверить, есть ли пересечение линии (луча) с плоскостью) и закончить нашу операцию VSD.

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

Другие вопросы по тегам