Шаг 38 - Quadric-и

По своей идее OpenGL является базовым уровнем. Как и вокруг любого API вокруг неё существует большое количество различных оболочек для упрощения жизни, начиная от самых простых, типа GLU и заканчивая объектной надстройкой Open Invertor (SGI), которая к сожалению не является свободно распространяемой. Библиотека GLU входит в стандартную поставку OpenGL и потому ей грех не воспользоваться.

Библиотека имеет целый ряд интересных функций, но на мой взгляд наиболее привлекательное свойство - quadric объекты. Резонный вопрос - что это такое? Ответ прост как и сами объекты - это геометрические фигуры 2-го порядка, т.е. сфера, цилиндр, диск, конус. Рассмотрим пример создания и использования quadric объекта на сфере, остальные примитивы вы сможете попробовать сами.

Итак, классика, создаем проект. Выбросили оттуда все старые вставки. Добавили в stdafx.h

#include <GL/glu.h> //(если вы еще не сделали этого раньше)

Теперь объявляем переменную класса C...View:

private:
	GLUquadricObj* m_qObj;

Переходим в конструктор класса и инициализируем её:

CExampleView::CExampleView()
{
	// TODO: add construction code here
	m_qObj = gluNewQuadric();
}

Функция gluNewQuadric создает новый объект нужного нам типа (в реальности просто создается указатель на пустую структуру).

Теперь мы можем воспользовать этим указателем и создать нужный нам объект:

void CExampleView::OnDraw(CDC* pDC)
{
	CExampleDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);

	// TODO: add draw code for native data here
	glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

	glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);

	glColor3f(0.0f, 0.5f, 0.5f);
	gluSphere(m_qObj, 1.0f, 10, 10);

	SwapBuffers(pDC->m_hDC);
}

Функция gluSphere принимает 4 аргумента, 1-й - это указатель на Quadric объект, 2-й - радиус сферы, 3-й и 4-й - количество узлов, из которых будет строится сфера вокруг оси Z и вдоль оси Z соответственно.

Должно быть не совсем понятно, но попробуйте просто поменять число 10 на 100 и почувствуйте разницу.

Ну и последнее, все Quadric объекты должны быть удалены после работы.

CExampleView::~CExampleView()
{
	gluDeleteQuadric(m_qObj);
}

Здесь есть одна хитрость. При желании вы можете поставить команду удаления объекта до его использования и при этом все будет работать!!! Этого делать не рекомендуется, т.к. при этом все равно объект отрисуется неправильно. Как выглядит эта "неправильность" - посмотрите сами.

Так же можно попробовать использовать один объект для создания сферы, цилиндра и еще чего-нибудь... но при этом я не гарантирую, что у вас не будет теряться память. Ведь объект представляет собой набор вершин. Что будет если свера имела 1000 узлов, а цилиндр 100? После "перехода" объекта от сферы к цилиндру возможна потеря памяти, необходимой для хранения как минимум 900 вершин. Возможно, что она и не будет теряться, если функция создания новой фигуры проверяет занятость объекта, корректно все удаляет, а потом создает новую фигуру.

К сожалению документация по GLU умалчивает об этом. Поэтому надежнее всего будет создавать объекты для каждой фигуры и удалять их тогда, когда они уже не нужны.


Загрузить проект | Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Kirill V. Ratkin - 31.05.2000