Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Поверхности Безье и Кунса.doc
Скачиваний:
69
Добавлен:
01.05.2014
Размер:
325.12 Кб
Скачать

Бикубическая поверхность Безье. Зеленая сетка соединяет контрольные точки

Теперь нам нужно взять уравнение для кривой Безье в точке u и "расширить" его так, чтобы можно было рассчитать поверхность в некой точке (u,v). Сделать это расширение довольно просто. Нам нужно просто рассчитать "влияние" каждой из 16 контрольных точек, получим:

Это будет "Уравнение 3".

Мы можем убедиться, что свойства кривой Безье сохранились и в случае поверхности Безье. Почему? Этому есть следующие причины:

  1. Поверхность интерполирует точки р00, р03, р30, и р33 в качестве конечных.

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

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

Метод булевой суммы (поверхности Кунса):

    В случае конструирования поверхности методом Кунса необходимо задать два семейства граничных кривых (в  инаправлениях). Уравнение поверхности Кунса имеет вид:

                                   

Граничные кривые представляют собой рациональные кривые Безье, управляющие точки которых получены с помощью методов интерполяции исходных точек поверхности, внутренние точки порции поверхности вычисляются с помощью билинейной интерполяции в двух направлениях. Обобщением поверхностей Кунса являются поверхности, интерполирующие всю заданную криволинейную сетку  (поверхности Гордона) [1]

 [

    где    - матрица управляющих точек с весами;

                          - матрица весов;

                          - матрица параметра  ;

                         - матрица параметра  ;

                          - матрица коэффициентов.

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

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

  ,

    где    ,;

             - базисные полиномы интерполяции Лагранжа.

Основные свойства рациональных поверхностей Безье:

  1. Поверхность полностью определяется набором вершин характеристической сетки  .

  2. Поверхность лежит в выпуклой оболочке точек  .

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

  4. Граничными кривыми порции поверхности являются рациональные кривые, управляемые набором  точек и соответствующих весов.

  5. Рациональная поверхность Безье аффинно- и проективно-инвариантна.

  6. Формой поверхности можно управлять подбором вершин характеристической сетки и соответствующих весовых коэффициентов.

Поверхности, построенные с использованием сплайнов:

Итак, после общего менеджмента сцены GPU получает данные о ее объектах. Здесь в дело вступает первый аппаратный модуль — Surface Engine, отвечающий за тесселяцию.

Рис. 1. Пример   поверхности , построенной с  использованием 

 сплайнов 

В DirectX 8 появилась возможность построения объектов с помощью кривых, основанных на контрольных точках. Такие поверхности и кривые, описываемые с помощью набора контрольных точек, называются сплайнами.

Использование сплайнов, с одной стороны, позволяет создавать очень сложные и реалистичные поверхности, а с другой — разгружает шину памяти, поскольку для расчетов в GPU передаются лишь контрольные точки, по которым он сам строит поверхности, описываемые кривыми. DirectX 8.0 поддерживает два типа сплайнов: полиномиальные поверхности и N-патчи (Npatches). GeForce3 поддерживает лишь фиксированную тесселяцию поверхностей — N-патчи. Фиксированная тесселяция ограничена по своим возможностям, и ее качество несколько уступает качеству, которое обеспечивает адаптивная тесселяция (см. ниже). Кроме того, при использовании N-патчей серьезной проблемой становится обнаружение столкновений — пересечений плоскостей, что ограничивает использование этой технологии во многих 3D-играх.

Рис. 2. Слева — разбиение поверхности при фиксированной тесселяции (Npatches), справа — та же поверхность при адаптивной (полиномиальной) тесселяции

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

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

Итак, полигоны, полученные в результате работы Surface Engine, подлежат дальнейшей обработке: необходимо применить к ним множество различных эффектов. Вот тут-то в дело и вступает новый программируемый T&L-блок nfiniteFX — одно из ключевых нововведений в GeForce3, геометрический процессор нового поколения с возможностью выполнения шейдеров — пиксельных и вершинных. Если пиксельные шейдеры, как явствует из названия, работают на уровне отдельных пикселов, то вершинные являются результатом дальнейшего развития возможностей блока T&L, каким мы его знаем по GeForce 256, GeForce2 и Radeon. Vertex Shader, или вершинный шейдер (Vertex — вершина, точка пересечения двух и более прямых), представляет собой небольшую программку на специальном языке, которая описывает операции над вершинами полигонов и исполняется GPU. Тем самым нагрузка переносится с центрального процессора на специализированный GPU, что обеспечивает заметный выигрыш в производительности. Работать с вершинами намного удобнее, чем с отдельными треугольниками. Следующий небольшой пример наглядно характеризует эффективность данной технологии.

Рис. 3. Примеры разбиения объектов на треугольники

На рис. 3 представлены два объекта, состоящие из треугольников. Первый объект содержит восемь треугольников, но при этом только 10 вершин. Если рассматривать его как совокупность отдельных треугольников, то вершин будет уже 24. Второй объект содержит четыре треугольника и шесть вершин. При построении изображений может использоваться информация не об отдельных треугольниках, а об их совокупности; естественно, что при этом объем необходимых для построения данных заметно снижается. Как видим, используя такие хитрости, можно заметно сократить объем данных и упростить расчеты. В последней спецификации вершинный шейдер может содержать до 128 команд, описывающих различные операции с вершинами, точнее с их параметрами. На рис. 4представлен фрагмент 3D-конвейера с вершинным шейдером.

Каждая вершина может описываться следующими параметрами: координаты x, y и z, цветовые характеристики, текстура, характеристики альфа-канала и освещенности. Вершинный шейдер работает с уже имеющимися вершинами, не удаляя их и не создавая новых, а только изменяя параметры существующих. Совокупность вершин составляет объекты сцены. Воздействуя на вершины, мы тем самым воздействуем на сами объекты. С помощью программируемых вершинных шейдеров можно достаточно точно контролировать процесс трансформации (изменения координат) и освещенности объекта. Хотя вершинные шейдеры являются следующей стадией развития аппаратного T&L-блока, GPU может содержать и его традиционный блок. Правда, во время работы одного из компонентов второй простаивает. Одновременная работа аппаратного T&L и выполнение вершинного шейдера применительно к одному объекту невозможны. Это позволяет избежать ошибок и несогласованности.

В целом такой подход обеспечивает совместимость нового графического акселератора с имеющимся программным обеспечением, рассчитанным на использование традиционного блока T&L. Хотя при разработке новых программных продуктов в первую очередь будет делаться ставка на использование программируемых вершинных шейдеров.

Гладкая кривая, которая проходит через две или более контрольных точек, управляющих формой сплайна. Два из наиболее общих типов сплайнов - кривые Безье (Bezier curves) и В -сплайны (B-spline curves). Типичным примером сплайнов являются также неоднородные рациональные B-сплайны (Non-Uniform Rational B-Spline - NURBS). Сплайны состоят из вершин (vertices) и сегментов (segments). Каждая вершина сплайна имеет касательные векторы (tangents), снабженные на концах управляющими точками, или маркерами (handels). Маркеры касательных векторов управляют кривизной сегментов сплайна при входе в вершину, которой принадлежат касательные векторы, и выходе из нее. В зависимости от свойств касательных векторов различают следующие типы вершин: С изломом (Corner), Сглаженная (Smoos), Безье (Bezier) и Безье с изломом (Bezier Corner).

Сплайн с двумя вершинами с изломом

Тот же сплайн, после преобразования одной из вершин к типу "сглаженная"

Тот же сплайн после преобразования второй вершины к типу Безье

Сплайн с вершиной типа "Безье с изломом"

Примитивы описания поверхностей ( Open GL )

В этом разделе мы поговорим о том, что вообще такое OpenGL, для чего это нужно. Для начала, вы должны неплохо знать ОС Windows, а также язык Си++ (в данном случае, Visual C++,

Итак, OpenGL (Открытая Графическая Библиотека) - это программный интерфейс (API) для разработки приложений с использованием 2D и 3D графики. OpenGL стоит как бы между аппаратным обеспечением, и пользовательским уровнем. Основные особенности этой библиотеки являються: Стабильность: Это означает, что дополнение в OpenGL реализуется так, что бы сохранить совместимость с более старым программным обеспечением.

Переносимость (независимость): Код программы, которую вы написали, скажем, под Windows, можно легко перенести на Linux и другие ОС. То есть, OpenGL не зависит от какой ни будь операционной системы, как, например DirectX.

Простота в использовании: Приложения, написанные с помощью OpenGL, имеют сравнительно не большой объем кода. Также эта библиотека имеет понятный интерфейс. И разобраться в коде программы очень просто.

Основные возможности OpenGL: · Набор базовых примитивов: точки, линии, многоугольники и т.п. · Видовые и координатные преобразования · Удаление невидимых линий и поверхностей (z-буфер) · Использование сплайнов для построения линий и поверхностей · Наложение текстуры и применение освещения · Добавление специальных эффектов: тумана, изменение прозрачности, смешивание цветов (blending), устранение ступенчатости (anti-aliasing).

Существует реализация OpenGL для разных платформ. будет использовать библиотеки для работы в ОС Windows- GLUT и GLAUX (это библиотеки для создания консольных приложений).

Синтаксис команд OpenGL:

Разобраться с синтаксисом команд, используемых в OpenGL. В OpenGL названия типов данных отличаются от названий в Си++ (то есть эти типы переопределены). Например, тип Glint в OpenGL- это тип int в Си++. Зачем такое делать? Все это делалось по одной причине- для переносимости кода на другие платформы. Рассмотрим все типы данных:

GLint - int

GLuint - unsigned int

GLfloat - float

GLdouble - double

GLbyte - char

Для того, что бы все команды были понятны, они имеют следующий вид: glCommand_name[n][type][v] Таким образом имя любой команды состоит из нескольких частей:

gl Это имя библиотеки, в которой находиться данная функция. Мы можем использовать и другие библиотеки, а именно: glu- библиотека GLU, glut- функции из библиотеки GLUT, glaux- библиотека GLAUX.

Comand_name Это имя команды, например InitWindowSize (к стати, эта команда нам должна быть уже известна).

[n] Число аргументов.

[type] Тип аргумента. Возможные типы: f GLfloat d GLdouble s GLshort us GLushort b GLbyte ub GLubyte

[v] Если указан этот параметр, то это означает, что в качестве параметров функции используется указатель на массив.

Рассмотрим пару функций, что бы закрепить то что мы выучили: Функция glColor3d(0.1,0.5,0.3); означает, что мы используем функцию, которая находиться в библиотеке GL. Эта функция состоит из трех параметров, типа GLdouble (3d). Функция glVertex2f(1.5,0.9); 2f- два параметра, типа float (GLfloat). Теперь вы видите сами, что ничего сложного в этом нет.

Помимо основной библиотеки, существует и несколько других дополнительных библиотек, которые мы также будем использовать в нашей работе. Первая из таких библиотек- это GLU (GLU- graphics utility library). Все функции этой библиотеки обращаются к функциям из GL и в ее состав входят обычно функции для рисования сложных объектов, типа сфер, конуса, цилиндра, и т.д. Эта библиотека входит во все версии OpenGL.

Вторая дополнительная библиотека ответственная за взаимодействия с системой окон. Называется она GLUT (GL Utility Toolkit). Она содержит функции, которые могут понадобится при работе с окнами.

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

Моделирование поверхностей свободной формы:

Моделирование свободных форм показывает как создавать более "стилизованные" конструктивные элементы, чем просто изогнутые поверхности. Большинство из этих конструктивных элементов будут листовыми телами.

 Этот волнистый конструктивный элемент создан из двух кривых: одна сверху, вторая снизу листа.

 

 

Сетка линий

Сетка отображает конструктивный элемент, помогая визуализировать конструктивный элемент свободной формы.

 

 

Значения Grid Line U Count и V Count - число кривых сетки в U и V направлениях модели, которую Вы создаёте. Для изменения значений просто напечатайте новое значение в поле U Count (Кол-во по U) и V Count (Кол-во по V) и нажмите кнопку OK в диалоговом окне Modeling Preferences (Настройки Моделирования).

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

 

Установка параметров для моделирования свободных форм

Выберите закладку Free Form (Свободные формы) в диалоговом окне Modeling Preferences (Настройки Моделирования).

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

 

 

Free Form Construction Result (Результат построения поверхности)

Опция Free Form Construction Result (Результат построения поверхности) контролирует будете ли Вы создавать плоскость или B-поверхность для данного конструктивного элемента свободной формы: Through Curves (Через кривые), Through Curve Mesh (Через сетку кривых), Swept (Поверхность заметания) и Ruled (Линейчатая поверхность).

При включенной опции Plane (Плоскость) получится плоская поверхность. Использовании опции B-Surface (В-поверхность) предписывает системе создавать B-поверхность.

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

Методы создания поверхностей и методы деформации

  • Методы создания поверхностей

    • Заполнение границ

    • По сечениям