Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

Изменение поверхности ландшафта




 

Чтобы изменить поверхность мы сначала должны получить координаты изменяемой поверхности. Получение координат реализуется процедурой GetCoordinate. Далее происходит изменение массива высот:

i:=Trunc(wx);

j:=Trunc(wz);

height [i, j]:=vis;

В переменной vis содержится значение, определенное пользователем, на которое изменится высота.


Заключение

 

В результате выполнения курсовой работы были выполнены все поставленные цели, изучены основные возможности создания трехмерных объектов, наложения текстур и перемещения в пространстве.

 


Список литературы

 

1. Михаил Краснов, OpenGL в Delphi, электронный вариант.

2. Эйнджел, Эдвард, Интерактивная компьютерная графика. Вводный курс на базе OpenGL, 2 изд.: Пер. с англ. – М.: Издательский дом «Вильяме», 2001. – 592 с: ил. – Парал. тит. Англ.

3. Райт, OpenGL. Суперкнига, 3-е издание [Электронный ресурс] / Райт, Ричард С.-мл., Липчак, Бенджамин // Книги по программированию. [Режим доступа: http://www.pmg.org.ru/nehe/nehe07.htm

 

 


Приложение А

unit Unit1;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, OpenGL, ExtCtrls, Math, StdCtrls, ComCtrls, TEXTURES;

type

TForm1 = class(TForm)

Timer1: TTimer;

Panel1: TPanel;

Button1: TButton;

Button2: TButton;

Button3: TButton;

Button4: TButton;

TrackBar1: TTrackBar;

Label1: TLabel;

Label2: TLabel;

Label3: TLabel;

Button5: TButton;

Button6: TButton;

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

Shift: TShiftState);

procedure FormCreate (Sender: TObject);

procedure FormDestroy (Sender: TObject);

procedure Timer1Timer (Sender: TObject);

procedure FormResize (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 Button3Click (Sender: TObject);

procedure Button4Click (Sender: TObject);

procedure Button1Click (Sender: TObject);

procedure Button2Click (Sender: TObject);

procedure TrackBar1Change (Sender: TObject);

procedure Button5Click (Sender: TObject);

procedure Button6Click (Sender: TObject);

private

{Private declarations}

public

{Public declarations}

end;

type

User=record

Position:record

x, y, z: Single;

end;

Rotation:record

y, zx: Single;

end;

end;

var

vis:single;

Form1: TForm1;

DC:HDC;

HRC:HGLRC;

Human: User;

MyTextureTex: glUint;

wx, wy, wz: GLdouble; // возвращаемые мировые x, у, z координаты

height:array [-11..11, -11..11] of single;

implementation

procedure glBindTexture (target: GLenum; texture: GLuint); stdcall; external opengl32;

{$R *.dfm}

procedure GetCoordinate (const x, y:integer);

var

Viewport: Array [0..3] of GLInt; // область вывода

mvMatrix, // матрица модели

ProjMatrix: Array [0..15] of GLDouble; // матрица проекций

RealY: GLint; // OpenGL у – координата

Zval: GLfloat; // оконная z – координата

Begin

glGetIntegerv (GL_VIEWPORT, @Viewport); // матрица области вывода

// заполняем массивы матриц

glGetDoublev (GL_MODELVIEW_MATRIX, @mvMatrix);

glGetDoublev (GL_PROJECTION_MATRIX, @ProjMatrix); // viewport[3] – высота окна в пикселах, соответствует Height

RealY:= viewport[3] – Y – 1;

FloatToStr (RealY);

glReadPixels (X, RealY, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, @Zval);

gluUnProject (X, RealY, Zval,

@mvMatrix, @ProjMatrix, @Viewport, wx, wy, wz);

end;

procedure initmas;

var i, j:integer;

begin

for i:= -11 to 11 do

for j:=-11 to 11 do

begin

height [i, j]:=-1;

end;

end;

procedure changemas;

var i, j:integer;

begin

i:=Trunc(wx);

j:=Trunc(wz);

height [i, j]:=vis;

end;

procedure Draw;

var i, j:integer;

x, z:integer;

zoom:integer;

begin

glColor3f (1,0,0);

glPointSize (5);

glBegin (GL_POINTS);

glVertex3f (wx, wy, wz);

glEnd;

zoom:=1;

glColor3f (0. 7,1. 0,0.7);

for i:=-10 to 10 do

for j:=-10 to 10 do

begin

x:=i*zoom;

z:=j*zoom;

glPointSize (1);

glBindTexture (GL_TEXTURE_2D, MyTextureTex);

glBegin (GL_QUADS);

glTexCoord2f (0.0, 0.0); glVertex3f (x, height [i, j], z);

glTexCoord2f (1.0, 0.0); glVertex3f (x, height [i, j+1], z+zoom);

glTexCoord2f (1.0, 1.0); glVertex3f (x+Zoom, height [i+1, j+1], z+zoom);

glTexCoord2f (0.0, 1.0); glVertex3f (x+Zoom, height [i+1, j], z);

glEnd;

end;

end;

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

Shift: TShiftState);

const

SPEED=0.2;

begin

case key of

27: Form1. Close;

65: begin

Human. Position.z:=Human. Position.z+

sin (DegToRad(Human. Rotation.y))*SPEED;

Human. Position.x:=Human. Position.x+

cos (DegToRad(Human. Rotation.y))*SPEED;

end;

87: begin

Human. Position.z:=Human. Position.z+

cos (DegToRad(Human. Rotation.y))*SPEED;

Human. Position.x:=Human. Position.x-

sin (DegToRad(Human. Rotation.y))*SPEED;

end;

68: begin

Human. Position.z:=Human. Position.z-

sin (DegToRad(Human. Rotation.y))*SPEED;

Human. Position.x:=Human. Position.x-

cos (DegToRad(Human. Rotation.y))*SPEED;

end;

83: begin

Human. Position.z:=Human. Position.z-

cos (DegToRad(Human. Rotation.y))*SPEED;

Human. Position.x:=Human. Position.x+

sin (DegToRad(Human. Rotation.y))*SPEED;

end;

end;

end;

procedure SetDCPixelFormat;

var

pfd:TPixelFormatDescriptor;

nPixelFormat: Integer;

begin

FillChar (pfd, SizeOf(pfd), 0);

pfd.dwFlags:=PFD_DRAW_TO_WINDOW or

PFD_DOUBLEBUFFER or

PFD_SUPPORT_OPENGL;

nPixelFormat:=ChoosePixelFormat (DC,@pfd);

SetPixelFormat (DC, nPixelFormat,@pfd);

end;

procedure TForm1. Button1Click (Sender: TObject);

begin

Human. Rotation.y:=Human. Rotation.y-4;

if Human. Rotation.y>=360 then Human. Rotation.y:=0;

if Human. Rotation.y<0 then Human. Rotation.y:=360;

end;

procedure TForm1. Button2Click (Sender: TObject);

begin

Human. Rotation.y:=Human. Rotation.y+4;

if Human. Rotation.y>=360 then Human. Rotation.y:=0;

if Human. Rotation.y<0 then Human. Rotation.y:=360;

end;

procedure TForm1. Button3Click (Sender: TObject);

begin

glPolygonMode (GL_FRONT_AND_BACK, GL_LINE);

end;

procedure TForm1. Button4Click (Sender: TObject);

begin

glPolygonMode (GL_FRONT_AND_BACK, GL_FILL);

end;

procedure TForm1. Button5Click (Sender: TObject);

begin

Human. Rotation.zx:=Human. Rotation.zx+0.2;

end;

procedure TForm1. Button6Click (Sender: TObject);

begin

Human. Rotation.zx:=Human. Rotation.zx-0.2;

end;

procedure TForm1. FormCreate (Sender: TObject);

begin

vis:=0;

initmas;

DC:=GetDC(Handle);

SetDCPixelFormat;

HRC:=wglCreateContext(DC);

wglMakeCurrent (DC, HRC);

glViewport (0, 0, ClientWidth-Panel1. Width, ClientHeight);

glClearColor (0,0,0,0);

glEnable (GL_DEPTH_TEST);

glMatrixMode (GL_PROJECTION);

glLoadIdentity;

gluPerspective (30.0, ClientWidth / ClientHeight, 0.1, 1000.0);

glMatrixMode (GL_MODELVIEW);

glLoadIdentity;

glEnable (GL_TEXTURE_2D); // Enable Texture Mapping

LoadTexture ('texture.bmp', MyTextureTex, FALSE);

with Human do

begin

with Position do

begin

x:=6.4;

y:=0;

z:=-0.3878;

end;

with Rotation do

begin

y:=91;

zx:=10;

end;

end;

end;

procedure TForm1. FormDestroy (Sender: TObject);

begin

wglMakeCurrent (0,0);

wglDeleteContext(HRC);

ReleaseDC (Handle, DC);

DeleteDC(DC);

end;

procedure TForm1. Timer1Timer (Sender: TObject);

begin

InvalidateRect (Handle, nil, false);

end;

procedure TForm1. TrackBar1Change (Sender: TObject);

begin

Label2. Caption:=floattostr (TrackBar1. Position);

vis:=TrackBar1. Position;

end;

procedure TForm1. FormResize (Sender: TObject);

begin

glViewport (0, 0, ClientWidth-Panel1. Width, ClientHeight);

glMatrixMode (GL_PROJECTION);

glLoadIdentity;

gluPerspective (30.0, ClientWidth / ClientHeight, 0.1, 1000.0);

glMatrixMode (GL_MODELVIEW);

glLoadIdentity;

end;

procedure TForm1. FormPaint (Sender: TObject);

var

ps:TPaintStruct;

Const

LPos: Array [0..3] of GLFloat = (3.0, 10, -100.0, 1.0);

begin

BeginPaint (Handle, ps);

glClear (GL_COLOR_BUFFER_BIT or

GL_DEPTH_BUFFER_BIT);

glLoadIdentity;

glRotatef (Human. Rotation.zx, Abs (cos(DegToRad (Human. Rotation.y))), 0,0);

glRotatef (Human. Rotation.y, 0,1,0);

glTranslatef (Human. Position.x,

Human. Position.y,

Human. Position.z);

Draw;

EndPaint (Handle, ps);

SwapBuffers(DC);

end;

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

Shift: TShiftState; X, Y: Integer);

begin

changemas;

end;

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

Y: Integer);

begin

GetCoordinate (x, y);

end;

end.

Поделиться:





Воспользуйтесь поиском по сайту:



©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...