Введение в компьютерную графику
Полугодовой курс ВМиК МГУ, 2002
     

Задание №5. Визуализация природных явлений.

 

Начало: 17 апреля 2002 года.
Конец: 2 мая 2002 года (23:59)

Автор задания:
Александр Мальковский

Версия для печати здесь (zipped doc - 94кб)

 

Визуализация растительности.

Неотъемлемой частью естественных ландшафтов является растительность, то есть трава, кусты, деревья и др. Традиционно в игровых приложениях и приложениях, направленных на визуализацию, эти элементы подробно не рассматриваются, и обычно при рассмотрении данного вопроса, останавливаются лишь на простейшем наложении текстуры на ландшафт (a-la трава) и псевдо-трехмерной визуализации деревьев. Но от визуализации растительности, очевидно, существенно зависит качество визуализации сцены в целом. Если мы рассматриваем естественные ландшафты (как в нашем задании), то растительность занимает существенную часть пространства и требования к качеству визуализации здесь особенно высокие. В игровых приложениях данной тематике уделяется мало внимания из-за того, что повышение качества визуализации растительности влечет к замедлению основного игрового процесса, а в приложениях данного типа это неприемлемо, так как основой здесь служат именно игровые процессы, а процессы визуализации имеют лишь второстепенное значение. В приложениях, которые чисто направлены на визуализацию все совсем наоборот. Здесь все время направлено на детальную прорисовку картинки, и именно такие приложения мы и будем рассматривать. Но не следует забывать, что интерактивность также должна присутствовать, то есть должны присутствовать возможности передвижения по сцене, изменение параметров сцены (интерактивное) и др. Будем разделять в данном вопросе две подзадачи: визуализация травы и визуализация деревьев.

Визуализация травы.

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

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

Здесь традиционно рассматривают два подхода, назовем их условно горизонтальным и вертикальным методами.

Горизонтальный метод.

Предположим, что у нас есть текстура с травой. Из этой текстуры мы получаем некоторое заданное число текстур следующим образом: в исходной текстуре произвольным образом делается некоторое число альфа-дырок (то есть мы рассматриваем текстуру в формате RGBA и просто обнуляем значение альфа у текстуры в данной точке).

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

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

Воздействия ветра ("колыхание" травы) можно реализовать только определенными смещениями слоев по определенной траектории, что является не слишком реалистичном, но в некоторых случаях является достаточным.

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

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

Таким образом, данным методом можно реализовать только "невысокую" траву.

Вертикальный метод.

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

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

Также мы можем опуститься в траву и "пролететь" сквозь траву. Мы можем визуализировать траву произвольной высоты. Также можно производить сложные деформации, как следы на траве и др.

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

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

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

Визуализация деревьев.

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

 Затем на эти два треугольника  стали накладывать текстуры с "дырками" чтобы передать неоднородность дерева и показать некоторое присутствие листьев. Также используется небольшая прозрачность, чтобы сквозь одно дерево можно было немного увидеть другие деревья. Этот метод является достаточно эффективным и реалистичным при визуализации расположенных далеко от наблюдателя лесных массивов.

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

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

Наиболее реалистичным (схожим с реальными деревьями), но как следствие, медленным, является следующий метод иерархического построения дерева. Здесь за основу берется математическая модель основанная на двоичном дереве. Лист в двоичном дереве соответствует "листу" в модели, а узел - как место раздвоения ствола. Процесс построения дерева рекурсивен. Глубина рекурсии соответствует степени ветвистости дерева. На каждом шаге мы строим участок ствола: берем текущую матрицу преобразования координат и в этих координатах строим цилиндр вверх по оси Y (считаем, что исходной системой координат была система координат, где ось Y направлена вверх, ось X - направо, а ось Z - на наблюдателя, то есть стандартная система координат в OpenGL). Длина цилиндра устанавливается заранее и уменьшается в соответствии с глубиной рекурсии. Далее мы два раза рекурсивно вызываем данную процедуру с измененной матрицей системой координат. Для первого вызова мы поворачиваем ее вправо вокруг оси Z (то есть отклоняем от оси Y) на угол ALPHA, для второго - поворачиваем вправо на угол 90 - ALPHA (преобразования ведутся с матрицей, которую "передали" на данный шаг рекурсии, а не с глобальной матрицей преобразований). Затем поворачиваем систему координат вокруг новой оси Y на угол BETA (углы ALPHA и BETA задаются заранее). Как только глубина рекурсии достигнет некоторого порогового значения, то рисуется лист, и дальше рекурсия не идет.

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

Таким образом, общий метод таков: дальние лесные массивы реализуются как крест накрест наложенные треугольники (или прямоугольные плоскости - в зависимости от типа дерева) с нанесенными на них текстурами в формате RGBA. Используется альфа тест и тест прозрачности. Ближние деревья, но расположенные на  достаточном отдалении от наблюдателя, чтобы он не смог их "детально" изучить и "пролететь" сквозь него. Ближние деревья (одно или несколько ближайших деревьев вокруг пользователя) визуализируются с помощью метода, основанного на двоичном дереве. Для этих деревьев детально прорисовывается внутренняя структура и наблюдатель имеет возможность попасть "внутрь" модели дерева (имеется ввиду, попасть не внутрь ствола, а пролететь сквозь ветви и т. п.).

Моделирование травы "горизонтальным методом". 5 баллов
Моделирование травы "вертикальным методом". 6 баллов
Моделирование травы комбинированным методом. 8 баллов
Простейшая реализация деревьев. +3 балла
Реализация деревьев на основе направленных плоскостей. +4 балла
Реализация деревьев на основе двоичного дерева. +7 баллов
Реализация воздействия ветра и других эффектов, вызывающих изменение моделей травы и деревьев. +4 балла
Интерактивное изменение сцены (добавление деревьев и др.). +2 балла
Простейшая реализация ландшафта. +2 балла
Возможность передвижения по сцене. +2 балла
Главная | О курсе | Лекции | Библиотека | Задания | Оценки | FAQs
  (с) Лаборатория компьютерной графики, 1997-2002
Дизайн: Алексей Игнатенко