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

Формирование поверхностей на уровне мк

Формирование поверхности Кунса: <test.vbs> Import "E:\OXK\Poverh1.dxf",1 ' импортирование всех 4-х линий CurrObjNmb = 0                         ' делаем первую линию u0 - активной Set P00= Polyline.P (0) Set P01= Polyline.P (1) CurrObjNmb = 1                         ' делаем линию u1 - активной Set P10= Polyline.P (0) Set P11= Polyline.P (1)

' Формирования сетки сечений в направлении v

For v=0 To 1 Step 0.1  CurrObjNmb = 2       Set Pb= Polyline.P (v)  xb=Pb.x  yb=Pb.y  zb=Pb.z  For u=0 To 1 Step 0.1  Pov_Kuns u,v,x,y,z '     Ngpoint.s x,y,z  Otrezok.s xb,yb,zb,x,y,z  xb=x  yb=y  zb=z  Next Next  

' Формирования сетки сечений в направлении u

For u=0 To 1 Step 0.1  CurrObjNmb = 0       Set Pb= Polyline.P (u)  xb=Pb.x  yb=Pb.y  zb=Pb.z  For v=0 To 1 Step 0.1  Pov_Kuns u,v,x,y,z '      Ngpoint.s x,y,z  Otrezok.s xb,yb,zb,x,y,z  xb=x  yb=y  zb=z  Next Next     ' Вычисление вектора точки от u,v

Sub Pov_Kuns (u,v,x,y,z) ' Линейчатая u0-u1  CurrObjNmb = 0         ' делаем первую линию u0 - активной  Set pi = Polyline.P (u)  CurrObjNmb = 1          ' делаем первую линию u1 - активной  Set pj = Polyline.P (u)  xu=(1-v)*pi.x+v*pj.x  yu=(1-v)*pi.y+v*pj.y  zu=(1-v)*pi.z+v*pj.z ' Линейчатая v0-v1  CurrObjNmb = 2          ' делаем  v0 - активной  Set pi = Polyline.P (v)  CurrObjNmb = 3  Set pj = Polyline.P (v)  xv=(1-u)*pi.x+u*pj.x  yv=(1-u)*pi.y+u*pj.y  zv=(1-u)*pi.z+u*pj.z ' Косая плоскость   xi=(1-v)*p00.x+v*p10.x  yi=(1-v)*p00.y+v*p10.y  zi=(1-v)*p00.z+v*p10.z  xj=(1-v)*p01.x+v*p11.x  yj=(1-v)*p01.y+v*p11.y  zj=(1-v)*p01.z+v*p11.z  xkp=(1-u)*xi+u*xj  ykp=(1-u)*yi+u*yj  zkp=(1-u)*zi+u*zj ' суммарная  x=xv+xu-xkp  y=yv+yu-ykp  z=zv+zu-zkp End Sub

____________________________________________________________

Поверхности Безье:

Поверхности Безье - это один из способов визуализации гладких поверхностей.

Рис.1. Поверхность Безье.

Если у нас есть совокупность точек (прямоугольная сетка) в пространстве, то можно построить гладкую поверхность, которая будет "повторять" многогранную поверхность (Рис.1.)

Рис.2. Зеленые точки - это контрольные точки, по которым строится поверхность. Желтые линии их соединяют. Сетка белого цвета - это аппроксимирующая сетка поверхности Безье.

Обязательная часть:

  • Нужно создать одну поверхность Безье, заданную как минимум 16-ю контрольными точками, используя функции из библиотеки GL (glMap2[fd], glMapGrid2[fd], glEvalMesh2). За сложность и оригинальность поверхности будут добавляться баллы. За неинтересную поверхность быллы могут вычитаться. Источник света присутствует.

Описание функий glMap2[fd], glMapGrid2[fd], glEvalMesh2:

Все ниже приведенные функции вызываются там же, где и примитивы.

Рис.1. Контрольные точки B(i,j). Напрвления u, v.

Задание контрольных точек:

void glMap2d( GLenum target,

// тип данных. Если равен GL_MAP2_VERTEX_3, значит построение поверхности по массиву точек из трех координат (x, y, z). Можно задать GL_MAP2_VERTEX_4, тогда точка задается 4-мя координатами (x, y, z, h), где h - это вес.

GLdouble u1,

// начальное значение параметра в u направлении

GLdouble u2,

// конечное значение параметра в u направлении

GLint ustride,

// количество данных типа double между соседними точками в u направлении

GLint uorder,

// количество точек в u направлении

GLdouble v1,

// начальное значение параметра в v направлении

GLdouble v2,

// конечное значение параметра в v направлении

GLint vstride,

// количество данных типа double между соседними точками в v направлении

GLint vorder,

// количество точек в v направлении

GLdouble *points )

// массив контрольных точек, задающих поверхность

Определение аппроксимирующей сетки, по которой строится поверхность:

void glMapGrid2d( GLint un,

// количество точек сетки в u направлении будет равно un+1

GLdouble u1,

// начальное значение параметра в u направлении

GLdouble u2,

// конечное значение параметра в u направлении

GLint vn,

// количество точек сетки в v направлении будет равно vn+1

GLdouble v1,

// начальное значение параметра в v направлении

GLdouble v2,

// конечное значение параметра в v направлении

Определение параметров визуализации поверхности Безье.

void glEvalMesh2( GLenum mode,

// GL_LINE - отображается сетка, аппроксимирующая поверхность GL_FILL - отображается поверхность GL_POINT - точки сетки аппроксимирующей поверхности

GLint i1, GLint i2,

// номера точек аппроксимирующей сетки в u направлении, с которых начинается визуализация (i1) поверхности и заканчивается (i2). Причем i1 < i2. i1, i2 принимают значения от 0 до un (из функции glMapGrid2f).

GLint j1, GLint j2,

// номера точек аппроксимирующей сетки в v направлении, с которой начинается визуализация (j1) поверхности и заканчивается (j2). Причем j1 < j2. j1, j2 принимают значения от 0 до vn (из функции glMapGrid2f).

  • Реализовать возможность передвижения (вращения) поверхности для того, чтобы можно было изучить ее со всех сторон.

Дополнительная часть:

  • Приветствуется реализация перемещения опорных точек с помощью средств GL. Возможность перемещать вдоль оси x, y, z.

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

    • Дополнительно можно реализовать NURBS (Non-uniform Rational B-spline - неравномерный рациональный В-сплайн) используя возможности библиотек GLU.

Поверхность Безье

Правильным было бы сперва рассмотреть поверхности Эрмита, и лишь затем перейти к поверхностям Безье. Причина, по которой мы пропускаем первые, довольно проста: мы стараемся изучить кривые и изогнутые поверхности наиболее интуитивным путем. В то время как более логично двигаться от кривых Эрмита к кривым Безье, в случае с поверхностями это неверно. Поверхности Эрмита сложнее для понимания, чем поверхности Безье.

Кривая Безье описывалась функцией от одной переменной, f(u), логично будет предположить, что поверхность будет функцией двух переменных f(u,v). Следуя той же логике, раз у кривой Безье контрольные точки располагаются в одной плоскости, то у поверхности будет двумерный массив контрольных точек. Теперь введем понятие бикубических поверхностей Безье. Слово "бикубический" означает, что поверхность - функция третьего порядка от двух переменных, она кубическая относительно u и относительно v. Далее, так как у кривой Безье третьего порядка был массив из четырех контрольных точек, то у нашей бикубической поверхности будет массив из 4х4 точек. Рисунок 4 иллюстрирует пример такой поверхности.