По своей идее 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 умалчивает об этом. Поэтому надежнее всего будет создавать объекты для каждой фигуры и удалять их тогда, когда они уже не нужны.