Модуль 2 «Математические методы, модели и алгоритмы компьютерной геометрии» Лекция 16 «Построение реалистических изображений» к.ф.-м.н., доц. каф. ФН-11, Захаров Андрей Алексеевич, ауд.:930а(УЛК) моб.: 8-910-461-70-04, email: azaharov@bmstu.ru МГТУ им. Н.Э. Баумана 9 декабря 2015 г. Введение Изображение формируется путём определения цвета и яркости его точек при некоторой модели света. В том или ином виде выполняется сканирование изображения. Суть выполняемых действий можно описать следующим образом. В каждой точке изображения построим линию визирования, найдем точку её пересечения с моделью геометрии объекта, в найденной точке вычислим нормаль к поверхности объекта и её оптические свойства, определим цвет и яркость точки изображения. Для быстрого определения точки пересечения модели линией визирования, нормали и оптических свойств модели в этой точке используется не сама геометрическая модель, а её триангуляционная сетка. Рассмотрим действия, выполняемые с триангуляционной сеткой. Для определения отражающей свет точки модели выполним пересечение её триангуляционной сетки со сканирующей линией визирования. Эту линию построим из точки изображения перпендикулярно проекционной плоскости (как для параллельной проекции, так и для центральной проекции). Поиск точек пересечения линии и треугольников упрощается, если его выполнять в местной системе координат, связанной с проекционной плоскостью. Для этого перед сканированием аппроксимирующие геометрическую модель треугольники переведем в местную систему координат. Определение яркости и цвета точки изображения Вычислим яркость и цвет точки изображения с координатами x и y. Для этого, переведем в систему координат наблюдателя координаты источников света. Найдем пересечение линии визирования с триангуляционной сеткой. В системе координат наблюдения этот поиск сводится к определению треугольников, в проекции которых лежит точка с координатами x и y. Последняя задача является двумерной, что уменьшает объём вычислений. Скорость вычислений позволяют повысить сортировки, бинарные деревья и другие приемы. Для найденных треугольников в точках пересечения вычислим направление нормали и оптические свойства. Если моделируемый объект не прозрачен, то нас будет интересовать только один треугольник, а именно тот, у точки пересечения которого наибольшая координата z. Итак, для заданной точки изображения известны направление линии визирования, точка поверхности объекта, направление нормали поверхности, направление на каждый источник света, интенсивность и цвет каждого источника света, оптические свойства (излучение, прозрачность, поглощение, отражательная способность для каждого основного цвета) поверхности. По перечисленным сведениям можно определить яркость и цвет точки изображения. Глобальное освещение Модель освещения с трассировкой лучей предназначена для расчёта интенсивности отраженного к наблюдателю света в каждой точке (пикселе) изображения. Она может быть локальной или глобальной. В первом случае учитывается только свет, падающий от источника света и ориентация поверхности, а во втором случае учитывается также свет, отраженный от других объектов сцены или пропущенный сквозь них. Глобальная модель освещения является более сложной, а значит, и более медленной. На сегодняшний день наиболее популярными являются модели трассировки лучей (ray tracing) и анализа излучательности (radiosity), дополняющие друг друга. Модель трассировки лучей адекватно передаёт оптические эффекты в сценах, насыщенных зеркальными поверхностями, если, например, значительная часть объектов сделана из стекла, полированного металла и других аналогичных материалов. Модель анализа излучательности лучше передаёт оптические эффекты в сценах с рассеивающими поверхностями, например в интерьере зданий. Трассировка лучей Модель трассировки лучей основана на том факте, что из всех лучей, испускаемых источником, на формируемое изображение влияют только те, которые, в конце концов, попадают в глаз наблюдателя или в объектив камеры и проходят через центр проецирования. Луч может попасть в объектив камеры прямо от источника, после однократного отражения от поверхности, видимой объективом камеры, после многократного отражения от разных объектов или после преломления. Трассировка лучей При реализации метода трассировки рассматриваются лучи, проходящие через отдельные элементарные участки плоскости наблюдения — пиксели. Каждый луч либо попадает на поверхность какого-нибудь объекта сцены, в том числе и источника света, либо уходит в бесконечность и теряется там. Пикселям, через которые проходят такие «потерянные» лучи, нужно присвоить цвет фона. Для тех лучей, которые попали на какую-либо поверхность, нужно вычислить цвет точки пересечения с объектом. Если применить для этого модель Фонга, то сформируется точно такое же изображение, как и при использовании локальной модели. При трассировке лучей первым делом нужно проанализировать, освещена ли точка пересечения луча с поверхностью светом от какого-либо источника. Для этого вычисляются зондирующие лучи (feeler rays), «исходящие» из этой точки поверхности в сторону каждого источника света. Если зондирующий луч по дороге «упирается» в какой-либо объект, то свет от соответствующего источника не достигает этой точки поверхности и она оказывается в тени по отношению к этому источнику. Поэтому можно считать, что никаких вычислений, связанных с этим источником, для определения освещённости анализируемой точки выполнять не нужно. Если все объекты непрозрачны и в процессе анализа не рассматривается влияние отражения от поверхностей других объектов, то получится изображение, в котором в дополнение к тому, что сформировано по модели Фонга, появятся ещё и тени. Трассировка лучей Теперь предположим, что некоторые поверхности обладают свойствами зеркального отражения. Тогда можно проследить дальнейший путь зондирующего луча после отражения от промежуточной поверхности и продолжать эту процедуру до тех пор, пока не выяснится, что луч ушёл в бесконечность или попал в источник. Такую процедуру, можно реализовать в виде рекурсии и принимать во внимание поглощение света при каждом очередном отражении. Процесс построения трассы лучей заканчивается, когда все лучи уходят за пределы сцены или когда интенсивность света падает ниже определённого предела. Хотя рассмотренный алгоритм трассировки лучей и учитывает диффузное рассеяние света в точке пересечения луча с поверхностью, засветка других поверхностей рассеянным в результате такого отражения светом игнорируется. В противном случае, если попытаться проследить траекторию этих лучей, задача неимоверно усложнится. Поэтому этот алгоритм применяется при отображении сцен, в которых большинство объектов обладает зеркальными свойствами. Метод анализа излучательности Метод анализа излучательности очень хорошо подходит для расчета освещения сцен, в которых подавляющее большинство объектов имеет поверхности с диффузным рассеиванием. В этом случае можно сформировать глобальное интегральное уравнение энергетического баланса, решение которого позволит получить цвет каждой из полигональных поверхностей. Этот метод довольно сложен и для его решения применяются численные методы. Анализ излучательности и возможности метода трассировки лучей нужно применять совместно, чтобы воспроизвести растровое изображение реалистичного закрашивания. Анализ излучательности используется как предварительный этап для закрашивания, при этом вычисляется глобальное (рассеянное) решение освещения. Далее метод трассировки лучей добавляет в сцену зеркальные глянцевые отсветы и отражения. Таким образом, создаётся естественная сцена, освещённая как направленным, так и отраженным светом с едва различимыми тенями, обычно присутствующими в реальном мире. Полученные значения излучательности не зависят от положения наблюдателя и для статических элементов сцены их можно не пересчитывать при изменении положения наблюдателя. Методы закраски На практике используются три основных метода закраски: однотонная, методом Гуро и методом Фонга. Метод Гуро основан на интерполяции значений интенсивности света, а метод Фонга — на интерполяции нормалей, для каждой из которых может применяться любая модель света. Пиксельное изображение при любом методе закраски формируется одинаковым образом: для каждого пикселя изображения находят точку модели (или несколько точек, если модель прозрачная), от которой приходит свет, и по интенсивности света и оптическим свойствам поверхности определяют яркость и цвет точки изображения. Простейший метод визуализации многоугольной поверхности — это присвоить определённый цвет всем спроектированным точкам поверхности. В этом случае на основе модели освещённости определяются интенсивности трёх RGB-компонентов цвета в такой отдельной точке поверхности, как вершина или центр масс многоугольника. При этом полагают, что нормаль постоянна в пределах своего треугольника. Данный подход, называемый однотонной закраской известной также как закраска с постоянной интенсивностью, или равномерное затенение (flat shading), предлагает быстрый и простой метод отображения многоугольных граней объекта, что может быть использовано для быстрого получения общего внешнего вида криволинейной поверхности. Методы закраски Визуализация плоских поверхностей многоугольника позволяет точно отобразить поверхность, если справедливы все следующие предположения: I Триангуляционная сетка является реальной моделируемой поверхностью, а не аппроксимацией последней. I Все источники, освещающие многоугольник, расположены достаточно далеко от поверхности, так что n · l и функция затухания равна константе на поверхности многоугольника. I Точка наблюдения достаточно удалена от многоугольника, так что произведение v · r постоянно по области многоугольника. Если каждая грань треугольника в сети закрашивается индивидуально, то она отличается от соседних, ориентация которых различна, что приводит к граненому изображению криволинейных поверхностей. Простое решение использования более мелкой сетки оказывается крайне неэффективным, поскольку различие в закрашивании между смежными треугольниками ещё более подчеркивается эффектом полос возмущения (полос Маха, Mach bands), который преувеличивает изменение интенсивности в любой границе, где есть неоднородность по величине интенсивности. На границе между двумя треугольниками тёмный треугольник выглядит более тёмным, а светлый более светлым. Эффект полос Маха ещё более заметен для цветных изображений. Методы закраски Как альтернативу оценке освещённости в каждой точке треугольника можно использовать интерполированное закрашивание (smooth shading), при котором информация о закрашивании многоугольника линейно интерполируется относительно значений, определённых для его вершин. В порядке увеличивающейся сложности (и реалистичности) модели такого закрашивания известны как закрашивание по методу Гуро и закрашивание по методу Фонга, по именам учёных Генри Гуро (Henri Gourand) и Фонг Буи Туонг (Phong Bui Tuong), которые их разработали. Оба эти метода сейчас поддерживаются на аппаратном уровне систем машинной графики. В методе Гуро по значениям нормалей в вершинах каждого треугольника определяются интенсивности отраженного света в его вершинах. По интенсивности света Ia , Ib и Ic в вершинах a, b и c некоторого треугольника интенсивность отраженного света от любой его внутренней точки определяется формулой I(a, b, c) = aIa + bIb + cIc , где a, b, c — барицентрические координаты на плоскости проекции произвольной точки треугольника. Метод Гуро устраняет разрывы, присущие плоской визуализации, но имеет и свои недостатки. Методом Гуро трудно получить чёткие блики, особенно если они небольших размеров. Методы закраски Метод закраски Фонга основан на интерполяции в пределах каждого треугольника значений нормалей к поверхности. В каждой вершине треугольника pi должна быть вычислена нормаль ni к поверхности отображаемого объекта. Нормали в вершинах имеют свое истинное направление, а в пределах каждого треугольника принимается линейный закон их изменения от вершины к вершине. Пусть в вершинах pa = (xa , ya , za ), pb = (xb , yb , zb ), pc = (xc , yc , zc ) некоторого треугольника нормали равны единичным векторам na , nb , nc тогда нормали во внутренних точках треугольника будем вычислять следующим образом: n(a, b, c) = ana + bnb + cnc , (1) где a, b, c — барицентрические координаты на проекционной плоскости произвольной точки p = (x, y, z) треугольника. Несмотря на то, что векторы na , nb , nc нормированы, вектор n(a, b, c) в общем случае не имеет единичной длины и его следует нормировать. Методы закраски Барицентрические координаты определим из системы уравнений axa + bxb + cxc = x, aya + byb + cyc = y, a + b + c = 1. Значение радиуса-вектора точки треугольника определяется по формуле p(a, b, c) = apa + bpb + cpc . Барицентрические координаты a, b и c в пределах треугольника принимают неотрицательные значения. Если хотя бы одна из барицентрических координат отрицательна, то это означает, что точка лежит за пределами треугольника. При аппроксимации (1) нормали плавно меняют свое направление при переходе от одного треугольника к другому, поэтому на точечных изображениях поверхность выглядит гладкой. Метод Фонга полностью устраняет полосы Маха, однако значительно увеличивает объём вычислений. Отображение шероховатости Для того чтобы добавить мелкие детали поверхности, можно использовать массивы текстур, однако они обычно неэффективны для моделирования шероховатых поверхностей таких объектов, как апельсины, клубника и изюм. Детали интенсивности света, хранящиеся в массиве текстур для этих объектов, задаются независимо от параметров освещения, таких как направление на источник света. Лучший метод моделирования шероховатости поверхности — это применить функцию возмущений к нормали поверхности, а затем использовать возмущённый вектор нормали в расчётах модели освещения. Данный метод называется отображением шероховатости поверхности (bump mapping). Нормаль к поверхности Для гладкой поверхности вектор нормали существует в каждой её точке и определяет локальную ориентацию участка поверхности в окрестности этой точки. Метод вычисления компонентов вектора нормали зависит от принятого способа математического описания поверхности. Рассмотрим сначала способы вычисления нормали для плоскости. Плоскость описывается уравнением: ax + by + cz + d = 0. Уравнение плоскости можно записать и в терминах нормали n в точке p0 , которая принадлежит этой плоскости: n · (p − p0 ) = 0, где p — любая точка (x, y, z) на рассматриваемой плоскости. Сравнивая эти два уравнения, получим выражение для вектора нормали: n = (a, b, c). Плоскость может быть также однозначно задана совокупностью трёх точек p0 , p1 , p2 , не лежащих на одной прямой. Векторы p2 − p0 и p1 − p0 параллельны плоскости, и для определения нормали можно использовать их векторное произведение: n = (p2 − p0 ) × (p1 − p0 ). При определении нормали таким способом нужно внимательно отнестись к порядку сомножителей в векторном произведении. Нормаль к поверхности Нормаль к поверхности, заданной уравнением в неявной форме f (x, y, z) = 0, T ∂f ∂f ∂f , , . ∂x ∂y ∂z В системах компьютерной графики предпочтение следует отдавать параметрической форме (parametric form), особенно при описании кривых и поверхностей. При этом координаты x, y и z любой точки на поверхности представляют собой независимые уравнения от двух параметров t и τ : определяется вектором градиента (gradient vector): n = x = x(t, τ ), y = y(t, τ ), z = z(t, τ ). Используя параметрическое представление поверхности, нормаль в точке p(t, τ ) = [x(t, τ ); y(t, v); z(t, τ )]T можно вычислить на основании прямых, ∂p ∂p ∂p ∂p параллельных векторам и . Векторы и определяются ∂t ∂τ ∂t ∂τ ∂p ∂x ∂y ∂z ∂p ∂x ∂y ∂z следующим образом: = , , , = , , . ∂t ∂t ∂t ∂t ∂τ ∂τ ∂τ ∂τ Вектор нормали формируется как векторное произведение: ∂p ∂p n= × . ∂t ∂τ В большинстве случаев программисту приходится самостоятельно организовывать вычисление векторов нормалей в прикладной программе. Отображение шероховатости Чтобы обеспечить колебания нормали поверхности, модифицируем вектор p, добавив к нему небольшую функцию возмущений: p0 (t, τ ) = p(t, τ ) + b(t, τ )n, (2) где n — вектор единичной нормали к поверхности. Затем вычисляется возмущённая нормаль к поверхности: n0 = p0 t × p0 τ . (3) 0 Частная производная p по t равна: ∂ (p + bn) = pt + bt n + bnt . p0 t = ∂t Предполагая, что амплитуда функции колебаний b мала, получаем (4) p0 t ≈ pt + bt n. (5) p0 τ ≈ pτ + bτ n. Возмущённая нормаль к поверхности равна: (6) Аналогично n0 = pt × pτ + bτ (pt × n) + bt (n × pτ ) + bt bτ (n × n). Но n × n = 0, поэтому n0 = n + bτ (pt × n) + bt (n × pτ ). Последний этап — нормировать n0 . (7) Отображение шероховатости Существует несколько способов задания функции шероховатости b(t, τ ). Можно её задавать аналитически, но проще воспользоваться линейной интерполяцией по точкам, распределённым по бугоркам и впадинам поверхности. Тогда частные производные bt и bτ вычисляются с использованием конечных разностей. Таблицу шероховатости (таблицу опорных точек интерполяции функции) можно задать со случайным образом или используя специальный шаблон. Случайные распределения используются при моделировании нерегулярных поверхностей, таких как изюм, тогда как повторяющиеся шаблоны можно использовать, например, для моделирования поверхности апельсина. Чтобы избежать наложения, области пикселей делятся на части, а затем интенсивности полученных подпикселей усредняются. Тени Тени придают изображению значительно большую реалистичность. Из каждодневного опыта нам известно, что особенности отбрасывания тени одним объектом на другой предоставляют важную зрительную информацию о том, как эти два объекта расположены по отношению друг к другу. Если бы на рисунке тени отсутствовали, то невозможно было бы понять, на какой высоте над плоскостью «парят» сферы. Таким образом, тень передаёт большое количество информации: вы словно бросаете и второй взгляд на объект (из местонахождения источника света). Тени Если точка наблюдения совпадает с положением источника света, то все видимые точки поверхности модели будут освещены рассеянным и направленным светом. В общем случае при несовпадении точки наблюдения с источником света некоторая часть поверхности модели будет закрыта от источника, т.е. находиться в тени. Алгоритм определения затенения точек аналогичен алгоритму определения видимости точек. Если точка поверхности «видна» из точки источника света, то она освещена. Точки поверхности модели, которые видны из точки наблюдения, но не видны из источника света, находятся в тени и освещены только рассеянным светом. Это же справедливо и для нескольких источников света. Теневые узоры, полученные методом выявления видимых поверхностей, не зависят от положения глаза, поэтому при анимации, в которой перемещается только глаз, их не нужно пересчитывать. Однако когда объекты перемещаются относительно источника света, тени нужно пересчитывать каждый раз заново. При построении теней объём вычислений увеличивается. Точечные источники света дают чёткие тени. При освещении объекта распределёнными источниками света возникают области полутеней. Полутени возникают в тех точках отображаемого объекта, из которых видна только часть распределённого источника. Тени Точечные источники света дают чёткие тени. При моделировании протяженных источников света достигается большая реалистичность изображения. Такие источники отбрасывают более сложные тени: полную тень (umbra), внутрь которой свет от источника не попадает вообще, и более светлую полутень (penumbra), внутри которой видна только часть источника света. Функции визуализации поверхности OpenGL Поверхности можно отобразить с помощью процедур OpenGL, используя либо визуализацию поверхностей постоянной интенсивности, либо визуализацию Гуро. В OpenGL нет процедур для применения визуализации поверхностей по Фонгу. Метод визуализации выбирается с помощью функции: glShadeModel (surfRenderingMethod); Визуализация поверхностей постоянной интенсивности выбирается путём присвоения символьного значения GL_FLAT параметру surfRenderingMethod. Для затенения по методу Гуро (по умолчанию) используется символьная константа GL_SMOOTH. Декартовы компоненты вектора нормали к поверхности в OpenGL задаются командой: glNormal3* (Nx, Ny, Nz); В этой функции используются суффиксы-коды b (byte), s (short), i (integer), f (float) и d (double). Кроме того, если в массиве задаются векторные компоненты, прибавляется код-суффикс v. Функция glNormal задаёт компоненты вектора нормали к поверхности как значения параметра состояния, которые применяются ко всем последующим командам glVertex, а по умолчанию вектор нормали идет в положительном направлении оси z: (0.0, 0.0, 1.0). Функции визуализации поверхности OpenGL При плоской визуализации поверхностей для каждого многоугольника требуется только один вектор нормали к поверхности. Таким образом, нормаль ко всем многоугольникам можно, например, задать следующим образом: glNormal3fv (normalVector); glBegin (GL_TRIANGLES); glVertex3fv (vertexl); glVertex3fv (vertex2); glVertex3fv (vertex3); glEnd ( ); Если к заданному выше треугольнику нужно применить процедуру визуализации Гуро, потребуется указать вектор нормали для каждой вершины. glBegin (GL_TRIANGLES); glNormal3fv (normalVectorl); glVertex3fv (vertexl); glNormal3fv (normalVector2); glVertex3fv (vertex2); glNormal3fv (normalVector3); glVertex3fv (vertex3); glEnd ( ); Функции визуализации поверхности OpenGL Хотя векторы нормали не нужно задавать как единичные векторы, если их все же нормировать на единицу, вычисления сокращаются. Любая неединичная нормаль к поверхности автоматически преобразуется в единичную, если включить в программу команду: glEnable (GL_NORMALIZE); Данная команда также ренормирует векторы нормали, если они изменились при геометрических преобразованиях, таких как масштабирование или сдвиг.