Вопросы к 26 - p1xelse/CG GitHub Wiki

Самый интересный и самый сложный этап?

Это протыкание. (определения видимой части ребер, принадлежащих другим телам)

С какими телами будем работать?

Многогранники.

В каком случае наблюдатель не видит какие-то участки ребра другого тела?

Испускаемый луч пройдёт через преграждающее тело. По отношению к граням тела он будет находиться по положительную сторону.(физическая часть)

(математическая часть) Надо найти область отрезка, которая будет проходить внутри этого тела. Формируем уравнение луча и "пропускаем" его по очереди сквозь каждое тело сцены, чтобы найти интервалы.Что с уравнением луча делаете? Уравнение умножаем на матрицу тела. Получаем вектор и для каждой компоненты вектора требуем чтобы было больше 0.

Зачем ищем точки протыкания?

Если тела взаимно протыкаются, то образуются новые рёбра, которые могут быть экранированы как самими телами, так и другими объектами. Мы эти рёбра должны тоже получить и исследовать.

В каком пространстве можно решать задачу?

Как в объектном так и в пространстве изображений. В объектном пространстве - точней, отвязываемся от растра. В пространстве изображений - быстрее, но менее точно.

Что собой представляют исходные данные? В каком виде их нужно представить

Для каждого тела сцены должны быть сформирована матрица тела. Пусть V - матрица тела, которая имеет размерность 4*n, где n – кол во граней.

Каждый столбец матрицы представляет собой 4 коэффициента уравнения плоскости, проходящей через очередную грань тела.

Требования к матрице?

Любая точка, расположенная внутри тела, должна располагаться по положительную сторону от каждой грани тела.

Если для очередной грани это условие не выполняется, то соответствующий столбец матрицы надо умножить на -1.

Требования алгоритма?

Должны быть только выпуклые тела.

Как невидимые рёбра экранируем телом?

Анализируем каждую грань. Если скалярное произведение нормали к гране и вектора взгляда >= 0 значит грань видима, иначе невидима (если = 0, вектор взгляда параллелен плоскости)

Что делать с рёбрами, возникающими при протыкании?

Если они видимы относительно сначала этих тел, затем других тел - отрисовываем.

  1. Формируем все возможные ребра, соединяющие точки протыкания, для пар тел, связанных отношением протыкания
  2. Проверить экранирование всех соединяющих ребер обоими телами, связанных отношением протыкания
  3. Проверить экранирование оставшихся соединяющих ребер всеми прочими телами сцены. оставшиеся отрезки будут видимыми - добавим их к ответу, визуализируем.

Как найти новые рёбра при протыкании? [проверить, дополнить]

[чёта про 4 этап]

Все те точки, которые будут невидимы - мы ищем пересечение ребра, у которого будет одна вершина невидима относительно тела и ищем пересечение многогранника с этим ребром (находим все точки, которые связаны отношением протыкания)

С лекции Курова

Если тела связаны отношением взаимного протыкания, то образуются новые ребра,соответствующие линиям пересечения тел. Необходимо найти новые ребра.Новые ребра можно получить путем соединения точек протыкания между собой.Видимые рёбра не могут образовывать рёбра, соединяющие невидимые точки протыкания.Вновь полученные ребра надо проверить сначала на экранирование самими телами, связанными отношением протыкания. Оставшиеся видимые части ребер надо проверить на экранирование другими телами сцены. Фактически на третьем этапе повторяем первые этапа алгоритма, но уже для новых ребер, которые получаются в результате протыкания тел.

Откуда было получено неравенство H = Q * V hj > 0, j = 1..n ?

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

Для каждой компоненты вектора H мы должны потребовать положительного значения. Система неравенств задает область допустимых решений. Все точки расположенные внутри области дают координаты невидимых точек отрезка.