Солнце в opengl

Модераторы: Duncon, Naeel Maqsudov, Игорь Акопян, Хыиуду

Ответить
MrBrain
Сообщения: 24
Зарегистрирован: 14 май 2009, 16:17

Мне нужно сделать модель земли вращающуюся вокруг солнца, я это сделал, но когда попытался добавить освещение от солнца (куски кода брал из аналогично проги), то у меня почему то и солнце и земля с одинаковыми параметрами материла получаются. Посмотрите пожалуйста в чем ошибка?

Код: Выделить всё

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.
Ответить