Если особо не заморачиваться, то можно сделать так:
Код:
const
pt1 : array[0..3, 0..3, 0..2] of GLFloat = (
(( 2, -2, 0), ( 3, -1, 0), ( 3, 1, 0), ( 2, 2, 0)),
(( 1, -3, 0), ( 2, -3, 5), ( 2, 3, 5), ( 1, 3, 0)),
((-1, -3, 0), (-2, -3, 5), (-2, 3, 5), (-1, 3, 0)),
((-2, -2, 0), (-3, -1, 0), (-3, 1, 0), (-2, 2, 0)));
pt2 : array[0..3, 0..3, 0..2] of GLFloat = (
((-2, -2, 0), (-3, -1, 0), (-3, 1, 0), (-2, 2, 0)),
((-1, -3, 0), (-2, -3, -5), (-2, 3, -5), (-1, 3, 0)),
(( 1, -3, 0), ( 2, -3, -5), ( 2, 3, -5), ( 1, 3, 0)),
(( 2, -2, 0), ( 3, -1, 0), ( 3, 1, 0), ( 2, 2, 0)));
...
function DrawGLScene : Boolean;
var
x, y : Integer;
begin
glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
glPushMatrix;
glScale(0.5, 0.5, 0.5);
glRotatef(90, 1, 0, 0);
glColor3f(0.0, 1.0, 1.0);
if solid then
begin
glMap2f(GL_MAP2_VERTEX_3, 0, 1, 3, 4, 0, 1, 12, 4, @pt1);
glEvalMesh2(GL_FILL, 0, 20, 0, 20);
glMap2f(GL_MAP2_VERTEX_3, 0, 1, 3, 4, 0, 1, 12, 4, @pt2);
glEvalMesh2(GL_FILL, 0, 20, 0, 20);
end
else
begin
glMap2f(GL_MAP2_VERTEX_3, 0, 1, 3, 4, 0, 1, 12, 4, @pt1);
glEvalMesh2(GL_LINE, 0, 20, 0, 20);
glMap2f(GL_MAP2_VERTEX_3, 0, 1, 3, 4, 0, 1, 12, 4, @pt2);
glEvalMesh2(GL_LINE, 0, 20, 0, 20);
end;
if mode then
begin
// The following code displays the control points as dots.
glColor3f(1.0, 1.0, 0.0);
glBegin(GL_POINTS);
for x := 0 to 3 do
for y := 0 to 3 do
glVertex3fv(@pt1[x][y][0]);
for x := 0 to 3 do
for y := 0 to 3 do
glVertex3fv(@pt2[x][y][0]);
glEnd;
end;
glPopMatrix;
Result := True;
end;
function InitGL : Boolean;
var
bol : Boolean;
begin
glClearColor(0.0, 0.0, 0.0, 0.0);
glClearDepth(1.0);
glEnable(GL_DEPTH_TEST);
glEnable(GL_AUTO_NORMAL);
glEnable(GL_NORMALIZE);
glEnable(GL_COLOR_MATERIAL);
glEnable(GL_TEXTURE_2D);
// источник света
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
glEnable(GL_POINT_SMOOTH);
glPointSize(5.0);
// загрузка текстуры
Bol := LoadTexture;
if Bol then
begin
texpts[0][0][0] := 0.0;
texpts[0][0][1] := 0.0;
texpts[1][0][0] := 0.0;
texpts[1][0][1] := 1.0;
texpts[0][1][0] := 1.0;
texpts[0][1][1] := 0.0;
texpts[1][1][0] := 1.0;
texpts[1][1][1] := 1.0;
// поверхность
glMap2f(GL_MAP2_TEXTURE_COORD_2, 0, 1, 2, 2, 0, 1, 4, 2, @texpts);
glEnable(GL_MAP2_TEXTURE_COORD_2);
glEnable(GL_MAP2_VERTEX_3);
glMapGrid2f(20, 0.0, 1.0, 20, 0.0, 1.0);
end;
Result := True;
end;
в принципе так и рекомендуется, отрисовывать по 16 точек за "порцию".
P.S. Чтобы сфера выглядела аккуратной, нужно тщательнее просчитать координаты точек.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
|