Главная » Free Pascal » Анимация в пространстве Free Pascal

0

Следующий пример по логике анимации ничем не отличается от вращающего- ся квадрата. Однако в нем использованы более сложные объекты — сплошной куб, каркас куба (проволочная модель), сплошная сфера, расположенная внутри куба и слегка выпирающая за его границы, и проволочный каркас сферы (листинг 16.8).

Для воспроизведения сплошного куба и его проволочного каркаса используют- ся процедуры пакета GLUT:

glutSolidCube(h);  // построение сплошного куба glutWireCube(h);   // построение проволочной модели куба

Единственный параметр этой процедуры задает размер ребра. Проволочный каркас накладывается на сплошную модель куба с единственной целью — выде- лить ребра куба, которые на монохромной модели почти не различимы.

Для воспроизведения сплошной сферы и ее проволочного каркаса также ис- пользуются процедуры пакета GLUT:

glutSolidSphere(r, nzp, nzm); glutWireSphere(r, nzp, nzm);

Здесь:

± r — радиус сферы;

± nzp — число параллелей вокруг оси z;

± nzm — число меридианов вдоль оси z.

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

Использование Z-буфера придает нашей конструкции большую объемность.

   Листинг 16.8. Тр е х ме рная  а нима ция                                                                                              

program Sphere_in_Cube; uses

GL,GLUT;

//——————————

procedure OnRedraw; cdecl; begin

glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);

glRotatef(2.0,0,0,1);

glColor3f(0,0.6,1); glutSolidCube(1.98); glColor3f(0,0,0); glutWireCube(2); glColor3f(0,1,1); glutSolidSphere(1.35,20,20); glColor3f(0,0,0); glutWireSphere(1.36,20,20); glutSwapBuffers;

//——————————–

procedure OnResize(w,h:integer); cdecl; begin

glViewport(0, 0, W, H);

glLoadIdentity; glFrustum(-1,1,-1,1,3,10); glTranslatef(0,0,-8); glRotatef(30,0,0,1); glRotatef(60,1,0,0);

if W>H then glScalef(H/W,1,1) else glScalef(1,W/H,1); end;

//———————————

procedure OnIdle; cdecl; begin

glutPostRedisplay; end;

//———————————

procedure OnMouse(button,state,x,y:integer); cdecl; begin

if state <> GLUT_DOWN then exit;

if button=GLUT_LEFT_BUTTON then glutIdleFunc(@OnIdle); if button=GLUT_RIGHT_BUTTON then glutIdleFunc(nil);

end;

//———————————-

begin

glutInit(@argc,argv); glutInitDisplayMode(GLUT_DOUBLE or GLUT_DEPTH); glutCreateWindow(‘Sphere in Cube’); glClearColor(0.75,0.75,0.75,0); glutDisplayFunc(@OnRedraw); glutReshapeFunc(@OnResize); glutMouseFunc(@OnMouse); glEnable(GL_DEPTH_TEST);

glutMainLoop; end.

Один из кадров, зафиксированных в момент вращения нашей конструкции, за- печатлен на рис. 16.8.

Рис. 16.8. Вращающиеся трехмерные объекты

Источник: Кетков, Ю. Л., Свободное программное обеспечение. FREE PASCAL для студентов и школьников, Ю. Л. Кетков, А. Ю. Кетков. — СПб.: БХВ-Петербург, 2011. — 384 с.: ил. + CD-ROM — (ИиИКТ)

По теме:

  • Комментарии