Blender для начинающих/Немного об OpenGL

Материал из Викиучебника — открытых книг для открытого мира
Перейти к навигации Перейти к поиску
Blender2017.png



OpenHK2.jpg - перейти к комбинациям клавиш.
Level2.jpg - перейти к первому необязательному для изучения разделу.
NextChapter.jpg - переход к следующей по курсу главе (порядок глав не совпадает с порядком глав по содержанию).

CTRL+ALT+U

CTRL+U

SHIFT+S

CTRL+Q

A

R

G

S

SHIFT+D

ALT+D

CTRL+NUMPAD+

CTRL+NUMPAD-

SHIFT+L

SHIFT+G

ALT+M

F

CTRL+ALT+SHIFT+C

SHIFT+S

D

T

I

Shift+B

B

C

Одни из главных классов Python: bpy.ops | bpy.data | bpy.types.ID

Рендеринг Рендер-ферма
Отсечение Шейдер
Трассировка лучей Сжатие текстур

Расположение элементов интерфейса


Ссылки на материалы
Возможно, Вас заинтересует следующее:
О Blender 2.76 FInfo.jpg Скачать Blender 2.76 FDownload.jpg

Введение[править]

OpenGL - библиотека, позволяющая рисовать двухмерные и трехмерные сцены. В ней присутствуют следующие типы:

  1. GLbyte байт
  2. GLshort - короткое целое
  3. GLint - целое
  4. GLfloat - дробное
  5. GLdouble - дробное с двойной точностью
  6. GLubyte - беззнаковый байт
  7. GLushort - беззнаковое короткое целое
  8. GLuint - беззнаковое целое

Основы OpenGL[править]

Представление цвета в OpenGL[править]

Цвет в OpenGL представляется в виде трех чисел: красного, зеленого и синего компонентов. Все параметры задаются в диапазоне от 0 до 1. Установить цвет можно функцией:

GLColor3f(R, G, B)

Например, красный цвет устанавливается вот так:

GLColor3f(1.0, 0.0, 0.0)

Устанавливать цвет можно абсолютно для любого примитива.

Примитивы GLaux[править]

Ниже приведен список примитивов, которые могут быть нарисованы с помощью библиотеки «GLaux» - оберткой над OpenGL.

Функция Описание функции
auxSolidSphere(r) Рисует сферу радиусом r.
auxSolidCube(w) Рисует куб с шириной, длиной и высотой, равной w.
auxSolidBox(w, l, h) Рисует параллелепипед с шириной w, длиной l и высотой h.
auxSolidTorus(r, R) Рисует тор с внутренним радиусом r, и внешним радиусом R.
auxSolidCylinder(r, h) Рисует цилиндр с радиусом r в основании и высотой h.

Для рисования примитивов в виде каркасной сетки пишите «Wire» вместо «Solid».

Функция Описание функции
auxWireSphere(r) Рисует сферу радиусом r.
auxWireCube(w) Рисует куб с шириной, длиной и высотой, равной w.
auxWireBox(w, l, h) Рисует параллелепипед с шириной w, длиной l и высотой h.
auxWireTorus(r, R) Рисует тор с внутренним радиусом r, и внешним радиусом R.
auxWireCylinder(r, h) Рисует цилиндр с радиусом r в основании и высотой h.

OpenGL1.jpg

Изменения системы координат[править]

Для изменения системы координат существуют такие функции как:

Функция Описание
glTranslate(x, y, z) Сдвигает текущую систему координат на вектор v{x, y, z}.
glRotate(x, y, z) Поворачивает текущую систему координат по всем осям на указанные углы.
glPushMatrix() Сохраняет текущую систему координат для возможности ее загрузки.
glPopMatrix() Загружает ранее сохраненную систему координат.

Пример рисования фигур со сдвигом системы координат:

    glPushMatrix();
    glTranslate(1.4,0,0);
    glColor3f(0,1,0);
    auxSolidSphere(0.5);

    glTranslate(1,0,0);
    glColor3f(0,0,1);
    auxSolidSphere(0.3);

    glPopMatrix();
    glColor3f(1,0,0);
    auxSolidSphere(0.75); // А теперь рисуем сферу в точке (0, 0, 0).

OpenGL2.jpg

Примитивы OpenGL[править]

Каждый примитив в OpenGL рисуется следующим образом:

glBegin(GLenum mode);
  // Функции отрисовки фигуры.
glEnd();
  • mode может принимать одно из нескольких значений: GL_POINTS (для рисования только точек), GL_LINES (для рисования линий - каждая пара вершин задает отрезок), GL_LINE_STRIP (рисуется ломаная через все точки, указанные между glBegin и glEnd), GL_TRIANGLES (каждые 3 вершины задают треугольник), GL_TRIANGLE_STRIP (рисуются треугольники с общей стороной), GL_QUADS (каждые две подряд стоящие пары вершин задают четырехугольник).
  • Есть 4 функции для отрисовки фигур. Все их параметры имеют тип double.
Функция Описание
glVertex2D(x, y) Рисует 2D точку в координатах (x, y).
glVertex3D(x, y, z) Рисует 3D точку в координатах (x, y, z).
glVertex2dv(a) Рисует что-либо в соответствии с mode, используя массив из двух переменных.
glVertex3dv(a) Рисует что-либо в соответствии с mode, используя массив из трех переменных.

Установить размер точки в пикселях можно функцией glPointSize(n), где n - количество пикселей.

Функции для работы с примитивами[править]

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

Функция Описание Пояснение
glLineStipple(GLint factor, GLushort pattern) Устанавливает где будет видна линия, а где нет. Есть некоторое число pattern, которое переводится в двоичную систему. Там где 0 - там линия не видна, где 1 - видна. Первый параметр factor указывает количество повторения одного бита (одной цифры в двоичной записи числа).
glLineWidth(w) Устанавливает толщину линии в пикселях. -
glPolygonMode(side, m) Устанавливает с какой стороны рисовать треугольник и как. Параметр side отвечает за сторону, с которой рисовать треугольник, и может принимать одно из значений: GL_FRONT (спереди), GL_BACK (сзади), GL_FRONT_AND_BACK (с обоих сторон). m указывает, как рисовать треугольник - GL_POINT (рисовать только точки треугольника), GL_LINE (рисует ребра треугольника) и GL_FILL (рисует заполненный треугольник).

Примитивы OpenGL[править]

Для создания любого из примитивов, приведенных ниже, следует сначала объявить объект типа GLUquadricObj:

GLUquadricObj *name

Далее инициализировать его:

name = gluNewQuadric();

И затем рисовать с его помощью примитивы.

  • Стиль примитива, который будет нарисован, задается функцией gluQuadricDrawStyle. В ней первый параметр - ссылка на объект типа GLUquadricObj, второй - стиль отрисовки (GLU_POINT - рисуются только точки, GLU_LINE - рисуются только линии, GLU_FILL - фигура рисуется сплошной).
Функция Описание Параметры
gluSphere(r, cZ1, cZ2) Рисует сферу. r - радиус сферы, cZ1 - количество разбиений по оси Z, а cZ2 - вдоль нее.
gluSylinder(r, r2, h, cZ1, cZ2) Рисует цилиндр. r - нижний радиус цилиндра, r2 - верхний радиус, h - высота цилиндра, cZ1 - количество разбиений по оси Z, а cZ2 - вдоль нее.
glDisk(r, r2, cZ1, cZ2) Рисует диск. r - внутренний радиус диска, r2 - внешний радиус диска, cZ1 - количество разбиений по оси Z, а cZ2 - вдоль нее.

Сглаживание цветов[править]

Сглаживание цветов включается функцией:

glShadeModel(GL_SMOOTH);

А отключается так:

glShadeModel(GL_FLAT);

Плоскости отсечения[править]

Если Вам надо нарисовать какой-то объект урезанным, то используйте плоскости отсечения. Их может быть 6. Все они называются так: GL_CLIP_PLANE0, GL_CLIP_PLANE1, GL_CLIP_PLANE2, GL_CLIP_PLANE3, GL_CLIP_PLANE4 и GL_CLIP_PLANE5. Для включения плоскости отсечения пишите:

glEnable(p);

Где p - имя одной из перечисленных выше плоскостей. Вспомните, что плоскость задается уравнением A*x+B*y+C*z+D = 0. Если хотите задать плоскости в OpenGL делайте так:

glClipPlane(p, a);

Где p - имя одной из перечисленных выше плоскостей; a - массив из четырех чисел, являющихся коэффициентами A, B, C и числом D.

  • Для удаления плоскости - ее деактивации используйте такую конструкцию:
glDisable(p);

Где p - имя одной из перечисленных выше плоскостей.

Отображение нарисованного[править]

Прорисовка на экран всего нарисованного в буфере делается командой:

auxSwapBuffers();