21. Трехмерное отсечение. Виды отсекателей. Алгоритм отсечения отрезков средней точкой. - chrislvt/CG GitHub Wiki
Увертюра
Понятие отсечения
Отсечение - операция удаления части изображения, находящейся за пределами некоторой заданной области, называемой отсекателем.
Отсечение бывает:
- Двумерное
- Трехмерное (рассматривается в этом вопросе)
Видимость объекта
- Видимый объект - объект, находящийся целиком внутри отсекателя.
- Невидимый объект - объект, находящийся целиком вне отсекателя
- Частично видимый объект - объект, часть которого находится внутри отсекателя, а часть - вне отсекателя.
Внутреннее и внешнее отсечение
-
Отсечение - внутреннее отсечение.
Комментарий от Куруша:
Отсечение (внутреннее) - у нас есть отсекатель, и мы должны оставить только ту часть (части) объекта, которые лежат внутри отсекателя.
-
Стирание - внешнее отсечение.
Стирание - нахождение части изображения, находящейся за пределами отсекателя.
Комментарий от Куруша:
Отсечение (внешнее, или другими словами стирание) - наоборот, остается только то, что лежит вне отсекателя.
Виды трёхмерных отсекателей
Код видимости задаётся 6 битами.
Виды трехмерных отсекателей:
- Прямоугольный параллелепипед
- Усечённая пирамида видимости
Вычисление кодов концов отрезка для каждого типа отсекателей.
1. Прямоугольный параллелепипед
Как и в двумерном отсечении, здесь используется битовый код видимости вершины (обобщенный).
T1 = 1, если x < xл, 0 – иначе
T2 = 1, если x > xп, 0 – иначе
T3 = 1, если y < yн, 0 – иначе
T4 = 1, если y > yв, 0 – иначе
T5 = 1, если z > zб, 0 - иначе
T6 = 1, если z < zн, 0 - иначе
Важно подписать, что наименования граней относятся к отсекателю. "верхняя грань отсекателя" и т.д..
2. Усечённая пирамида видимости
Важно подписать, что наименования граней относятся к отсекателю. "верхняя грань отсекателя" и т.д..
zцп - центр проекции.
Уравнение прямой на плоскости xz, несущей проекцию правой грани отсекателя, имеет вид:
Подстановка координат x и z точки P в пробную функцию правой грани fп даст следующий результат:
На будущее:
Сюда я потом добавлю в каких случаях в 0 выставляется, а в каких случаях 1. Отметила этот момент в issue.
Сумма кодов концов отрезка
Если сумма битов кода отрезка равна 0, то точка расположена внутри отсекателя.
Определение видимости отрезка:
-
Отрезок видим, если обе суммы кодов концов равны нулю,т. е. S1 = S2.
-
Если S1 = 0 и S2 <> 0 или S1 <> 0 и S2 = 0, то отрезок частично видимый.
-
Если обе суммы ненулевые, то отрезок частично в действительности может оказаться частично видимым или полностью невидимым. Для распознавания части полностью невидимых отрезков можно использовать логическое произведение концов отрезка:
P = T1(1) * T2(1) + T1(2) * T2(2) + T1(3) * T2(3) + T1(4) * T2(4)+ T1(5) * T2(5)+ T1(6) * T2(6), где T1 и T2 - массивы с кодами конечных точек отрезка
Алгоритм трехмерного отсечения средней точкой
Отличается от алгоритма средней точки для двумерного отсечения только количеством битов в коде концов отрезка. Ниже приводится определение кода и суммы кодов для точки (6 бит вместо 4). основной код смотреть в вопросе 14 про двумерную среднюю точку