

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.5 , 0.9 ); 
 glTranslatef ( 0.5 , 0.3 , 0.4 ); 
 glRotatef ( 10.0 , 0.0 , 0.0 , 1.0 ); 
 glPopMatrix; 
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;
{--- отпускаем кнопку мыши ---}


x¤HАЎ 
