Модуль 2 «Математические методы, модели и алгоритмы компьютерной геометрии» Лекция 14 «Методы изображения поверхностей» к.ф.-м.н., доц. каф. ФН-11, Захаров Андрей Алексеевич, ауд.:930а(УЛК) моб.: 8-910-461-70-04, email: [email protected] МГТУ им. Н.Э. Баумана 13 ноября 2015 г. Многогранники Наиболее распространённым представлением трёхмерного графического объекта является указание набора поверхностей-многоугольников, ограничивающих внутреннюю часть объекта. Многие графические системы хранят все описания объектов именно в форме наборов многоугольных поверхностей. Это упрощает и ускоряет визуализацию поверхности и отображение объектов, поскольку все поверхности описываются линейными уравнениями. По этой причине многоугольные описания часто называются стандартными графическими объектами. В некоторых случаях многоугольное представление является единственным доступным, но многие пакеты также позволяют описывать поверхности объектов с помощью других схем, например, с использованием сплайновых поверхностей, которые обычно преобразуются в многоугольные представления с целью обработки в конвейере наблюдения. Многогранники Чтобы описать объект как набор многоугольных граней, нужно указать координаты вершин всех многоугольных участков поверхности объекта. Затем для каждого многоугольника координаты вершин и информация по краям участков поверхности записываются в таблицы многоугольников вместе с информацией о векторе нормали к поверхности. Некоторые графические пакеты предлагают процедуры, позволяющие генерировать сетки из многоугольных поверхностей — наборов треугольников или четырёхугольников. Так можно описывать большие участки поверхности, ограничивающей объект, или даже всю поверхность с помощью одной команды. Кроме того, некоторые пакеты также предлагают процедуры вывода на экран таких распространённых форм, как куб, сфера или цилиндр, представленных многоугольными поверхностями. В профессиональных графических системах используются быстрые аппаратные реализации схем визуализации с помощью многоугольников, что позволяет отображать миллион или даже больше закрашенных многоугольников (обычно треугольников) за секунду, включая наложение текстуры на поверхность и применение специальных эффектов освещения. Функции многогранников OpenGL Многоугольные поверхности в программе OpenGL можно задать с помощью многоугольных примитивов. Чтобы ввести набор многоугольных участков для фрагмента поверхности объекта или полное описание многогранника, можно использовать константы (примитивы) OpenGL: GL_POLYGON, GL_TRIANGLES, GL_TRIANGLE_STRIP, GL_TRIANGLE_FAN, GL_QUADS и GL_QUAD_STRIP. Таким образом можно, например, представить боковую поверхность цилиндра в виде мозаичной структуры с помощью четырёхугольной полоски. Аналогично все стороны параллелограмма можно описать набором многоугольников, а все грани треугольной пирамиды задать с помощью набора связанных треугольных поверхностей. Функции GLUT правильных многогранников Кроме того, можно использовать функции GLUT вывода на экран пяти правильных многогранников. Библиотека GLUT предлагает 10 функций генерации названных тел: пять функций дают каркасные объекты, пять отображают грани многогранников как закрашенные области. Характеристики закрашиваемой области определяются свойствами материала и условиями освещения, заданными для сцены. Все правильные многогранники описываются в модельных координатах, так что все они центрированы в начале внешней системы координат. Чтобы получить четырехгранную правильную треугольную пирамиду (тетраэдр), используется одна из следующих двух функций: glutWireTetrahedron ( ); glutSolidTetrahedron ( ); Центр данного многогранника совпадает с началом внешней системы координат, а√радиус (расстояние от центра тетраэдра до любой вершины) составляет 3. Гексаэдр (куб) отображается с помощью функций: glutWireCube (edgeLength); glutSolidCube (edgeLength); Параметру edgeLength может присваиваться любое положительное значение двойной точности с плавающей запятой, а центр куба находится в начале координат. Функции GLUT правильных многогранников Чтобы отобразить восьмигранный октаэдр, вызывается одна из следующих команд: glutWireOctahedron ( ); glutSolidOctahedron ( ); Данный многогранник имеет равносторонние треугольные грани, а его радиус (расстояние от центра октаэдра до любой вершины) равен 1. Двенадцатигранный додекаэдр, центрированный в начале глобальной системы координат, генерируется командой: glutWireDodecahedron ( ); glutSolidDodecahedron ( ); Каждая грань данного многогранника — пятиугольник. Следующие две функции генерируют двадцатигранный правильный икосаэдр: glutWireIcosahedron ( ); glutSolidIcosahedron ( ); По умолчанию радиус (расстояние от центра многогранника в начале координат до любой вершины) икосаэдра равен 1, а все его грани — равносторонние треугольники. Поверхности второго порядка Уравнения объектов с криволинейными границами можно выразить в параметрической или непараметрической форме. В число объектов, наиболее часто используемых в графических приложениях, входят поверхности второго порядка (квадрики), которые описываются уравнениями второго порядка (квадратными). Эти поверхности включают сферы, эллипсоиды, торы, параболоиды и гиперболоиды и в графических пакетах обычно реализуются процедуры генерации этих поверхностей. Данные объекты часто представляются в мозаичной форме, что позволяет аппроксимировать поверхности многоугольными сетками. Сфера Ось Ось Ось В декартовых координатах сферическая поверхность радиуса r с центром в начале координат определяется как набор точек (x, y, z), удовлетворяющих уравнению: x2 + y 2 + z 2 = r2 . Сферическую поверхность можно также описать в параметрической форме, используя углы широты и высоты: x = r cos φ cos θ, −π/2 6 φ 6 π/2; y = r cos φ sin θ, −π 6 θ 6 π; z = r sin φ. Эллипсоид Эллипсоидальную поверхность можно описать как расширение сферической поверхности, где радиусы в трёх взаимно перпендикулярных направлениях могут иметь различные значения. Декартово представление точек на поверхности эллипсоида с центром в начале координат имеет вид: 2 2 2 y z x + + = 1. rx ry rz Параметрическое представление эллипсоида через угол широты φ и угол долготы θ выглядит так: x = rx cos φ cos θ, −π/2 6 φ 6 π/2; y = ry cos φ sin θ, −π 6 θ 6 π; z = rz sin φ. Тор Ось Ось Ось Ось Наиболее часто тор описывается как поверхность, полученная вращением окружности (или эллипса) вокруг компланарной осевой линии, не проходящей через центр этой окружности. Определяющими параметрами тора являются расстояние от центра окружности до оси вращения raxial и радиус окружности r. Уравнение поперечного сечения тора (окружности) имеет вид: (y − raxial )2 + z 2 = r2 . Вращая эту окружность вокруг оси z, получаем тор, точки на поверхности которого в декартовых координатах описываются следующим уравнением: p ( x2 + y 2 − raxial )2 + z 2 = r2 . Тор Параметрические уравнения тора с круговым сечением имеют вид: −π 6 φ 6 π; x = (raxial + r cos φ) cos θ, y = (raxial + r cos φ) sin θ, z = r sin φ, −π 6 θ 6 π. Тор можно также получить вращением не окружности, а эллипса вокруг оси z. Уравнение эллипса в плоскости yz, имеющего большую и малую полуось ry и rz , можно записать следующим образом: 2 2 y − raxial z + = 1, ry rz где raxial — расстояние от оси вращения z по оси y до центра эллипса. В результате получается тор, уравнение которого имеет такой вид: !2 p 2 x2 + y 2 − raxial z + = r2 . ry rz Параметрическое представление тора с эллиптическим сечением: −π 6 φ 6 π; x = (raxial + ry cos φ) cos θ, y = (raxial + ry cos φ) sin θ, z = rz sin φ, −π 6 θ 6 π. В записанном выше уравнении тора возможны дальнейшие модификации. Например, поверхность тора можно породить вращением окружности или эллипса по эллиптической траектории относительно оси вращения. Функции GLUT поверхностей второго порядка Сферу и многие другие трёхмерные объекты, являющиеся или ограниченные поверхностями второго порядка можно вывести на экран, используя функции, включенные в наборы OpenGL Utility Toolkit(GLUT) и OpenGL Utility (GLU). Все функции GLUT, которые легко внедрить в программу–приложение, имеют две версии. Один вариант каждой функции отображает каркасную поверхность, а другой — представляет поверхность как набор многоугольных участков закрашенных областей. Сфера GLUT генерируется с помощью одной из следующих функций: glutWireSphere (r, nLongitudes, nLatitudes); или glutSolidSphere (r, nLongitudes, nLatitudes); Здесь радиус сферы определяется переменной типа double. Параметры nLongitudes и nLatitudes задают целое число линий долготы и широты, которые будут использоваться для аппроксимации сферической поверхности четырёхугольной сеткой. Стороны участков четырёхугольной поверхности являются линейной аппроксимацией линий широты и долготы. Сфера определяется в модельных координатах, её центр находится в начале внешней системы координат. Функции GLUT поверхностей второго порядка Конус GLUT выводится на экран с помощью команды glutWireCone (rBase, height, nLongitudes, nLatitudes); или glutSolidCone (rBase, height, nLongitudes, nLatitudes); Радиус основания конуса rbase и высота height конуса определяются переменными типа double. Как и при изображении сферы GLUT, параметрам nLongitudes и nLatitudes присваиваются целые значения, задающие число ортогональных линий поверхности, аппроксимирующей четырёхугольной сетки. Линия долготы конуса является прямым отрезком, проходящим по поверхности конуса от вершины до основания и полностью лежащим в плоскости, содержащей ось конуса. Каждая линия широты отображается как набор прямых отрезков по периметру окружности на поверхности конуса, параллельной основанию конуса и лежащей на плоскости, перпендикулярной оси конуса. Конус описывается в модельных координатах, центр его основания находится в начале глобальной системы координат, а ось конуса проходит по оси z глобальной системы координат. Функции GLUT поверхностей второго порядка Изображение тора с круговым поперечным сечением получается с помощью одной из двух команд: glutWireTorus (rCrossSection, rAxial, nConcentrics, nRadialSlices); glutSolidTorus (rCrossSection, rAxial, nConcentrics, nRadialSlices); Top, получаемый посредством указанных процедур GLUT, можно описать как поверхность, порождённую вращением окружности радиуса rCrossSection вокруг компланарной оси z, где расстояние от центра окружности до оси z равно rAxial. Радиусы в этих функциях являются переменными типа double. Чтобы задать размер четырёхугольников в аппроксимирующей тор поверхностной сетке, параметрам nConcentrics и nRadialSlices присваиваются требуемые целые значения. Параметр nConcentrics задаёт число концентрических окружностей (с центром на оси z) на поверхности тора, а параметр nRadialSlices задаёт число радиальных сечений, проходящих через поверхность тора. Данные два параметра определяют число ортогональных линий сетки, проходящих по поверхности тора, причём линии сетки изображаются прямыми отрезками (границы четырёхугольников), расположенными между точками пересечения. Отображаемый тор центрирован в начале внешней системы координат, а его ось идет по оси z внешней системы координат. Функция GLUT изображения чайника с помощью кубических поверхностей На заре развития методов компьютерной графики для описания нескольких трёхмерных объектов были построены наборы данных для проверки методов визуализации. Такие объекты включали поверхности автомобиля «Фольксваген» и чайник, разработанный в Университете штата Юта (США). Набор данных для чайника, построенного Мартином Ньюэллом (Martin Newell) в 1975 году, содержал 306 вершин, определяющих 32 бикубических участка поверхности Безье. Поскольку определение координат точек сложной поверхности является длительным процессом, эти наборы данных, особенно чайник в виде поверхностной сетки, стали широко использоваться. Чтобы отобразить чайник в виде сетки из более тысячи бикубических участков поверхности, используется одна из следующих двух функций: glutWireTeapot (size); glutSolidTeapot (size); Параметр size типа double устанавливает значение максимального радиуса тела чайника. Чайник центрирован в начале внешней системы координат, а его вертикальная ось идет вдоль оси y. Функции GLU поверхностей второго порядка Функции GLU поверхностей второго порядка несколько сложнее настроить, но они дают больше поверхностей — сферу, цилиндр, конический цилиндр, конус, плоское круговое кольцо (или диск) и сегмент кругового кольца. Чтобы сгенерировать поверхность второго порядка с использованием функций GLU, нужно присвоить имя квадрике, активизировать процедуру визуализации поверхностей второго порядка GLU, а также задать значения параметров поверхности. Кроме того, можно указать значения других параметров, чтобы контролировать внешний вид поверхности второго порядка GLU. Функции GLU поверхностей второго порядка Приведённые ниже операторы иллюстрируют стандартную последовательность вызовов для отображения каркасной сферы с центром в начале внешней системы координат. GLUquadricObj *sphere1; sphere1 = gluNewQuadric ( ); gluQuadricDrawStyle (sphere1, GLU_LINE); gluSphere (sphere1, r, nLongitudes, nLatitudes); Название объекта второго порядка определяется в первом операторе, и в данном примере выбрано имя sphere1. Затем это имя можно использовать в других функциях GLU для обращения к этой конкретной поверхности второго порядка. Затем с помощью функции gluNewQuadric активизируется процедура визуализации поверхностей второго порядка, после чего с помощью команды gluQuadricDrawStyle для поверхности sphere1 выбирается режим отображения GLU_LINE. Таким образом, сфера выводится на экран в каркасной форме с отрезками между каждой парой вершин поверхности. Параметру r присваивается значение типа double, определяющее радиус сферы, и сферическая поверхность делится на набор многоугольных граней с помощью равномерно размещённых линий широты и долготы. Целое число линий долготы и широты задаётся в виде значений параметров nLongitudes и nLatitudes. Функции GLU поверхностей второго порядка Для отображения поверхностей GLU второго порядка доступны три других режима отображения. Если использовать символьную константу GLU_POINT как аргумент функции gluQuadricDrawStyle, поверхность второго порядка отобразится в виде точечного графика. В каждой вершине поверхности, сформированной пересечением линии широты и линии долготы, ставится точка. Другой вариант — использовать символьную константу GLU_SILHOUETTE. В результате получится каркасное изображение, с исключением прорисовки общих ребер между двумя компланарными многоугольными гранями. Наконец, при использовании символьной константы GLU_FILL многоугольные участки отображаются как закрашенные области. Функции GLU поверхностей второго порядка Изображения других примитивов GLU второго порядка формируются с использованием той же базовой последовательности команд. Чтобы получить изображения конуса, цилиндра или конического цилиндра, вместо функции gluSphere вызывается функция gluCylinder(guadricName, rBase, rTop, height, nLongitudes, nLatitudes); Основание этого объекта лежит в плоскости xy (z = 0), а ось проходит по оси z. Радиус основания этой поверхности второго порядка задаётся в параметре rBase, а радиус вершины поверхности — в параметре rТор. Если rТор = 0.0, получаем конус; если rTop = rBase, получаем цилиндр. В противном случае отображается усечённый конус. Параметру height присваивается значение высоты (типа double), и поверхность делится на несколько равномерно расположенных вертикальных и горизонтальных линий, как определяется целыми значениями — параметрами nLongitudes и nLatitudes. Функции GLU поверхностей второго порядка Плоское круговое кольцо или сплошной диск на плоскости xy (z = 0) с центром в начале внешней системы координат выводится на экран с помощью команды gluDisk (ringName, rInner, rOuter, nRadii, nRings); Внутренний и внешний радиусы задаются в параметрах rInner и rOuter (значения типа double). Если rInner = 0, диск сплошной. В противном случае он отображается с концентрическим отверстием в центре. Поверхность диска делится на набор граней, которые определяются целыми параметрами nRadii и nRings, задающими число радиальных сегментов, используемых в мозаичном представлении, и число концентрических окружностей соответственно. Ориентация кольца определяется по отношению к оси z, причём передняя часть кольца смотрит в направлении +z, а задняя — в направлении −z. Функции GLU поверхностей второго порядка Сегмент кругового кольца можно задать с помощью следующей функции GLU: gluPartialDisk (ringName, rInner, rOuter, nRadii, nRings, startAngle,sweepAngle); Параметр типа double — startAngle определяет угловое расстояние в градусах на плоскости xy, отсчитываемое по часовой стрелке от положительного направления оси y. Аналогично, параметр sweepAngle задаёт угловое расстояние в градусах от положения startAngle. В результате отображается сегмент плоского кругового диска от положения startAngle до startAngle + sweepAngle. Например, если startAngle = 0.0 и sweepAngle = 90.0, отображается сегмент диска, лежащий в первом квадранте плоскости xy. Функции GLU поверхностей второго порядка Отметим, что для любой поверхности GLU второго порядка можно выделить область памяти, а для удаления поверхности используется команда: gluDeleteQuadric (quadricName); Кроме того, можно определить ориентацию любой поверхности второго порядка, используя функцию: gluQuadricOrientation (quadricName, normalVectorDirection); Параметру normalVectorDirection присваивается либо значение GLU_OUTSIDE, либо GLU_INSIDE, чтобы указать направление векторов нормали к поверхности, где «outside» обозначает направление передней грани, a «inside» — направление задней грани. По умолчанию значение равно GLU_OUTSIDE. Для плоского кругового кольца направление передней грани по умолчанию совпадает с положительным направлением оси z (передняя грань находится «над» диском). Функции GLU поверхностей второго порядка Генерация векторов нормали к поверхности осуществляется при помощи функции: gluQuadricNormals (quadricName, generationMode); Параметру generationMode присваивается значение символьной константы, указывающей, как должны генерироваться векторы нормали к поверхности. Значение по умолчанию — GLU_NONE, означающее, что векторы нормали не генерируются, так как, обычно, на поверхность второго порядка не налагаются условия освещённости. Для затенения плоской поверхности (с каждой поверхностью соотносится постоянный код цвета) используется символьная константа GLU_FLAT. В результате для каждой многоугольной грани генерируется одна нормаль. Если нужно применить другие условия освещения и затенения, используется константа GLU_SMOOTH, и для каждой вершины поверхности генерируется вектор нормали. Также можно задать функцию, которая будет вызываться при ошибке в процессе генерации поверхности второго порядка: gluQuadricCallback (quadricName, GLU_ERROR, function) ; Суперквадрики Данный класс объектов является обобщением поверхностей второго порядка (квадрик). Для получения суперквадрик в уравнение поверхности второго порядка вводятся дополнительные параметры, что даёт большую гибкость в настройке форм объектов. В уравнения кривых вводится один дополнительный параметр, а в уравнениях поверхностей используются два новых параметра. Суперэллипс 0.5 1.0 1.5 2.0 2.5 3.0 Представление суперэллипса в декартовых координатах получается из соответствующего уравнения эллипса. Одним из возможных вариантов является запись декартова уравнения суперэллипса в такой форме: 2/s 2/s x y + = 1. rx ry где параметр s может иметь любое действительное значение. При s = 1 получаем обычный эллипс. Соответствующие параметрические уравнения суперэллипса можно выразить как x = rx coss θ, y = ry sins θ. −π 6 θ 6 π, Суперэллипсоиды Декартово представление суперэллипсоида получается на основе уравнения эллипсоида введением в него двух степенных параметров: " 2/s2 #s2 /s1 2/s1 2/s2 y z x + + = 1. rx ry rz При s1 = s2 = 1 получается обычный эллипсоид. Далее можно записать соответствующее параметрическое представление суперэллипсоида: x = rx coss1 φ coss2 θ, s1 s2 y = ry cos φ sin θ, −π/2 6 φ 6 π/2; s1 z = rz sin φ, −π 6 θ 6 π.