VR
Virtual Reality On-line   OpenGL
Новости   |     Журнал    |    Хаkер   |     Магазин   |   Проекты
[   Вход    ]
[Kарта сайтa]
[ Download  ]
[  Конкурс  ]
[  Анекдоты ]
[  Ссылки   ]
[  Реклама  ]
[ Почтальон ]
[ О проекте ]






TopList
OpenGL+Delphi.
Примитивы библиотеки GLU
:

В стандартном OpenGL нет таких очень важных примитивов как сфера или конус. Конечно, ты в любой момент можешь нарисовать сферу из множества точек, но это будет громоздко и тяжело. Есть выход проще -для OpenGL есть надстройка, которая называется glu, и находиться она в файле glu32.dll. Вот именно с ней мы сегодня и познакомимся.
Logo
Рис 1. Результат

На рисунке 1 ты можешь увидеть результат сегодняшней работы. А самое интересное, что код программы будет даже меньше, чем в предыдущей статье. Это не шутка, я на полном серьезен. Я даже приведу полный листинг проги прямо здесь, а потом мы разберём её по кусочкам.

unit Unit1;
interface
uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, ComCtrls, GLU, GL;

type
  TForm1 = class(TForm)
    procedure FormPaint(Sender: TObject);
    procedure FormResize(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
    DC:HDC;
    hrc:HGLRC;
    quadObj:PGLUquadricObj;
    procedure PixelFormat;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation
{$R *.DFM}

procedure TForm1.FormPaint(Sender: TObject);
var
 ps:TPaintStruct;
begin
 BeginPaint(Handle,ps);
 glClearColor(1,0.5,0.5,1);
 glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);

 glPushMatrix;
  glRotated(45,1,0,0);

  gluQuadricDrawStyle (quadObj, GLU_FILL);
  glColor3f(1,0,0);
  gluSphere (quadObj,1, 100, 10);
  glTranslatef(1.5,1,1);
  gluCylinder (quadObj,0, 0.2, 1, 30, 10);
  gluDisk (quadObj, 0.2, 0.3, 20, 2);
  glTranslatef(-3,0,0);
  gluCylinder (quadObj,0, 0.2, 1, 30, 10);
  gluDisk (quadObj, 0.2, 0.3, 20, 2);
 glPopMatrix;

 glFlush();
 swapBuffers(dc);
 EndPaint(Handle,ps);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
 DC:=GetDC(Handle);
 PixelFormat;
 hrc:=wglCreateContext(DC);
 wglMakeCurrent(DC,hrc);
 quadObj:=gluNewQuadric();
end;

Когда я сказал, что приведу полный листинг, я тебя немного обманул. Надеюсь, ты простишь меня засранца. Я не стал приводить текст трёх функций FormResize, FormDestroy и PixelFormat, потому что они абсолютно такие же, как и во всех предыдущих уроках. В самом начале, я объявляю переменную quadObj типа PGLUquadricObj. Если ты не используешь заголовочные файлы GL и GLU (которые можно скачать в разделе полезности), а меняешь их на один файл opengl (из стандартной поставки Delphi), то у тебя эта переменная будет типа GLUquadricObj (без буквы "Р" на конце).

По событию OnCreate я инициализирую эту переменную (одна из последних строцек моего кода) quadObj:=gluNewQuadric();.

В процедуре FormPaint я задаю параметры рисования объекта gluQuadricDrawStyle. В качестве первого параметра выступает созданная мною переменная, с которой будет ассоциироваться "тип рисования". Второй параметр - непосредственно тип, он может иметь параметры

  • GLU_FILL - объект полностью закрашивается (рис 1).
  • GLU_LINE - объект рисуется линиями (рис 2).
  • GLU_SILHOUETTE - рисуется только силуэт объекта (рис 3.)
  • GLU_POINT - объект рисуется точками (рис 4).
Logo
Рис 2.
Logo
Рис 4.
Logo
Рис 3.

После всего этого можно смело рисовать объекты библиотеки glu. В этом примере я использовал три из них, поэтому мы только их и рассмотрим:

gluSphere - первый параметр это GLU объект (в нашем случае quadObj), второе - радиус, третий - количество частей вокруг оси Z, четвёртый - количество частей вдоль оси Z.

gluCylinder - первый параметр такой же, второе - маленький радиус, третий - большой радиус, четвёртый - количество частей вокруг оси Z, пятый - количество частей вдоль оси Z.

gluDisk - первый параметр всё тот же, второе - внутренний радиус, третий - внешний радиус, четвёртый - количество частей вокруг оси Z, пятый - число колец (в принципе это всё те же части).
Logo
Рис 5.

Что такое "количество частей вокруг/вдоль оси Z"? Чем больше этих частей, тем более гладким будет объект. Я не буду особо приводить примеры, а покажу только один, в котором очень сильно уменьшено количество этих частей (рис5).

Вот и всё. На сегодня новостей больше нет. Но это только на сегодня. Нас ещё ждут текстуры, материалы, освещение и что-нибудь ещё придумаю. Удачи!!!

 Исходники примера забирай здесь Заголовочные файлы возьми на моей страничке в разделе "Полезности".


Copyright©: Horrific aka Флёнов Михаил
Design by FMk group©