unit Unit1;
interface
uses
Windows, Messages, Forms, Classes, Controls, ExtCtrls, ComCtrls,
StdCtrls, Dialogs, SysUtils,
OpenGL
;
{подключение самой OpenGL - делается программистом вручную}
type
TForm1 = class(TForm)
ScrollBar1: TScrollBar;
ScrollBar2: TScrollBar;
procedure FormCreate(Sender: TObject);{выполняется при создании формы}
procedure FormPaint(Sender: TObject);{выполняется при перерисовке формы}
procedure FormDestroy(Sender: TObject);{выполняется при завершений работы приложения - уничтожение формы}
procedure ScrollBar1Change(Sender: TObject);{реакция скроллера1 на перемещение}
procedure ScrollBar2Change(Sender: TObject);{реакция скроллера2 на перемещение}
private
hrc :
HGLRC ;{ ссылка на контекст воспроизведения}
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
{+++ рисование на форме +++}
procedure TForm1.FormPaint(Sender: TObject);
begin
wglMakeCurrent
(
Canvas.Handle
, hrc
);
glEnable
(
GL_DEPTH_TEST
);
{ используем буфер глубины }
glPushMatrix;
{ запоминаем текущую систему координат }
glFrustum
(
-1.0
,
1.0
,
-1.0
,
1.0
,
3.0
,
10.0
);
{ задаем перспективу }
glTranslatef
(
0.0
,
0.0
,
-6.0
);
{ перенос объекта по оси Z }
glClearColor
(
0.5
,
0.5
,
0.7
,
1.0
);
glClear
(
GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT
);
{ очистка буфера цвета и глубины }
glViewport
(0,0,ClientWidth,ClientHeight);{ задается область вывода }
glRotatef(ScrollBar2.Position, 1.0, 0.0, 0.0);
{ скроллер (поворот по оси X) }
glRotatef(ScrollBar1.Position, 0.0, 1.0, 0.0);
{ скроллер (поворот по оси Y) }
glRotatef
(
20.0
,
1.0
,
0.0
,
1.0
);
glRotatef
(
20.0
,
0.0
,
1.0
,
0.0
);
glPointSize
(
6
);
glPolygonMode
(
GL_FRONT,GL_FILL
);
glColor3f
(
1.0
,
0.5
,
0.0
);
glBegin
(
GL_QUADS
);
glVertex3f
(
1.0
,
1.0
,
1.0
);
glVertex3f
(
-1.0
,
1.0
,
1.0
);
glVertex3f
(
-1.0
,
-1.0
,
1.0
);
glVertex3f
(
1.0
,
-1.0
,
1.0
);
glEnd;
glColor3f
(
1.0
,
0.5
,
0.5
);
glBegin
(
GL_QUADS
);
glVertex3f
(
1.0
,
1.0
,
-1.0
);
glVertex3f
(
1.0
,
-1.0
,
-1.0
);
glVertex3f
(
-1.0
,
-1.0
,
-1.0
);
glVertex3f
(
-1.0
,
1.0
,
-1.0
);
glEnd;
glColor3f
(
1.0
,
1.0
,
0.0
);
glBegin
(
GL_QUADS
);
glVertex3f
(
-1.0
,
1.0
,
1.0
);
glVertex3f
(
-1.0
,
1.0
,
-1.0
);
glVertex3f
(
-1.0
,
-1.0
,
-1.0
);
glVertex3f
(
-1.0
,
-1.0
,
1.0
);
glEnd;
glColor3f
(
0.0
,
1.0
,
0.0
);
glBegin
(
GL_QUADS
);
glVertex3f
(
1.0
,
1.0
,
1.0
);
glVertex3f
(
1.0
,
-1.0
,
1.0
);
glVertex3f
(
1.0
,
-1.0
,
-1.0
);
glVertex3f
(
1.0
,
1.0
,
-1.0
);
glEnd;
glColor3f
(
0.5
,
1.0
,
0.5
);
glBegin
(
GL_QUADS
);
glVertex3f
(
-1.0
,
1.0
,
-1.0
);
glVertex3f
(
-1.0
,
1.0
,
1.0
);
glVertex3f
(
1.0
,
1.0
,
1.0
);
glVertex3f
(
1.0
,
1.0
,
-1.0
);
glEnd;
glColor3f
(
0.0
,
1.0
,
1.0
);
glBegin
(
GL_QUADS
);
glVertex3f
(
-1.0
,
-1.0
,
-1.0
);
glVertex3f
(
1.0
,
-1.0
,
-1.0
);
glVertex3f
(
1.0
,
-1.0
,
1.0
);
glVertex3f
(
-1.0
,
-1.0
,
1.0
);
glEnd;
glPopMatrix;
{ восстанавливаем текущую систему координат }
wglMakeCurrent
(0, 0)
;
end;
{--- рисование на форме ---}
{+++ Формат пикселя +++}
procedure SetDCPixelFormat ( hdc : HDC );
var
pfd : TPixelFormatDescriptor;
nPixelFormat : Integer;
begin
FillChar (pfd, SizeOf (pfd), 0);
nPixelFormat := ChoosePixelFormat (hdc, @pfd);
SetPixelFormat (hdc, nPixelFormat, @pfd);
end;
{--- Формат пикселя ---}
{+++ создание формы +++}
procedure TForm1.FormCreate(Sender: TObject);
begin
ScrollBar1.Min := -180;
ScrollBar2.Min := -180;
ScrollBar1.Max := 180;
ScrollBar2.Max := 180;
ScrollBar1.Kind := sbVertical;
ScrollBar1.Align := alLeft;
ScrollBar2.Align := alBottom;
Form1.Width := 400;
Form1.Height := 400;
SetDCPixelFormat( Canvas.Handle );
hrc := wglCreateContext ( Canvas.Handle );
end;
{--- создание формы ---}
{+++ завершение работы приложения +++}
procedure TForm1.FormDestroy(Sender: TObject);
begin
wglDeleteContext(hrc);
end;
{--- завершение работы приложения ---}
procedure TForm1.ScrollBar2Change(Sender: TObject);
begin
FormPaint(Sender);
end;
procedure TForm1.ScrollBar1Change(Sender: TObject);
begin
FormPaint(Sender);
end;
end.