unit Unit1;
interface
uses
Windows, Messages, SysUtils,
Classes, Graphics, Controls, Forms, Dialogs, Menus, ExtCtrls, ComCtrls,
StdCtrls,
OpenGL
; {подключение самой OpenGL - делается программистом
вручную}
type
TForm1 = class(TForm)
Panel1 :
Tpanel;
ScrollBar1: TScrollBar;
ScrollBar2: TScrollBar;
procedure FormCreate(Sender:
TObject);{выполняется при создании
формы}
procedure FormPaint(Sender: TObject);{выполняется при перерисовке формы}
procedure FormDestroy(Sender:
TObject);{выполняется при уничтожение
формы}
procedure FormResize(Sender: TObject);{выполняется при изменении формы}
procedure
ScrollBar1Change(Sender: TObject);
procedure ScrollBar2Change(Sender:
TObject);
procedure Panel1MouseMove(Sender: TObject; Shift: TShiftState; X,Y:
Integer);{перемещение мыши по поверхности
Panel1}
procedure Panel1MouseUp(Sender: TObject; Button:
TMouseButton;Shift: TShiftState; X, Y: Integer);{отпускаем
кнопку мыши}
procedure Panel1MouseDown(Sender: TObject; Button:
TMouseButton;Shift: TShiftState; X, Y: Integer);{нажимаем
кнопку мыши}
private
DC : HDC;
hrc : HGLRC ;{ ссылка на контекст
воспроизведения}
end;
const
step = 10;{
при перемещении мыши на 10 пикселей - поворот на 1 градус
}
var
Form1: TForm1;
x1,y1 : integer;{
запоминаем координаты курсора при нажатии кнопки мыши }
xx,yy :
integer;{ запоминаем значениея скроллеров
}
Button_Press : boolean;{ флаг - кнопка нажата
}
implementation
{$R *.DFM}
{+++ рисование на панели +++}
procedure TForm1.FormPaint(Sender: TObject);
var
ps :
TPaintStruct;
begin
BeginPaint ( Panel1.Handle,ps );
glClear (
GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT ); { очистка буфера
цвета }
glRotatef(ScrollBar1.Position, 0.0, 1.0, 0.0); { скроллер (поворот по оси X) }
glRotatef(ScrollBar2.Position, 1.0, 0.0, 0.0); { скроллер (поворот по оси Y) }
glRotatef (
20.0 , 1.0 , 0.0 , 0.0 ); { поворот объекта - ось X }
glRotatef
( 35.0 , 0.0 , 1.0 , 0.0 ); { поворот объекта - ось Y
}
glScalef (
0.8 , 0.8 , 0.8 );
glColor3f ( 1.0 , 0.0 , 1.0 );
glBegin ( GL_QUADS );
glNormal3f
( 0.0 , 0.0 , 1.0 );
glVertex3f ( -0.6 , 1.0 , 1.0 );
glVertex3f (
-1.0 , 1.0 , 1.0 );
glVertex3f ( -1.0 , -1.0 , 1.0 );
glVertex3f (
-0.6 , -1.0 , 1.0 );
glEnd;
glBegin ( GL_QUADS );
glNormal3f
( -1.0 , 0.0 , 0.0 );
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;
glBegin ( GL_QUADS );
glNormal3f
( 0.0 , 1.0 , 0.0 );
glVertex3f ( -1.0 , 1.0 , -1.0 );
glVertex3f (
-1.0 , 1.0 , 1.0 );
glVertex3f ( -0.6 , 1.0 , 1.0 );
glVertex3f (
-0.5 , 1.0 , -1.0 );
glEnd;
glColor3f ( 0.0
, 1.0 , 0.0 );
glNormal3f ( 0.0 , 0.0 , 1.0 );
glBegin ( GL_TRIANGLES );
glVertex3f
( -1.7 , 0.5 , 0.0 );
glVertex3f ( 0.8 , 0.0 , 0.0 );
glVertex3f (
-1.7 , -0.5 , 0.0 );
glEnd;
glNormal3f (
0.0 , 1.0 , 0.0 );
glBegin ( GL_TRIANGLES );
glVertex3f
( -1.7 , 0.0 , 0.6 );
glVertex3f ( 0.8 , 0.0 , 0.0 );
glVertex3f (
-1.7 , 0.0 , -0.5 );
glEnd;
glLineWidth
( 4.0 );
glBegin ( GL_LINES );
glVertex3f
( -1.7 , 0.0 , 0.0 );
glVertex3f ( -2.5 , 0.0 , 0.0 );
glEnd;
SwapBuffers(DC);
EndPaint (
Panel1.Handle,ps );
end;
{--- рисование на панели
---}
{+++ Формат пикселя
+++}
procedure SetDCPixelFormat ( hdc : HDC
);
var
pfd :
TPixelFormatDescriptor;
nPixelFormat : Integer;
begin
FillChar (pfd, SizeOf
(pfd), 0);
pfd.dwFlags := PFD_DRAW_TO_WINDOW or PFD_SUPPORT_OPENGL or PFD_DOUBLEBUFFER;
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;
Panel1.Align :=
alClient;
DC := GetDC (Panel1.Handle);
SetDCPixelFormat(DC);
hrc :=
wglCreateContext(DC);
wglMakeCurrent(DC,hrc);
glClearColor
( 0.5 , 0.5 , 0.7 , 1.0 );
glEnable ( GL_LIGHTING
);
glEnable ( GL_LIGHT0 );
glEnable ( GL_DEPTH_TEST
);
glEnable ( GL_COLOR_MATERIAL
);
end;
{--- создание формы
---}
{+++ завершение работы приложения
+++}
procedure TForm1.FormDestroy(Sender: TObject);
begin
wglMakeCurrent
( 0 , 0 );
wglDeleteContext(hrc);
ReleaseDC (
Handle,DC );
DeleteDC(DC);
end;
{--- завершение работы приложения
---}
procedure TForm1.FormResize(Sender: TObject);
begin
glMatrixMode
( GL_PROJECTION );
glLoadIdentity;
glFrustum ( -1.0 , 1.0 , -1.0 , 1.0 , 3.0 , 12.0 );
glMatrixMode
( GL_MODELVIEW );
glLoadIdentity;
glTranslatef ( 0.0 , -0.5 , -9.5 ); {
перенос объекта - ось Z }
InvalidateRect
( Handle,nil,False );
end;
{+++ перемещение скроллера1 +++}
procedure
TForm1.ScrollBar1Change(Sender: TObject);
begin
FormResize(Sender);{выполняется при
изменении формы}
end;
{--- перемещение
скроллера1 ---}
{+++ перемещение
скроллера2 +++}
procedure TForm1.ScrollBar2Change(Sender:
TObject);
begin
FormResize(Sender);{выполняется при
изменении формы}
end;
{--- перемещение
скроллера2 ---}
{+++ перемещение мыши
по поверхности Panel1 +++}
procedure
TForm1.Panel1MouseMove(Sender: TObject; Shift: TShiftState; X,Y:
Integer);
begin
if Button_Press then begin
ScrollBar2.Position :=
yy+((Y-y1) div step);
ScrollBar1.Position := xx+((X-x1) div
step);
end;
end;
{--- нажали левую кнопку мыши по
поверхности Panel1 ---}
procedure TForm1.Panel1MouseDown(Sender:
TObject; Button: TMouseButton; Shift: TShiftState; X, Y:
Integer);
begin
xx := ScrollBar1.Position;{ запомнили
значения скроллеров }
yy := ScrollBar2.Position;
Button_Press :=
true;{ нажали левую кнопку мыши }
x1 := X;{ запоминаем координаты курсора }
y1 := Y;
end;
{--- нажали левую кнопку мыши по поверхности Panel1
---}
{+++ отпускаем кнопку мыши
+++}
procedure TForm1.Panel1MouseUp(Sender: TObject; Button:
TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
Button_Press :=
false;{ кнопка мыши отпущена }
xx :=
ScrollBar1.Position;{ запоминаем позиции скроллеров
}
yy := ScrollBar2.Position;
end;
{---
отпускаем кнопку мыши ---}
end.