GLfloat ctrlPts [4][4][3] = {

{ {-1.5, -1.5, 4.0}, {-0.5, -1.5, 2.0},

{-0.5, -1.5, -1.0}, { 1.5, -1.5, 2.0} },

{ {-1.5, -0.5, 1.0}, {-0.5, -0.5, 3.0},

{ 0.5, -0.5, 0.0}, { 1.5, -0.5, -1.0} },

{ {-1.5, 0.5, 4.0}, {-0.5, 0.5, 0.0},

{ 0.5, 0.5, 3.0}, { 1.5, 0.5, 4.0} },

{ {-1.5, 1.5, -2.0}, {-0.5, 1.5, -2.0},

{ 0.5, 1.5, 0.0}, { 1.5, 1.5, -1.0} } };

glMap2f (GL_MAP2_VERTEX_3, 0.0, 1.0, 3, 4,

0.0, 1.0, 12, 4, &ctrlPts[0][0][0]); glEnable (GL_MAP2_VERTEX_3);

GLint k, j;

glColor3f (0.0, 0.0, 1.0); for (к = 0; к <= 8; k++)

{ glBegin (GL_LINE_STRIP) ;

/* Генерируются поверхностные линии Безье. */ for (j = 0; j <= 40; j++)

glEvalCoord2f (GLfloat (j) / 40.0, GLfloat (k) / 8.0); glEnd ( );

glBegin (GL_LINE_STRIP) ; for (j = 0; j <= 40; j++)

glEvalCoord2f (GLfloat (k) / 8.0, GLfloat (j) / 40.0); glEnd ( );

}

Равномерно размещенные значения параметров можно получить, не используя функцию glEvalCoord2, а применив команды

glMapGrid2* (nu, ul, u2, nv, vl, v2); glEvalMesh2 (mode, nul, nu2, nvl, nv2); Суффикс-код glMapGrid2 снова равен f или d, a параметру mode может присваиваться значение GL_POINT, GL_LINE или GL_FILL. При вызове команды генерируется двухмерная сетка точек с nu равномерно расположенными интервалами между ul и и2 и nv равномерно расположенными интервалами между vl и v2. Со ответствующий целочисленный диапазон параметра и - от nul до пи2, параметра V - от nvl до nv2.

Для поверхности, которая отображается на экран как сетка ломаных линий, выход glMapGrid2 и glEvalMesh2 аналогичен тому, что дает следующий фрагмент программы, кроме условий, которые предотвращают ошибки округления в начальных и конечных значениях переменных цикла. В начале цикла аргумент функции glEvalCoordl полагается равным (ul, vl). В конце цикла аргумент функции glEvalCoordl устанавливается равным (u2, v2).

for (k = nul; k <= nu2; k++) { glBegin (GL_LINES);

for (j = nvl; j <= nv2; j++)

glEvalCoord2f (ul + k * (u2 - ul) / nu,

vl + j * (v2 - vl) / nv) ;

glEnd ( );

)

for (j = nvl; j <= nv2; j++) { glBegin (GL_LINES);

for (k = nul; k <= nu2; k++)

glEvalCoord2f (ul + k * (u2 - ul) / nu,


⇐ вернуться назад | | далее ⇒