- •Какова выводная схема для получения матрицы соответствующей операции поворота трехмерной точки вокруг заданной оси?
- •Каковы матрицы вращения модели вокруг осей Ox, Oy, Oz?
- •Как получить матрицу соответствующей операции поворота модели вокруг оси отличной от Декартовых (Ox, Oy, Oz)?
- •Какова выводная схема для получения матрицы соответствующей операции масштабирования?
- •Что такое матрица масштабирования?
- •Что такое однородные координаты?
- •Как найти пересечение луча, по направлению заданного вектора и треугольника?
- •Как можно задать матрицу расположения модели объекта сцены с учетом расположения «камеры»?
- •Интерполяция (определение, для каких целей используется в кг)
- •Дать определение понятия полигональная модель (вершины, полигоны, полигональные поверхности, каркасные модели).
- •Алгоритм z-буфера.
- •Алгоритмы разделения пространства.
- •Алгоритм морфируемой анимации
- •Алгоритм скелетной анимации
- •Алгоритм удаления невидимых граней полигональной модели основанный на использовании так называемых «лицевых» и «нелицевых» граней полигональной модели.
- •Формат файлов хранения полигональных моделей DirectX.
- •Какие существуют технологии получения полигональных моделей (3ds Max, PhotoModeler, 3dRipper)?
Дать определение понятия полигональная модель (вершины, полигоны, полигональные поверхности, каркасные модели).
Полигональная модель – объект, который задается набором полигонов (иначе именуемых полигональными гранями) и потому объединяет множество таких однотипных элементов, или подобъектов, как вершины (Vertex), ребра (Edge) и грани (Face):
Вершины — это точки, в которых сходится и соединяется друг с другом любое число ребер; Ребра — это линии границы грани. Ребра могут быть видимыми, если соседние грани не лежат в одной плоскости, в противном случае они невидимы;
Грани (полигоны) — это участки плоскости треугольной или четырехугольной формы, представляющие собой элементарные ячейки сетки. В одной плоскости объекта может находиться множество граней, которые внешне будут совершенно неразличимы.
Полигональная сетка — объект в трехмерной графике, представляющий собой совокупность вершин и полигонов, который определяет форму отображаемого многогранного объекта.
Каркасная модель — модель объекта в трехмерной графике, представляющая собой совокупность вершин и ребер, которая определяет форму отображаемого многогранного объекта.
Алгоритм z-буфера.
Z-буферизация — в компьютерной трёхмерной графике, способ учёта удалённости элемента изображения.
Z-буфер представляет собой двумерный массив, каждый элемент которого соответствует пикселу на экране. Когда видеокарта отрисовывает пиксель, его удалённость просчитывается и записывается в ячейку Z-буфера. Если пиксели двух рисуемых объектов перекрываются, то их значения глубины сравниваются, и рисуется тот, который ближе, а его значение удалённости сохраняется в буфер. Получаемое при этом графическое изображение носит название z-depth карта.
Алгоритмы разделения пространства.
В компьютерной графике уже давно используются различные методы разделения объектного пространства на части с целью эффективной обработки только тех элементов сцены, которые наблюдатель может непосредственно увидеть через виртуальную "камеру". Всевозрастающая сложность геометрических сцен даёт прекрасную почву для исследования и разработки таких алгоритмов, причём если в компьютерной графике высокого уровня эти алгоритмы позволяют просто сократить время рендеринга сцены с месяцев до дней, то для графики реального времени они являются просто жизненно необходимыми - иначе понятие "интерактивная графика" просто бы отсутствовало.
Рассмотрим метод разделения объектного пространства, который называется octree (от латинского octa - восемь, и английского tree - дерево). Восьмеричное дерево. Данный алгоритм производит разделение объектного пространства на восемь подпространств. Общую схему работы можно представить следующими шагами:
1) Помещаем всю сцену в выровненный по осям куб. Этот куб описывает все элементы сцены и является корневым (root) узлом дерева.
2) Проверяем количество примитивов в узле, и если полученное значение меньше определённого порогового, то производим связывание (ассоциацию) данных примитивов с узлом. Узел, с которым ассоциированы примитивы, является листом (leaf).
3) Если же количество примитивов, попадающих в узел, больше порогового значения, производим разбиение данного узла на восемь подузлов (подпространств) путём деления куба двумя плоскостями. Мы распределяем примитивы, входящие в родительский узел, по дочерним узлам. Далее процесс идёт рекурсивно, т. е. для всех дочерних узлов, содержащих примитивы, выполняем пункт 2.
Данный процесс построения дерева может содержать несколько условий прекращения рекурсии:
1) Если количество примитивов в узле меньше или равно пороговому значению.
2) Если рекурсия (количество делений) достигла какой-то определённой глубины вложенности.
3) Если количество созданных узлов достигло порогового значения.
А теперь о том, как же именно применение данного алгоритма может помочь быстро откинуть части невидимой геометрии. Те элементы, что отображаются при рендеринге на экране, попадают в так называемый viewing frustum - пространство видимости
Теперь, в процессе рендеринга мы рекурсивно выполняем следующую процедуру: начиная с базового (root) куба, мы проверяем, попадает ли данный куб в поле зрения (viewing frustum). Если НЕТ - на этом всё и заканчивается, если же ДА - перемещаемся вглубь рекурсии на один шаг, т. е. поочерёдно проверяем видимость каждого из восьми подузлов корневого узла и т. д. Преимущество заключается в том, что если определено, что данный узел не виден, то можно смело не выводить и всю геометрию этого узла - она тоже будет не видна. Таким образом, ценой всего лишь нескольких проверок, мы отбросим значительную часть сцены. А в случае, если не виден корневой узел, на экран не будет выведено ничего. Сплошная экономия!
К сожалению, от достоинств алгоритма нужно перейти к его недостаткам, коих немало. Первый из них - это возможное деления примитива ребрами кубов дерева. Если примитив не полностью лежит в узле, его индекс заносится в отдельный массив. В процессе рендеринга ведётся учёт всех отрисованных "дробных" примитивов в специальном буфере, и если при выводе данного треугольника его индекс совпадёт с одним из индексов в буфере, мы не рисуем этот треугольник. Как показал опыт, помечать примитивы не так уж медленно, гораздо более медленно выводить геометрию три-четыре раза подряд.
Всё бы хорошо, да с делением примитива есть ещё одна проблема. Допустим, узлы I, II и III не видны. Однако узел IV может всё же попадать в поле зрения камеры, и видно, что частичка полигона всё же может выпасть. Что делать? Очевидно, что нельзя относить примитив к узлу, ориентируясь только на факт принадлежности вершины примитива к этому узлу. Наверное, все же вместо этого надо проверять, проходит ли РЕБРО примитива через пространство узла. Это может потребовать гораздо больше времени при построении дерева, но зато мы избежим выпадения полигонов. Кстати, структуру один раз построенного дерева можно записать в файл, и уже больше не строить его каждый раз при старте программы, а загружать из файла. В приведённом случае полигон придётся отнести ко всем четырём узлам.
Второй недостаток octree-дерева - это вывод всех объектов, находящихся в поле viewing frustum, но на самом деле в конечном счёте невидимых. По-видимому, чистым octree-based алгоритмом здесь не обойтись, необходимо дополнительно реализовать так называемый Z-buffer
Так же применяется Quadtree – задачи о туннелях (видим только часть туннеля перед нами, а все, что за спиной – не видим). BSP – бинарное дерево – плоские задачи.
