В Microsoft реализации OpenGL есть возможность использовать оба подхода преобразованием стандартных символов TrueType шрифтов в битовые изображения и геометрические модели с помощью функций wglUseFontBitmaps и wglUseFontOutlines. Результат преобразования сохраняется в виде списков отображений. Стоит заметить, что на слабых компьютерах преобразование всех символов шрифта может занять значительное время. В функции-члене font класса GLmain показано, как создать зти шрифты.
/*
Демонстрация трехмерного текста.
Для активации управления камерой нажмите ESC.
*/
GLobj cam; // камера
string text; // отображаемая строка void example_init()
{
gl.set(5) ;
glClearColor(l,1,1,1); glEnable(GL_DEPTH_TEST); glListBase ( 1); gl.fontO; // создаем шрифт text="Hello world!"; cam.position(0,5,-25);
// компилируем тестовую сцену в список Models m; m.scenel(257);
}
void example_deinit()
{
glDeleteLists(1,256); gl.deinit();
}
void draw() // вывод сцены {
// обработка ввода cam.input(&in);
// очищение буфера кадра
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT) ; glLoadldentity(); cam.transform() ;
glCallList(257); // вывод сцены // масштабируем и позиционируем текст glScalef(3,3,3); glTranslatef(0,10, - 50) ;
// цвет текста glColor3f(l,0.5,0);
// вывод строки // сохранение свойств полигонов glPushAttrib(GL_POLYGON_BIT) ; glCallLists(text.size(),GL_UNSIGNED_BYTE, text.c_str()); glPopAttrib() ;
}
Режимы выбора и обратной связи
OpenGL поддерживает два дополнительных режима вывода, при которых не происходит формирования изображения. Вместо этого в указанный буфер заносится информация о выводимом изображении. Так, в режиме выбора для каждого именованного объекта, попадающего в объем видимости, в буфер выбора добавляется запись: содержимое стека имен.
glRenderMode (GL_SELECT); // переход в режим выбора gllnitNames(); // инициализация стека имен glPushName(0); // помещаем имя 0 на вершину стека … // вывод А
glPushName(1); // помещаем имя 1 на вершину стека … // вывод В
Из вышеприведенного кода понятно, что в данном случае именованным объектом является группа команд вывода под одним именем, находящемся на вершине стека имен.
Такая информация имеет широкое применение. Определив небольшую область видимости вокруг курсора мыши при нажатии клавиши, можно узнать, какой объект был выбран мышью. Опре делив область видимости вокруг объекта, можно определить, пересекается ли он с другим объектом. Если в сцене множество объектов, то их полезно сгруппировать по контейнерам. В качестве контейнера обычно выбирается простой объект - куб. В режиме выбора отобрать контейнерные объекты, попадающие в область видимости, а затем в обычном режиме вывести объекты, в них содержащиеся.
Режим обратной связи по своей сути аналогичен режиму выбора, но предоставляет более детальную информацию на уровне вершин.
/*
Демонстрация режима выбора и Функций gluPickMatrix, glönProject.
*/
// контрольные точки кривой Безье
double pt [12] ={-10, 10, 0, -5, 5, 0, 0, 0, 0, 10, -10, 0} ;
// цвет контрольных точек float с[12]={0,0,1,0,0,1,0,0,1,0,0,1}; int activept=0; // активная точка int select_mode=0;