Разделы презентаций


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

Содержание

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

Слайды и текст этой презентации

Слайд 1Удаление невидимых линий и поверхностей
Астана 2004
Лекция 9

Удаление невидимых линий и поверхностейАстана 2004Лекция 9

Слайд 2Методы удаления невидимых линий и поверхностей
При проецировании трехмерных объектов на

картинную плоскость (экран) часто оказывается, что отдельные части объектов (или

даже некоторые объекты сами) оказываются скрытыми от наблюдателя другими объектами сцены


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

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

Каркасное (wireframe)

Сплошное (solid)
В пространстве сцены
На картинной плоскости
Точные

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

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

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

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


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

Слайд 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) явно сортирует все грани сцены

в порядке их приближения к наблюдателю (back-to-front) и выводит их

в этом порядке.

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

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

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

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

грани возможно сравнить по координате z

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

Слайд 10ё
Упорядочивание граней

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

ли другая грань целиком по одну сторону относительно этой плоскости.



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


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

Слайд 11
Пять проверок в алгоритме художника
1. Накладываются ли x-габариты мн-ков?
2. Накладываются

ли y-габариты мн-ков?
3. P полностью за плоскостью Q по отношению

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

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

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

все грани (объекты) сцены на два непересекающихся множества в зависимости

от того, в каком полупространстве по отношению к данной плоскости они лежат

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

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

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

A
B
C
D
C
E1
E2
+
-
+
-
+
-
A
B
C
D
E
E
+
-

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

Слайд 14Метод двоичного разбиения пространства (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();
}
}

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

Слайд 15Лицевые и нелицевые грани в OpenGL
void glFrontFace(GLenum type);
type

= {GL_CW|GL_CCW}
void glCullFace(GLenum 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

Лицевые и нелицевые грани в OpenGLvoid glFrontFace(GLenum type);  type = {GL_CW|GL_CCW}void glCullFace(GLenum type);  type =

Слайд 16Z-буфер
Необходимо создать 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);

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

Слайд 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
GL_QUAD_STRIP: 4n vs. 2+2n
1
0
3
2
5
4
6
7

Уменьшение количества вершин102345 GL_TRIANGLE_FAN: 3n vs. 1+n, n>110234567 GL_TRIANGLE_STRIP: 3n vs. 2+n GL_QUAD_STRIP: 4n vs. 2+2n10325467

Слайд 18Дисплейные списки
GLuint n = glGenLists(1);
glNewList(n,GL_COMPILE);

glEndList();
Дисплейный список

(display list) – запомненная последовательность команд OpenGL.
Находим неиспользуемый номер

дисплейного списка

Сохраняем последовательность команд

Освобождаем номер дисплейного списка

glCallList(n);

Воспроизводим сохраненную последовательность команд (с теми же самыми параметрами!)

glDeleteLists(n,1);

Дисплейные спискиGLuint n = glGenLists(1); glNewList(n,GL_COMPILE);glEndList(); Дисплейный список (display list) – запомненная последовательность команд OpenGL. Находим неиспользуемый

Теги

Обратная связь

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

Email: Нажмите что бы посмотреть 

Что такое TheSlide.ru?

Это сайт презентации, докладов, проектов в PowerPoint. Здесь удобно  хранить и делиться своими презентациями с другими пользователями.


Для правообладателей

Яндекс.Метрика