Код: Выделить всё
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
OpenGL, Menus, ExtCtrls;
type
TfrmGL = class(TForm)
Timer1: TTimer;
procedure FormCreate(Sender: TObject);
procedure FormPaint(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure FormResize(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
private
DC : HDC;
hrc: HGLRC;
quadObj: GLUquadricObj;
end;
const
sColor: array [0..3] of GLfloat = (1, 0.75, 0, 1);
pColor: array [0..3] of GLfloat = (0.4, 0, 0.2, 1);
var
frmGL: TfrmGL;
year : Integer = 0;
day : Integer = 0;
implementation
{$R *.DFM}
procedure dayAdd;
begin
day := (day + 10);
If day > 360 then day := 0;
end;
procedure daySubtract;
begin
day := (day - 10);
If day > 360 then day := 0;
end;
procedure yearAdd;
begin
year := (year + 5);
If year > 360 then year := 0;
end;
procedure yearSubtract;
begin
year := (year - 5);
If year > 360 then year := 0;
end;
{=======================================================================
Перерисовка окна}
procedure TfrmGL.FormPaint(Sender: TObject);
begin
glClear (GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT); // очистка буфера цвета
glPushMatrix;
// рисуем солнце
glPushMatrix;
glRotatef (90.0, 1.0, 0.0, 0.0); // поворачиваем прямо
glMaterialfv(GL_FRONT_AND_BACK, GL_EMISSION, @sColor);
gluSphere (quadObj, 1.0, 15, 15);
glPopMatrix;
// рисуем маленькую планету
glRotatef (year, 0.0, 1.0, 0.0);
glTranslatef (2.0, 0.0, 0.0);
glRotatef (day, 0.0, 1.0, 0.0);
glRotatef (90.0, 1.0, 0.0, 0.0); // поворачиваем прямо
glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, @pColor);
gluSphere (quadObj, 0.2, 10, 10);
glPopMatrix;
SwapBuffers(DC);
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 TfrmGL.FormCreate(Sender: TObject);
const
lcol : Array [0..3] of GLFloat = (1, 0.75, 0, 1);
lpos : Array [0..3] of GLFloat = (0, 0, 0, 1);
begin
DC := GetDC (Handle);
SetDCPixelFormat(DC);
hrc := wglCreateContext(DC);
wglMakeCurrent(DC, hrc);
quadObj := gluNewQuadric;
gluQuadricDrawStyle (quadObj, GLU_FILL);
glShadeModel (GL_SMOOTH);
glEnable (GL_DEPTH_TEST);
glLightfv(GL_LIGHT0, GL_POSITION, @lpos);
glLightfv(GL_LIGHT0, GL_DIFFUSE, @lcol);
glEnable(GL_LIGHTING); // разрешаем работу с освещенностью
glEnable(GL_LIGHT0); // включаем источник света 0
end;
{=======================================================================
Конец работы приложения}
procedure TfrmGL.FormDestroy(Sender: TObject);
begin
gluDeleteQuadric (quadObj);
wglMakeCurrent(0, 0);
wglDeleteContext(hrc);
ReleaseDC (Handle, DC);
DeleteDC (DC);
end;
procedure TfrmGL.FormResize(Sender: TObject);
begin
glViewport(0, 0, ClientWidth, ClientHeight);
glLoadIdentity;
glFrustum (-1, 1, -1, 1, 3, 10); // задаем перспективу
// этот фрагмент нужен для придания трёхмерности
glTranslatef(0.0, 0.0, -8.0); // перенос объекта - ось Z
glRotatef(30.0, 1.0, 0.0, 0.0); // поворот объекта - ось X
glRotatef(20.0, 0.0, 1.0, 0.0); // поворот объекта - ось Y
InvalidateRect(Handle, nil, False);
end;
procedure TfrmGL.Timer1Timer(Sender: TObject);
begin
dayadd;
yearadd;
InvalidateRect(Handle, nil, False);
end;
end.