Графическая работа машины OpenGL. Отображение неких трёхмерных объектов, находящихся и взаимодействующих друг с другом в одной плоскости., страница 2

begin //Процедура перерисовки изображения на форме при изменении размеров окна

glviewPort(0, 0, ClientWidth-1, ClientHeight-1);

FormPaint(Sender);

end;

procedure TForm1.FormDestroy(Sender: TObject);

begin //Процедура очистки памяти при закрытии программы

wgldeletecontext(OpGLcontext);

freemodel(model);

preps.destroy;

end;

procedure TForm1.OnIdle(Sender: TObject; var Done: Boolean);

begin //Процедура отрисовки формы и изменения параметра done

FormPaint(Sender);

Done:=false;

end;

procedure TForm1.FormPaint(Sender: TObject);

var //Процедура отрисовки формы

poss:array [0..3] of single;

ObjSphere: PGLUquadric;

begin

glEnable(GL_DEPTH_TEST);

glEnable(GL_LIGHTING);

glEnable(GL_LIGHT0);

glEnable(GL_COLOR_MATERIAL);

glEnable(GL_TEXTURE_2D);

glLightModelf(Gl_Light_model_two_side,1);

glClearColor(0,0,0,1);

glClear({Gl_color_buffer_bit or} GL_depth_buffer_bit);

glShadeModel(GL_SMOOTH);

glMatrixMode(GL_PROjection);

glLoadIdentity();

poss[0]:=1;

poss[1]:=-2;

poss[2]:=1;

poss[3]:=1;

gluPerspective(45,Width/Height,0.001,10);

glMatrixMode(GL_MODELVIEW);

glLoadIdentity();

glLightFv(GL_LIGHT0,GL_POSITION,@poss);

glTranslatef(0,0,-2);

glScalef(scal,scal,scal);

glRotatef(ry,-1,0,0);

glRotatef(rx,0,-1,0);

glColor3f(1, 1, 1);

glBindTexture(GL_TEXTURE_2D,idtext1);

glpushmatrix();

glTranslatef(3,0,planx);

glInterleavedArrays($2A2B,0,model^.Element^);

glDrawElements(GL_TRIANGLES,model^.IndexCount,GL_UNSIGNED_INT,model^.Index^);

glpopmatrix();

glBindTexture(GL_TEXTURE_2D,idtext2);

glpushmatrix();

glTranslatef(xs,0,ys);

glRotatef(mx,1,0,0);

glRotatef(my,0,1,0);

ObjSphere:= gluNewQuadric;

gluQuadricDrawStyle(ObjSphere, GLU_FILL);

gluQuadricTexture(ObjSphere,true);

gluSphere(ObjSphere, 0.20, 5, 5);

glpopmatrix();

preps.draw;

glBindTexture(GL_TEXTURE_2D,0);

glInterleavedArrays($2A2B,0,bort^.Element^);

glDrawElements(GL_TRIANGLES,bort^.IndexCount,GL_UNSIGNED_INT,bort^.Index^);

ObjSphere:= gluNewQuadric;

gluQuadricDrawStyle(ObjSphere, GLU_FILL);

gluSphere(ObjSphere, 15, 5, 5);

glFlush;

end;

procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,

Y: Integer);

Begin //процедура вращения модели при движении мыши и зажатой клавиши

if ssLeft in Shift then begin

inc(rx,ax-x);

inc(ry,ay-y);

ax:=x;

ay:=y;

FormPaint(Sender);

end;

end;

procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;

Shift: TShiftState; X, Y: Integer);

Begin //процедура запоминания начального положения мыши в момент нажатия клавиши

ax:=x;

ay:=y;

end;

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;

Shift: TShiftState); //Процедура сдвига кусочка недостающей стены прямоугольника

begin

if (Key=VK_LEFT) then addplanx:=speed_b;

if (Key=VK_RIGHT) then addplanx:=-speed_b;

// scal

end;

procedure TForm1.FormKeyUp(Sender: TObject; var Key: Word;

Shift: TShiftState);

begin

if (Key=VK_LEFT) or (Key=VK_RIGHT) then addplanx:=0;

end;

procedure TForm1.Timer1Timer(Sender: TObject);

var //Процедура таймера, обеспечивает движение шара, изменения его угла при ударении об объекты

pr,a:single; //в этой процедуре мы обеспечили вращение шара во круг своей оси при ударении об объекты

begin

pr:=speed_s*sin(rmov/180*pi);

//pr:=incx;

if ((xs+pr)<3.2) and ((xs+pr)>2.8) and (ys>planx-0.5) and (ys<planx+0.5) then begin

a:=ys-planx;

while rmov<0 do begin rmov:=rmov+360; incy:=incy-10; end;

while rmov>360 do begin rmov:=rmov-360; incy:=incy+10; end;

if rmov>270 then begin rmov:=(360-rmov)*(1-a); incx:=incx-20; end;

if rmov<270 then begin rmov:=180-(rmov-180)*(1+a); incx:=incx+2; end;

end;

if (xs+pr)<-3 then begin rmov:=180-(rmov-180); incy:=incy+10; flag:=true; end;

pr:=speed_s*cos(rmov/180*pi);

//pr:=incy;

//incy:=incy+1;

if (ys+pr)>3 then begin rmov:=90-(rmov-90); flag:=true; incx:=incx+10;  end;

if (ys+pr)<-3 then begin rmov:=90-(rmov-90); flag:=true;  incy:=incy-10; end;

xs:=xs+speed_s*sin(rmov/180*pi);

//xs:=incx;

ys:=ys+speed_s*cos(rmov/180*pi);

//ys:=incy;

if (xs>4) then begin

xs:=0;

ys:=0;

rmov:=250;

end;

preps.testspeaker(xs,ys,rmov);

planx:=planx+addplanx;

if (planx>2.5) then planx:=2.5;

if (planx<-2.5) then planx:=-2.5;

//if flag  then

//begin

mx:=mx+incx; my:=my+incy;

//end;

//flag:=false;

end;

{ Tprep }

constructor Tprep.create(x, y, w, h: single);

begin //Конструктор нововведенного объекта. Производит начальную инициализацию

inherited create;

fx:=x; fy:=y;

generatormodelmode(MM_NORMAL);

model:=createmodel(MF_TNV);

settexture (0,0,2,1,0);

modelbox(model,w,h,0.2,1,1,1,3);

normals(model);

fw:=w/2;fh:=h/2;

end;

destructor Tprep.destroy;

begin //деструктор нововведенного объекта. Производит очищение памяти при удалении объекта

freemodel(model);

inherited destroy;

end;

procedure Tprep.draw;

begin //Процедура отрисовки нововведенного объекта. Производит сохранение матрицы изображения

glpushmatrix;

gltranslatef(fx,0,fy);

glInterleavedarrays($2A2B,0,model^.element^);

gldrawelements(gl_triangles,model^.IndexCount, gl_unsigned_int,model^.index^);

glpopmatrix;

end;

function Tprep.testspeaker(x, y: single; var angle: single): boolean;

var //Процедура изменения угла полёта шара при его ударении о нововведенный объект

prx,pry:single;

begin

result:=false;

prx:=speed_s*sin(angle/180*pi);

pry:=speed_s*cos(angle/180*pi);

if (x+prx>fx-fw-rspk) and (x+prx<fx+fw+rspk) and (y>fy-fh) and (y<fy+fh) then

begin

angle:=360-angle;

result:=true;

end;

if (x>fx-fw) and (x<fx+fw) and (y+pry>fy-fh-rspk) and (y+pry<fy+fh+rspk) then

begin

angle:=180-angle;

result:=true;

end;

end;

end.

Результат работы