VR
Virtual Reality On-line   Журнал
Новости   |     Журнал    |    Хаkер    |     Магазин   |   Проекты
[   Вход    ]
[Kарта сайтa]

[ Download  ]
[  Конкурс  ]
[ Анекдоты  ]
[  Ссылки   ]
[  Реклама  ]
[ Почтальон ]
[ О проекте ]






TopList
OpenGL+Delphi
Примитивная графика
:

Примитивная графика - это не значит, что она будет слабенькой или ужасной. Это значит, что сложные объекты состоит из большого количества простых. Сегодня я постараюсь рассмотреть как можно больше примитивов, с помощью которых ты сможешь строить сложные сцены. Приготовься, урок будет большим, но очень познавательным. Для егё понимания тебе придётся вспомнить школьный курс геометрии (достаточно того, что ты проходил до 9-го класса).

Вообще-то, вся OpenGL графика построена на примитивах. Самым примитивным является Vertex (точка). С ней мы уже познакомились и умеем рисовать. Линии и квадраты я тоже опускаю, потому что мы уже очень много с ними работали. Единственное, что действительно будет для тебя новым, так это треугольники. Я почему-то до сих пор их не использовал, хотя это основа OpenGL. Вся графика в этой библиотеке просчитывается и рисуется с помощью треугольников.

Выдели минутку и рассмотри рисунок 1. Здесь представлены различные фигуры, но все они состоят из примитивов. Верхние фигуры сделаны из линий, средние из треугольников и нижние из квадратов.
Logo
Рис 1. Примитивы

Давай рассмотрим каждый примитив поподробнее, но для начала взглянём на новую процедуру:

glLineWidth(5);

Не надо много ума, чтобы догадаться, что эта процедура задаёт толщину линии. Она влияет только на рисование линий, на квадраты и треугольники она не влияет.

Теперь рассмотрим первый примитив из двух линий:

glBegin(GL_LINES);
  glColor3f (0.0, 1.0, 0.0);
  glVertex3f(-2.7,1.7,0);
  glVertex3f(-2.7,1,0);
  glColor3f (0.0, 0.0, 1.0);
  glVertex3f(-2.3,1.7,0);
  glVertex3f(-2.3,1,0);
 glEnd;

glBegin с параметром GL_LINES открывает набор линий. Я здесь рисую две параллельные линии разного цвета, а ты можешь нарисовать одну или даже 10. Между glBegin(GL_LINES); и glEnd должно быть чётное количество вершин. Если будет нечётное, то последняя будет просто отбрасываться и не повлияет на сцену.

glBegin(GL_LINE_STRIP);
  glColor3f (0.0, 1.0, 0.0);
  glVertex3f(-1,1.7,0);
  glVertex3f(-1,1,0);
  glColor3f (0.0, 0.0, 1.0);
  glVertex3f(-0.5,1.7,0);
  glVertex3f(-0.5,1,0);
 glEnd;

glBegin с параметром GL_LINE_STRIP открывает набор линий с продолжением. Это значит, что конец первой линии будет являться началом второй, а конец второй, будет являться началом третей. Здесь может быть любое количество вершин. Почему? Подумай немного и ты поймёшь.

glBegin(GL_LINE_LOOP);
  glColor3f (0.0, 1.0, 0.0);
  glVertex3f(0.5,1.7,0);
  glVertex3f(0.5,1,0);
  glColor3f (0.0, 0.0, 1.0);
  glVertex3f(1,1.7,0);
  glVertex3f(1,1,0);
 glEnd;

glBegin с параметром GL_LINE_LOOP открывает набор замкнутых линий. Этот примитив очень похож на предыдущий с одной только разницей - последняя вершина замкнётся с первой.

теперь перейдём к треугольникам. Для наглядности смотри на примитивы расположенные на рисунке в центре.

glBegin(GL_TRIANGLES);
  glColor3f (0.0, 1.0, 0.0);
  glVertex3f(-2.7,0.7,0);
  glVertex3f(-2.7,0.0,0);
  glVertex3f(-2.5,0.4,0);
  glColor3f (0.0, 0.0, 1.0);
  glVertex3f(-2.3,0.7,0);
  glVertex3f(-2.3,0.0,0);
  glVertex3f(-2.1,0.4,0);
 glEnd;

glBegin с параметром GL_TRIANGLES рисует треугольники. Количество вершин должно быть кратное трём, лишние вершины отбрасываются.

glBegin(GL_TRIANGLE_STRIP);
  glColor3f (0.0, 1.0, 0.0);
  glVertex3f(-0.7,0.7,0);
  glVertex3f(-0.7,0.0,0);
  glVertex3f(-0.5,0.4,0);
  glColor3f (0.0, 0.0, 1.0);
  glVertex3f(-0.3,0.7,0);
  glVertex3f(-0.3,0.0,0);
  glVertex3f(-0.1,0.4,0);
 glEnd;

glBegin с параметром GL_TRIANGLES_STRIP рисует треугольники с замкнутыми вершинами. Последняя вершина первого треугольника является первой вершиной второго треугольника.

glBegin(GL_TRIANGLE_FAN);
  glColor3f (0.0, 1.0, 0.0);
  glVertex3f(1.3,0.7,0);
  glVertex3f(1.3,0.0,0);
  glVertex3f(1.5,0.4,0);
  glColor3f (0.0, 0.0, 1.0);
  glVertex3f(1.7,0.7,0);
  glVertex3f(1.7,0.0,0);
  glVertex3f(1.9,0.4,0);
 glEnd;

glBegin с параметром GL_TRIANGLE_FAN рисует треугольники с замкнутыми гранями. Последняя грань первого треугольника является первой гранью второго треугольника. Количество вершин может быть любым (не меньше трёх), потому что последняя грань хранит в себе уже две точки, и прибавив ещё одну получается новый треугольник.

Теперь мы переходим к квадратам. Здесь я буду писать сокращённо для экономии места. Ты и так уже должен всё хватать на лету.

glBegin(GL_QUADS);

Рисует квадраты. Количество вершин должно быть кратно 4-м.

glBegin(GL_QUAD_STRIP);

Рисует квадраты с общей гранью. Последняя грань первого квадрата является первой для второго. Количество вершин должно быть больше или равно 4-м и кратно 2-м.

glBegin(GL_POLYGON);

Рисует полигон. Это просто набор вершин объединённых между собой. Честно сказать, я не знал какой лучше пример привести. Мой пример не очень удачный, но попробуй сам поиграть с вершинами, подвигай их в разные стороны и посмотри на результат.

Вот и всё. Вначале мне казалось, что статья раздуется на десяток страниц, а оказалось всё не так уж и страшно. Теперь тебе не трудно будет нарисовать достаточно сложную сцену. Самое главное, чтобы хватило воображения.

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


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