Студопедия.Орг Главная | Случайная страница | Контакты | Мы поможем в написании вашей работы!  
 

Рисование точек, линий и многоугольников



Для задания размеров точки служит процедура glPointSize(GLfloat size), которая устанавливает размер точки в пикселях, по умолчанию он равен единице.

Для задания ширины линии в пикселях служит процедура gflineWidth(GLfloatwidth). Шаблон, которым будет рисоваться линия, можно задать при помощи процедуры glLineStipple(Glint factor, GLushort pattern). Шаблон задается переменной pattern и растягивается в factor раз. Использование шаблонов линии необходимо разрешить при помощи команды glEnable(GL_UNE_STIPPLE). Запретить использование шаблонов линий можно командой glDisable(GL_LINE_ST1PPLE).

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

Многоугольник имеет две стороны (лицевую и нелицевую) и может быть отрисован по-разному, в зависимости от того, какая сторона обращена к наблюдателю. По умолчанию обе стороны рисуются одинаково. Для задания того, как именно следует рисовать переднюю и заднюю стороны многоугольника, служит процедура glPolygonMode(GLenum face, GLenum mode). Параметр face может принимать значения GL_FRONT_AND_BACK (обе стороны), GL_FRONT (лицевая сторона) или GL_BACK (нелицевая сторона). Параметр mode может принимать значения GL_POINT, GL_LINE или GL_FILL, обозначая, что многоугольник должен рисоваться как набор граничных точек, граничная ломаная линия или заполненная область, например:

glPolygonMode(GL_FRONT, GL_FILL);

glPolygonMode(GL_BACK, GLJJNE).

По умолчанию вершины многоугольника, которые появляются на экране в направлении против часовой стрелки, называются лицевыми. Это можно изменить при помощи процедуры glFrontFace(GLenum mode). По умолчанию параметр mode равняется GL_CCW, что соответствует направлению обхода против часовой стрелки. Если задать этот параметр равным GL_CW, то лицевыми будут считаться многоугольники с направлением обхода вершин по часовой стрелке.

При помощи процедуры glCullFace(GLenum mode) вывод лицевых или нелицевых граней многоугольников можно запретить. Параметр mode принимает одно из значений GL_FRONT (оставить только лицевые грани), GL_BACK (оставить нелицевые) или GL_FRONT_AND_BACK (оставить все грани). Для отсечения граней необходимо разрешить отсечение при помощи команды glEnable(GL_CULL_FACE).

Шаблон для заполнения грани можно задать при помощи процедуры gIPolygonStipple(const GLubyte * mask), где mask задает массив битов размером 32 на 32.

Для разрешения использования шаблонов при выводе многоугольников служит команда glEnable(GL_POLYGON_STIPPLE).

Свой вектор нормали для каждой вершины можно задать при помощи одной из следующих процедур:

glNormal3{b s i d f}(TYPE nx, TYPE ny, TYPE nz);

glNormal3{b s I d f}v(const TYPE * v).

В версиях с суффиксами b, s или i значения аргументов масштабируются в отрезок [-1, 1].

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

#include <windows.h>

#include <gl\gl.h>

drawBox(GLfloat x1, GLfloat x2, GLfloat y1, GLfloat y2, GLfloat z1, GLfloat

z2)

{

glBegin (GL_POLYGON);

glNormal3f (0.0, 0.0, 1.0);

glVertex3f (x1, y1, z2);

glVertex3f (x2, y1, z2);

glVertex3f (x2, y2, z2);

glVertex3f (x1, y2, z2);

glEnd ();

glBegin (GL_POLYGON);

glNormal3f (0.0, 0.0, -1.0);

glVertex3f (x2, y1, z1);

glVertex3f (x1, y1, z1);

glVertex3f (x1, y2, z1);

glVertex3f (x2, y2, z1);

glEnd ();

glBegin (GL_POLYGON);

glNormal3f (-1.0, 0.0, 0.0);

glVertex3f (x1, y1, z1);

glVertex3f (x1, y1, z2);

glVertex3f (x1, y2, z2);

glVertex3f (x1, y2, z1);

glEnd ();

glBegin (GL_POLYGON);

glNormal3f (1.0, 0.0, 0.0);

glVertex3f (x2, y1, z2);

glVertex3f (x2, y1, z1);

glVertex3f (x2, y2, z1);

glVertex3f (x2, y2, z2);

glEnd ();

glBegin (GL_POLYGON);

glNormal3f (0.0, 1.0, 0.0);

glVertex3f (x1, y2, z2);

glVertex3f (x2, y2, z2);

glVertex3f (x2, y2, z1);

glVertex3f (x1, y2, z1);

glEnd ();

glBegin (GL_POLYGON);

glNormal3f (0.0, -1.0, 0.0);

glVertex3f (x2, y1, z2);

glVertex3f (x1, y1, z2);

glVertex3f (x1, y1, z1);

glVertex3f (x2, y1, z1);

glEnd ();

}





Дата публикования: 2014-11-03; Прочитано: 246 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!



studopedia.org - Студопедия.Орг - 2014-2024 год. Студопедия не является автором материалов, которые размещены. Но предоставляет возможность бесплатного использования (0.007 с)...