Удаление невидимых линий и поверхностей

Содержание

Слайд 2

Методы удаления невидимых линий и поверхностей

При проецировании трехмерных объектов на картинную плоскость

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

Слайд 3

Классификация методов удаления невидимых линий и поверхностей

Каркасное (wireframe)
Сплошное (solid)

Классификация методов удаления невидимых линий и поверхностей Каркасное (wireframe) Сплошное (solid) В
В пространстве сцены
На картинной плоскости

Точные аналитические методы (continuous)
Приближенные методы (point-sampling)

По способу изображения объекта:

По пространству, в котором решается задача

По точности получаемого решения

Слайд 4

Лицевые и нелицевые грани

Если грани являются границей тела (или нескольких тел), то

Лицевые и нелицевые грани Если грани являются границей тела (или нескольких тел),
для каждой из них можно определить вектор внешней нормали

A

B

C

D

Нормали к граням А и В смотрят в сторону наблюдателя (наблюдатель находится в положительном полупространстве по отношению к плоскости, проходящей через соответствующую грань). Такие грани называются лицевыми (front-faced).

Для граней C и D нормали направлены от наблюдателя, их называют нелицевыми (back-faced).

Слайд 5

Свойства (не)лицевых граней

В случае, когда грани являются границей тела (или нескольких тел),

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

Слайд 6

Трассировка лучей

При использовании метода трассировки лучей через каждый пиксел картинной плоскости выпускается

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

Слайд 7

Метод буфера глубины

Каждому пикселу картинной плоскости, кроме значения цвета, хранящемуся в буфере

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

foreach(p in pixels)
if(p.z < zBuffer[p.x, p.y])
draw( p );
zBuffer[p.x, p.y] = p.z;
}

Слайд 8

Алгоритм художника

Алгоритм художника (painter’s algorithm) явно сортирует все грани сцены в порядке

Алгоритм художника Алгоритм художника (painter’s algorithm) явно сортирует все грани сцены в
их приближения к наблюдателю (back-to-front) и выводит их в этом порядке.

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

Слайд 9

Алгоритм художника: проблемы

Не всегда грани возможно упорядочить

Не всегда грани возможно

Алгоритм художника: проблемы Не всегда грани возможно упорядочить Не всегда грани возможно сравнить по координате z
сравнить по координате z

Слайд 10

ё

Упорядочивание граней

Проведем через одну из граней плоскость и проверим, лежит ли другая

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

Слайд 11

Пять проверок в алгоритме художника

1. Накладываются ли x-габариты мн-ков?
2. Накладываются ли y-габариты

Пять проверок в алгоритме художника 1. Накладываются ли x-габариты мн-ков? 2. Накладываются
мн-ков?
3. P полностью за плоскостью Q по отношению к наблюдателю?
4. Q полностью перед плоскостью P по отношению к наблюдателю?
5. Пересекаются ли проекции многоугольников на плоскость (x, y)?

Слайд 12

Метод двоичного разбиения пространства (1/3)

Пусть известно, что плоскость π разбивает все грани

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

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

Слайд 13

Метод двоичного разбиения пространства (2/3)

A

B

C

D

C

E1

E2

+

-

+

-

+

-

A

B

C

D

E

E

+

-

Метод двоичного разбиения пространства (2/3) A B C D C E1 E2

Слайд 14

Метод двоичного разбиения пространства (3/3)

class BSPNode {
Face *face; // Грань объекта

Метод двоичного разбиения пространства (3/3) class BSPNode { Face *face; // Грань
BSPNode *positive;
BSPNode *negative;

}

void BSPNode::Draw() {
if(face->Sign(viewer) == 1) {
if(negative) negative->Draw();
face->Draw();
if(positive) positive->Draw();
} else {
if(positive) positive->Draw();
face->Draw();
if(negative) negative->Draw();
}
}

Слайд 15

Лицевые и нелицевые грани в OpenGL

void glFrontFace(GLenum type);
type = {GL_CW|GL_CCW}

void glCullFace(GLenum

Лицевые и нелицевые грани в OpenGL void glFrontFace(GLenum type); type = {GL_CW|GL_CCW}
type);
type = {GL_FRONT|GL_BACK (по умолчанию)}

glEnable(GL_CULL_FACE); glDisable(GL_CULL_FACE);

x

y

z

A1

A2

A3

A1

A3

A2

e2

e1

e2

e1

Слайд 16

Z-буфер

Необходимо создать z-буфер

glutDisplayMode(GLUT_DEPTH|/*…*/);

Перед рисованием сцены очистить z-буфер

glClear(GL_DEPTH_BUFFER_BIT|/*…*/);

Включить или выключить

Z-буфер Необходимо создать z-буфер glutDisplayMode(GLUT_DEPTH|/*…*/); Перед рисованием сцены очистить z-буфер glClear(GL_DEPTH_BUFFER_BIT|/*…*/); Включить
сравнение z координат

glEnable(GL_DEPTH_TEST);

glDisable(GL_DEPTH_TEST);

Возможно задать операцию сравнения

glDepthFunc(GLenum type);
type = {GL_ALWAYS|GL_NEVER|GL_LESS|GL_GREATER|
GL_EQUAL|GL_NOTEQUAL|GL_LEQUAL|GL_GEQUAL}

Возможно включить или выключить запись в z-буфер

glDepthMask(TRUE); или glDepthMask(FALSE);

Слайд 17

Уменьшение количества вершин

1

0

2

3

4

5

GL_TRIANGLE_FAN: 3n vs. 1+n, n>1

1

0

2

3

4

5

6

7

GL_TRIANGLE_STRIP: 3n vs. 2+n

Уменьшение количества вершин 1 0 2 3 4 5 GL_TRIANGLE_FAN: 3n vs.
GL_QUAD_STRIP: 4n vs. 2+2n

1

0

3

2

5

4

6

7

Имя файла: Удаление-невидимых-линий-и-поверхностей.pptx
Количество просмотров: 186
Количество скачиваний: 0