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

Страницы работы

Содержание работы

Московский Государственный университет приборостроения и информатики

Сергиево-Посадский Филиал

Отчёт по лабораторной работе №4

по дисциплине «Компьютерная графика»

Выполнил студент

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);

 var //Процедура инициализации машины OpenGL и начального состояния системы при создании формы

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);

Похожие материалы

Информация о работе