Рассылка закрыта
При закрытии подписчики были переданы в рассылку "Программирование в Delphi" на которую и рекомендуем вам подписаться.
Вы можете найти рассылки сходной тематики в Каталоге рассылок.
СообЧА. Программирование на Delphi
Информационный Канал Subscribe.Ru |
СООБЧА: Летний Выпуск-2..(коротко обо всем) |
***СООБЧА WEEKLY***
издается с августа 2001г. при участии Pixelsoftware |
Срочно собираю команду для работы над проектом : GL-cars Владения дельфи5-6 либо 3DS max3-4. Наличие всех умений не обязательно, если вы новичок в одной из описанных областей, уже хорошо обучение по ходу работы. Нужна комманда примерно 3-4 человека, поэтому мест много. Сразу скажу, что проект некоммерческий,(пока) и какую-либо оплату(помимо ценного опыта и обмена знаниями) не обещаю. Однако все учавствовавшие в проекте могут свободно использовать любую его часть или весь проект в своих целях(с указанием ВСЕХ АВТОРОВ). |
Ведущему рассылки требуется оплачиваемая
удаленная работа(А также удаленно-оплачиваемая). Устроят варианты
от 500 руб в месяц и выше...
|
Основы OpenGL часть2 |
Вершины и примитивы Определение атрибутов вершины Положение вершины в пространстве Положение вершины определяются заданием их координат в двух- ,трех-, или четырехмерном пространстве (однородные координаты). Это реализуется с помощью нескольких версий команды glVertex:
void glVertex[2 3 4][s i f d] (type coords) void glVertex[2 3 4][s i f d]v (type *coords)
Каждая команда задает 4 координаты вершины: x, y, z и w. Команда glVertex2 получает значения x и y. Координата z в таком случае устанавливается по умолчанию равной 0, а координата w равной 1. Vertex3 получает координаты x, y, z и заносит в координату w значение 1. Vertex4 позволяет задать все 4 координаты. Для ассоциации с вершинами цветов, нормалей, и текстурных координат используются текущие значения соответствующих данных. Эти значения могут быть изменены в любой момент путем использования соответствующих команд. Цвет вершины Для задания текущего цвета вершины используются команды
void glColor[3 4][b s i f] (GLtype components) void glColor[3 4][b s i f]v (GLtype components)
Первые три параметра задают R, G, B компоненты цвета, а последний параметр определяет alpha-компонету, которая задает уровень прозрачности объекта. Если в названии команды указан тип ‘f’ (float), то значения всех параметров должны принадлежать отрезку [0,1], при этом по умолчанию значение alpha-компоненты устанавливается равным 1.0, что соответствует полной непрозрачности. Если указан тип ‘ub’ (unsigned byte), то значения должны лежать в отрезке [0,255]. Разным вершинам можно назначать различные цвета и тогда будет проводиться линейная интерполяция цветов по поверхности примитива. Для управления режимом интерполяции цветов используется команда
void glShadeModel (GLenum mode)
вызов которой с параметром GL_SMOOTH включает интерполяцию (установка по умолчанию), а с GL_FLAT – отключает.
Нормаль Аналогичным образом можно определить нормаль в вершине, используя команды
void glNormal3[b s i f d] (type coords) void glNormal3[b s i f d]v (type coords)
Задаваемый вектор может не иметь единичной длины, но он будет нормироваться автоматически в режиме нормализации, который включается вызовом команды glEnable(GL_NORMALIZE). Команды
void glEnable (GLenum mode) void glDisable (GLenum mode)
производят включение и отключение того или иного режима работы конвейера OpenGL. Эти команды применяются достаточно часто, и их влияние будет рассматриваться в конкретных случаях. Примечание Включение режима GL_NORMALIZE негативно влияет на скорость работы механизма визуализации OpenGL. В силу этого более предпочтительным является задание заранее приведенных к единичной длине нормалей. Нормализация нормалей необходима для правильного расчета освещения. Режим автоматической нормализации должен быть включен, если приложением используется преобразования растяжения/сжатия, поскольку в этом случае длина нормалей изменяется при умножении на видовую матрицу.
Операторные скобки Begin/End
void glBegin (GLenum mode); void glEnd (void);
Параметр mode определяет тип примитива, который задается внутри и может принимать следующие значения:
GL_POINTS каждая вершина задает координаты некоторой точки. GL_LINES каждая отдельная пара вершин определяет отрезок; если задано нечетное число вершин, то последняя вершина игнорируется. GL_LINE_STRIP каждая следующая вершина задает отрезок вместе с предыдущей. GL_LINE_LOOP отличие от предыдущего примитива только в том, что последний отрезок определяется последней и первой вершиной, образуя замкнутую ломаную. GL_TRIANGLES каждая отдельная тройка вершин определяет треугольник; если задано не кратное трем число вершин, то последние вершины игнорируются. GL_TRIANGLE_STRIP каждая следующая вершина задает треугольник вместе с двумя предыдущими. GL_TRIANGLE_FAN треугольники задаются первой и каждой следующей парой вершин (пары не пересекаются). GL_QUADS каждая отдельная четверка вершин определяет четырехугольник; если задано не кратное четырем число вершин, то последние вершины игнорируются. GL_QUAD_STRIP четырехугольник с номером n определяется вершинами с номерами 2n-1, 2n, 2n+2, 2n+1. GL_POLYGON последовательно задаются вершины выпуклого многоугольника.
Примечание Использование GL_TRIANGLE_STRIP и GL_TRIANGLE_FAN позволяет повысить производительность приложения.
Например, чтобы нарисовать треугольник с разными цветами в вершинах, достаточно написать: GLfloat BlueCol[3] = {0,0,1};
glBegin(GL_TRIANGLE); glColor3f(1.0, 0.0, 0.0); /* красный */ glVertex3f(0.0, 0.0, 0.0); glColor3ub(0,255,0); /* зеленый */ glVertex3f(1.0, 0.0, 0.0); glColor3fv(BlueCol); /* синий */ glVertex3f(1.0, 1.0, 0.0); glEnd();
Кроме задания самих примитивов можно определить метод их отображения на экране (под примитивами в данном случае понимаются многоугольники). Однако сначала надо определить понятие лицевых и обратных граней. Под гранью понимается одна из сторон многоугольника, и по умолчанию лицевой считается та сторона, вершины которой обходятся против часовой стрелки. Направление обхода вершин лицевых сторон можно изменить вызовом команды
void glFrontFace (GLenum mode)
со значением параметра mode равным GL_CW, а отменить - с GL_CCW. Чтобы изменить метод отображения многоугольника используется команда void glPolygonMode (GLenum face, Glenum mode)
Параметр mode определяет, как будут отображаться многоугольники, а параметр face устанавливает тип многоугольников, к которым будет применяться эта команда и может принимать следующие значения:
GL_FRONT для лицевых граней GL_BACK для обратных граней GL_FRONT_AND_BACK для всех граней
Параметр mode может быть равен:
GL_POINT при таком режиме будут отображаться только вершины многоугольников.
GL_LINE при таком режиме многоугольник будет представляться набором отрезков. GL_FILL при таком режиме многоугольники будут закрашиваться текущим цветом с учетом освещения, и этот режим установлен по умолчанию.
Кроме того, можно указывать, какой тип граней отображать на экране. Для этого сначала надо установить соответствующий режим вызовом команды glEnable (GL_CULL_FACE), а затем выбрать тип отображаемых граней с помощью команды
void glCullFace (GLenum mode)
Вызов с параметром GL_FRONT приводит к удалению из изображения всех лицевых граней, а с параметром GL_BACK - обратных (установка по умолчанию).
Кроме рассмотренных стандартных примитивов в библиотеках GLU и GLUT описаны более сложные фигуры, такие как сфера, цилиндр, диск (в GLU) и сфера, куб, конус, тор, тетраэдр, додекаэдр, икосаэдр, октаэдр и чайник (в GLUT). Автоматическое наложение текстуры предусмотрено только для фигур из библиотеки GLU (создание текстур в OpenGL будет рассматриваться ниже). Например, чтобы нарисовать сферу или цилиндр, надо сначала создать объект специального типа GLUquadricObj с помощью команды
GLUquadricObj* gluNewQuadric(void);
а затем вызвать соответствующую команду:
void gluSphere (GLUquadricObj * qobj, GLdouble radius, GLint slices, GLint stacks)
void gluCylinder (GLUquadricObj * qobj,GLdouble baseRadius,GLdouble topRadius, GLdouble height, GLint slices, GLint stacks)
где параметр slices задает число разбиений вокруг оси z, а stacks – вдоль оси z. Примечание Более подробную информацию об этих и других командах построения примитивов можно найти в приложении. Для корректного построения перечисленных примитивов необходимо удалять невидимые линии и поверхности, для чего надо включить соответствующий режим вызовом команды glEnable(GL_DEPTH_TEST). Массивы вершин
void glVertexPointer (GLint size, GLenum type, GLsizei stride, void *ptr)
которая определяет способ хранения и координаты вершин. При этом size определяет число координат вершины (может быть равен 2, 3, 4), type определяет тип данных (может быть равен GL_SHORT, GL_INT, GL_FLOAT, GL_DOUBLE). Иногда удобно хранить в одном массиве другие атрибуты вершины, и тогда параметр stride задает смещение от координат одной вершины до координат следующей; если stride равен нулю, это значит, что координаты расположены последовательно. В параметре ptr указывается адрес, где находятся данные. Аналогично можно определить массив нормалей, цветов и некоторых других атрибутов вершины, используя команды
void NormalPointer ( GLenum type, GLsizei stride, void *pointer ) void ColorPointer ( GLint size, GLenum type, GLsizei stride, void *pointer )
Для того, чтобы эти массивы можно было использовать в дальнейшем, надо вызвать команду
void glEnableClientState (GLenum array)
с параметрами GL_VERTEX_ARRAY, GL_NORMAL_ARRAY, GL_COLOR_ARRAY соответственно. После окончания работы с массивом желательно вызвать команду
void glDisableClientState (GLenum array)
с соответствующим значением параметра array. Для отображения содержимого массивов используется команда
void glArrayElement (GLint index)
которая передает OpenGL атрибуты вершины, используя элементы массива с номером index. Это аналогично последовательному применению команд вида glColor..(…), glNormal..(…), glVertex..(…) c соответствующими параметрами. Однако вместо нее обычно вызывается команда
void glDrawArrays (GLenum mode, GLint first, GLsizei count)
рисующая count примитивов, определяемых параметром mode, используя элементы из массивов с индексами от first до first+count-1. Это эквивалентно вызову команды glArrayElement() с соответствующими индексами. В случае если одна вершина входит в несколько примитивов, то вместо дублирования ее координат в массиве удобно использовать ее индекс. Для этого надо вызвать команду
void glDrawArrays (GLenum mode, GLsizei count, GLenum type, void *indices)
где indices – это массив номеров вершин, которые надо использовать для построения примитивов, type определяет тип элементов этого массива: GL_UNSIGNED_BYTE, GL_UNSIGNED_SHORT, GL_UNSIGNED_INT, а count задает их количество. Примечание Использование массивов вершин позволяет повысить скорость визуализации трехмерной сцены Списки отображения
void glNewList (GLuint list, GLenum mode) void glEndList ()
Для различения списков используются целые положительные числа, задаваемые при создании списка значением параметра list, а параметр mode определяет режим обработки команд, входящих в список:
GL_COMPILE команды записываются в список без выполнения GL_COMPILE_AND_EXECUTE команды сначала выполняются, а затем записываются в список После того, как список создан, его можно вызвать командой
void glCallList (GLuint list)
указав в параметре list идентификатор нужного списка. Чтобы вызвать сразу несколько списков, можно воспользоваться командой
void glCallLists (GLsizei n, GLenum type, const GLvoid *lists)
вызывающей n списков с идентификаторами из массива lists, тип элементов которого указывается в параметре type. Это могут быть типы GL_BYTE, GL_UNSIGNED_BYTE, GL_SHORT, GL_INT, GL_UNSIGNED_INT и некоторые другие. Для удаления списков используется команда
void glDeleteLists (GLint list, GLsizei range)
которая удаляет списки с идентификаторами ID из диапазона list <=
ID <= list+range-1.
|
http://subscribe.ru/
E-mail: ask@subscribe.ru |
Отписаться
Убрать рекламу |
В избранное | ||