Московский Государственный университет приборостроения и информатики
Сергиево-Посадский Филиал
по дисциплине «Компьютерная графика»
Выполнил студент |
|
III курса 230101 (2) |
|
|
|
Проверил |
|
Преподаватель |
|
|
2009г
Данная программа иллюстрирует графическую работу машины OpenGL. Работа программы заключается в отображении неких трёхмерных объектов, находящихся и взаимодействующих друг с другом в одной плоскости.
Изначально подразумевалось взаимодействие некоторого прямоугольника без одного ребра, шарика и некоторого куска недостающего ребра трехмерного прямоугольника, который можно водить из стороны в сторону, нажимая на клавиши клавиатуры. Иными словами программа представляет собой стержень, базис, фундамент, т.е. содержит элементы присущие каждой игре, классического жанра arcanoid. Общую картину отображения можно менять вращением мыши, зажав предварительно на ней левую клавишу.
В ходе проведения лабораторной работы, программа была модернизирована: с целью практики работы в OpenGL, было придано вращение шара во круг своей оси, при ударение об объекты. И введён новый объект, внутри трехмерного прямоугольника, с заданными для него параметрами и описанной физикой взаимодействия стенок объекта с шаром.
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs,OpenGL12, ExtCtrls, ComCtrls, dllgen;
Type
PSampleHead=^TSampleHead;
TSampleHead=record
Buff:pointer;
Channels:Byte;
Length:Longint;
end;
Type
PRaster=^TRaster;
TRaster=record
Buff:pointer;
Width,Height:longint;
bpp:longint;
end;
Type
PIndexs=^TIndexs;
TIndexs=packed array [byte] of longint;
PModel=^TModel;
TModel=record
IndexCount:Longint;
ElementCount:longint;
Format:longint;
Index:PIndexs;
Element:Pointer;
end;
Type
Tprep=class //Описание класса нововведенного объекта
model:Pmodel;
fx,fy,fw,fm,fh:single;
constructor create(x,y,w,h:single);
Destructor destroy;
Function testspeaker(x,y:single; var angle:single):boolean;
procedure draw;
end;
const
speed_s=0.03;
speed_b=0.03;
rspk=0.2;
type
TForm1 = class(TForm)
Timer1: TTimer;
procedure FormCreate(Sender: TObject);
procedure FormResize(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure FormPaint(Sender: TObject);
procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
procedure FormMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure OnIdle(Sender: TObject; var Done: Boolean);
procedure FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
procedure Timer1Timer(Sender: TObject);
procedure FormKeyUp(Sender: TObject; var Key: Word;
Shift: TShiftState);
private
{ Private declarations }
public
{ Public declarations }
OpGLcontext: hglrc;
scal:single;
model:PModel;
bort:PModel;
modeltexture:PRaster;
idtext1,idtext2:longint;
ax,ay,rx,ry:longint;
addplanx:single;
planx,rmov,xs,ys:single;
mx,my,incx,incy:single;
flag:boolean;
preps:Tprep;
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
//èíèöèàëèçèðóåì òåêñòóðó
function Texture(pData:PRaster):longint;
var
tbt,tbb:longint;
begin
glGenTextures(1,@result);
glBindTexture(GL_TEXTURE_2D,result);
tbb:=GL_RGB;
tbt:=GL_BGR;
if GL_ARB_texture_compression then tbb:=GL_COMPRESSED_RGB_ARB;
if pdata^.bpp=4 then begin
tbb:=GL_RGBA;
if GL_ARB_texture_compression then tbb:=GL_COMPRESSED_RGBA_ARB;
tbt:=GL_BGRA;
end;
gluBuild2DMipmaps(GL_TEXTURE_2D,tbb,pData^.Width,pData^.Height,tbt,GL_UNSIGNED_BYTE,pData^.buff);
glTexEnvi(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_MODULATE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
end;
//Ðèñóåì äâóõìåðíûé ðàñòð äëÿ äîñêè
function gentext1:PRaster;
begin
{$include cluds0001.txt}
end;
//Ðèñóåì äâóõìåðíûé ðàñòð äëÿ øàðà
function gentext2:PRaster;
begin
{$include cluds0002.txt}
end;
//ãåíåðèðóåì ñòåíêè
function initbort:PModel;
begin
{$include bort.txt}
end;
procedure TForm1.FormCreate(Sender: TObject);
tPixFormat: TPixelFormatDescriptor;
iPixelFormat: integer;
begin
mx:=0; my:=0; incx:=0; incy:=0; flag:=false;
fillchar(tPixFormat, sizeof(tPixFormat),0);
iPixelFormat := ChoosePixelFormat(canvas.Handle, @tPixFormat);
SetPixelFormat(canvas.Handle, iPixelFormat, @tPixFormat);
OpGLcontext:=wglcreatecontext(canvas.Handle);
if not wglmakecurrent(canvas.Handle, OpGLcontext) then halt;
//ñîçäàåì íàáîð âåðøèí ìîäåëè
GeneratorModelMode ( MM_NORMAL );
model := CreateModel ( MF_TNV );
SetTexture( 0, 0, 2, 1, 0 );
ModelBox( model, 0.2, 1, 0.2, 1, 1, 1, 3);
Normals( model );
bort:=initbort;
//ReadExtensions;
// if wgl_ext_swap_control then
// wglswapintervalext(0);
//ñîçäàåì òåêñòóðó
modeltexture:=gentext1;
idtext1:=Texture(modeltexture);
freeraster(modeltexture);
modeltexture:=gentext2;
idtext2:=Texture(modeltexture);
freeraster(modeltexture);
application.OnIdle:=OnIdle;
scal:=0.2;
rx:=90;ry:=-20;
planx:=0;
rmov:=250;
preps:=Tprep.create(2,-2,2,2);
end;
procedure TForm1.FormResize(Sender: TObject);
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.