Здравствуйте!
У меня такое дело. Есть куб, его можно вращать вокруг оси, перемещать взад-вперёд. При вращении происходит изменение цвета согласно освещению.
Но при этом не получается очистить буфер цвета.
Подскажите, пожалуйста, в нём ли дело? Или в изменение цвета надо добавить переменную, отвечающую за вращение? Или что-то ещё не так?
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, OpenGL;
type
TfrmGL = class(TForm)
procedure FormCreate(Sender: TObject);
procedure FormPaint(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
procedure FormMouseWheel(Sender: TObject; Shift: TShiftState; WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean);
procedure FormMouseClick(Sender: TObject);
procedure FormResize(Sender: TObject);
private
hrc: HGLRC;
h, mx, my : GLfloat;
procedure Model;
procedure Axes;
end;
var
frmGL: TfrmGL;
implementation
procedure TfrmGL.Model;
begin
glColor3f (1.0, 0.0, 0.5);
glBegin(GL_QUADS);
glNormal3f(0, 0, 1);
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);
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(-1, 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);
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, 1, 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);
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;
end;
procedure TfrmGL.Axes;
var
Color : Array [1..4] of GLFloat;
begin
glGetFloatv (GL_CURRENT_COLOR, @Color);
glScalef (0.8, 0.8, 0.8);
glColor3f (0, 1, 0);
glBegin (GL_LINES);
glVertex3f (0, 0, 0);
glVertex3f (-3, 0, 0);
glVertex3f (0, 0, 0);
glVertex3f (0, 3, 0);
glVertex3f (0, 0, 0);
glVertex3f (0, 0, 3);
glEnd;
glBegin (GL_LINES);
glVertex3f (-3.1, -0.2, 0.5);
glVertex3f (-3.1, 0.2, 0.1);
glVertex3f (-3.1, -0.2, 0.1);
glVertex3f (-3.1, 0.2, 0.5);
glEnd;
glBegin (GL_LINES);
glVertex3f (0.0, 3.1, 0.0);
glVertex3f (0.0, 3.5, 0.0);
glVertex3f (0.0, 3.9, -0.3);
glVertex3f (0.0, 3.5, 0.0);
glVertex3f (0.0, 3.9, 0.3);
glVertex3f (0.0, 3.5, 0.0);
glEnd;
glBegin (GL_LINES);
glVertex3f (0.3, -0.3, 3.1);
glVertex3f (-0.3, -0.3, 3.1);
glVertex3f (0.3, 0.3, 3.1);
glVertex3f (-0.3, 0.3, 3.1);
glVertex3f (-0.3, -0.3, 3.1);
glVertex3f (0.3, 0.3, 3.1);
glEnd;
glColor3f (Color [1], Color [2], Color [3]);
end;
procedure TfrmGL.FormPaint(Sender: TObject);
begin
glClear (GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
glPushMatrix;
glClear (GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
glScalef (0.3, 0.3, 0.3);
glRotatef (my, 0.0, 1.0, 0.0);
glTranslatef (mx, 0.0, 0.0);
glPolygonMode(GL_FRONT_AND_BACK,GL_FILL);
Model;
Axes;
glPopMatrix;
glFlush;
glFinish;
SwapBuffers(GetDC(Handle));
glClear (GL_COLOR_BUFFER_BIT);
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);
begin
SetDCPixelFormat(GetDC(Handle));
hrc := wglCreateContext(GetDC(Handle));
wglMakeCurrent(GetDC(Handle), hrc);
glEnable (GL_COLOR_MATERIAL);
glEnable (GL_DEPTH_TEST);
glClearColor (0.5, 0.5, 0.75, 1.0);
glLineWidth (1.5);
glEnable (GL_LIGHTING);
glEnable (GL_LIGHT0);
glColor3f (1.0, 0.0, 0.0);
my := 0.0;
mx := 0.0;
end;
procedure TfrmGL.FormDestroy(Sender: TObject);
begin
wglMakeCurrent(0, 0);
wglDeleteContext(hrc);
ReleaseDC (Handle, GetDC(Handle));
DeleteDC (GetDC(Handle));
end;
procedure TfrmGL.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
If Key = VK_LEFT then begin
my := my + 2.0;
InvalidateRect(Handle, nil, False);
end;
If Key = VK_RIGHT then begin
my := my - 2.0;
InvalidateRect(Handle, nil, False);
end;
If Key = VK_UP then begin
mx := mx - 0.1;
InvalidateRect(Handle, nil, False);
end;
If Key = VK_DOWN then begin
mx := mx + 0.1;
InvalidateRect(Handle, nil, False);
end;
FormResize(nil);
end;
procedure TfrmGL.FormMouseWheel(Sender: TObject;Shift: TShiftState;
WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean);
begin
If ssCtrl in Shift then begin
If WheelDelta > 0 then
h := h + 1
else
h := h - 1;
Caption := Floattostr (h);
Refresh
end;
end;
procedure TfrmGL.FormMouseClick(Sender: TObject);
begin
Application.Terminate();
end;
procedure TfrmGL.FormResize(Sender: TObject);
begin
glViewPort(0, 0, ClientWidth, ClientHeight);
glMatrixMode (GL_PROJECTION);
glLoadIdentity;
glFrustum (-1, 1, -1, 1, 3, 10);
glMatrixMode (GL_MODELVIEW);
glLoadIdentity;
glTranslatef(0.0, 0.0, -4.0);
glRotatef(30.0, 1.0, 0.0, 0.0);
glRotatef(70.0, 0.0, 1.0, 0.0);
InvalidateRect(Handle, nil, False);
end;
end.
Если нужен exe-шник, пишите, вышлю.