компютърна графика

Примитивни и трансформация в OpenGL пространство за пример на чертежа на куб

Строго погледнато, когато се напише програма, която използва OpenGL. Ние не се направи нищо. Ние описваме модел на сцена, задайте свойствата на примитиви, от която всички други предмети и управление на OpenGL държави. Визуализацията на модела се занимава с OpenGL. въз основа на информацията, с която са докладвали. Съвременните графични системи могат да попречат на процеса на изобразяване използване шейдъри. която ви позволява да програмирате доста гъвкави и бързи графични приложения.

OpenGL примитиви

Четиристранни (Quad)

Всички ограничения полигон прилагат в OpenGL. На първо място, на полигона трябва да бъде проста. т.е. не трябва самостоятелно кръстовища. На второ място, той трябва да е изпъкнал. В изпъкнал многоъгълник сегмент, свързваща всеки две точки на двата вътрешни, не пресича неговите граници.

компютърна графика

компютърна графика

компютърна графика

Всички примитиви в OpenGL, определени от следната структура:

glBegin (GL_QUADS);
glVertex3f (-0.5f, -0.5f, 0.0f);
glVertex3f (-0.5f, 0.5f, 0.0f);
glVertex3f (0.5f, 0.5f, 0.0f);
glVertex3f (0.5f, -0.5f, 0.0f);
glEnd ();

Типът на параметър се предава glBegin командни примитиви, които ще бъдат описани между команди glBegin / glEnd. В рамките на посочените координати на върховете на примитивното.

Забележка команда glVertex 3 е формат. Тройка означава, че отборът премина три аргумента. В този случай, координатите във формат (х. Y. Z). Подписът на е означава, че параметрите на екипите са с плаваща запетая.

изготвяне на куба

анулира DrawCube (размер GLfloat)
glBegin (GL_QUADS);
// наляво
glVertex3f (-size / 2, -size / 2, -size / 2);
glVertex3f (-size / 2, размер / 2, -size / 2);
glVertex3f (-size / 2, размер / 2, размер / 2);
glVertex3f (-size / 2, -size / 2, размер / 2);
// десния край
glVertex3f (размер / 2, -size / 2, -size / 2);
glVertex3f (размер / 2, -size / 2, размер / 2);
glVertex3f (размер / 2, размер / 2, размер / 2);
glVertex3f (размер / 2, размер / 2, -size / 2);
// долната граница
glVertex3f (-size / 2, -size / 2, -size / 2);
glVertex3f (-size / 2, -size / 2, размер / 2);
glVertex3f (размер / 2, -size / 2, размер / 2);
glVertex3f (размер / 2, -size / 2, -size / 2);
// горната граница на
glVertex3f (-size / 2, размер / 2, -size / 2);
glVertex3f (-size / 2, размер / 2, размер / 2);
glVertex3f (размер / 2, размер / 2, размер / 2);
glVertex3f (размер / 2, размер / 2, -size / 2);
// обратно лицето
glVertex3f (-size / 2, -size / 2, -size / 2);
glVertex3f (размер / 2, -size / 2, -size / 2);
glVertex3f (размер / 2, размер / 2, -size / 2);
glVertex3f (-size / 2, размер / 2, -size / 2);
// Front Face
glVertex3f (-size / 2, -size / 2, размер / 2);
glVertex3f (размер / 2, -size / 2, размер / 2);
glVertex3f (размер / 2, размер / 2, размер / 2);
glVertex3f (-size / 2, размер / 2, размер / 2);
glEnd ();
>

Прибл. В този пример, само геометрията се моделира куб. За правилното осветление и текстура за всеки лицето на необходимостта от създаване на допълнителни свойства: нормалните и текстура координати.

афинни трансформации

В статията "Affine трансформации в пространството" бяха разгледани подробно афинно преобразуване на пространството. Нека да видим как те се намират в OpenGL.

Прибл. Тази статия не се занимава с комбинацията от афинни трансформации. Това ще бъде описано подробно в следващата статия.

Affine трансформация в OpenGL

Решението на този проблем е да се върти координатната система в обратна посока след прекрояване:

glClear (GL_COLOR_BUFFER_BIT); // Изчистете фреймбуфер

glRotatef (30.0 е 1.0 е 1.0 е 1.0 е ...); // върти около 30 градуса вектора (1, 1, 1)

glColor3f (0.7f, 0.25f, 0.55f); // Задаване на текущия цвят примитиви

glutWireCube (1.0f); // направи тел куб на страна 2

glRotatef (- 30.0 е 1.0 е 1.0 е 1.0 е ...); / / Върти -30 градуса по вектор (1, 1, 1)

Този подход има няколко недостатъка:

  • код дублиране: коригиране на параметрите на пряко преобразуване, е необходимо да ги отстраним в обратен;
  • неточна: в процеса на трансформация могат да се натрупват малки грешки, които, когато се повтарят ще преначертае видимото

Този проблем може лесно да бъде решен, ако преди извършващи трансформации помнят текущата локалната координатна система, а след това направи точно да ги възстановите. Това се прави с няколко glPushMatrix / glPopMatrix отбори. Какво прави матрицата ще бъде обсъдено в следващата статия. Крайният код ще изглежда така.

glClear (GL_COLOR_BUFFER_BIT); // Изчистете фреймбуфер

glPushMatrix (); // помня местна координатна система
glRotatef (30.0 е 1.0 е 1.0 е 1.0 е ...); // върти около 30 градуса вектора (1, 1, 1)

glColor3f (0.7f, 0.25f, 0.55f); // Задаване на текущия цвят примитиви

glutWireCube (1.0f); // направи тел куб на страна 2
glPopMatrix (); // Възстановяване на местната координатна система