/*
Демонстрация IFS фракталов.
Для активации управления камерой нажмите ESC.
*/
GLobj cam;
IFS ifs; int fig=l; int maxfig=7;
void example_init()
{
gl.set (5);
// дракон Хартера-Хейтуэя ifs.dragon(); glNewList(1,GL_COMPILE); ifs.draw(); glEndList();
// кривая Коха ifs.koh();
glNewList(2,GL_COMPILE); ifs.draw(); glEndList();
// лист папоротника ifs.fern();
glNewList(3,GL_COMPILE) ; ifs.draw(); glEndList() ;
// лист ifs.leaf ();
glNewList(4,GL_COMPILE) ; ifs.draw(); glEndList () ;
// дерево ifs.tree () ;
glNewList(5,GL_COMPILE) ; ifs.draw(); glEndList() ;
// приведение ifs.ghost () ;
glNewList(6, GL_COMPILE) ; i fs.draw(); glEndList() ;
}
void example_deinit()
{
gl.deinit();
}
// обработка ввода void input()
{
cam.input(&in); switch(in.vkey)
{
// отображаем следующий фрактал case VK_ADD: fig++;
fig%=maxfig; fig= (fig)?fig:1; break;
// отображаем предьщущий фрактал case VK_SUBTRACT: fig--;
fig=(fig)? fig:maxfig-1 ; break; default:;
}
in.vkey=-l;
}
void draw() // вывод сцены {
input();
glLoadldentity();
cam.transform();
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(0,1,0);
glCallList(fig);
glEnd();
}
Сцена В примерах этой книги использовался оконный режим. Но в некоторых ситуациях полноэкранный режим предпочтительней. Также бывает полезно сменить текущее разрешение экрана. Все это решается средствами платформы, на которой работает OpenGL. Для смены разрешения нужно заполнить поля структуры DEVMODE и вызвать функцию ChangeDisplaySettings.
DEVMODE scrset;
// можно добавить сохранение позиции и размера окна // заполняем структуру нулями memset(bscrset,0,sizeof(scrset)) ;
scrset.dmSize=sizeof(scrset); // размер структуры // желаемое разрешение по горизонтали scrset.dmPelsWidth=64 0;
// желаемое разрешение по вертикали scrset.dmPelsHeight=4 8 0;
scrset.dmBitsPerPel=32; // количество бит на пиксель // на старых мониторах будьте осторожны с частотой scrset.dmDisplayFrequency=85; scrset.dmFields=DM_BITSPERPELIDM_PELSWIDTH|
DM_PELSHEIGHT|DM_DISPLAYFREQUENCY; ChangeDisplaySettings(iscrset, CDS_FULLSCREEN); Полноэкранный режим имитируется всплывающим окном имеющего размеры экрана. Можно создать новое OpenGL окно со стилем WS_POPUP или изменить стиль функцией SetWindowLong.
Если вы разрабатываете собственный редактор моделей, предусмотрите следующие возможности: движение контура вдоль некоторой кривой, составление объекта из набора базовых моделей, зеркальное отражение объекта.
В сложных динамических сценах встает вопрос о скорости вывода. Правильное использование функций OpenGL может сильно повысить производительность. Кратко перечислим основные моменты.
Для вывода объектов старайтесь использовать списки отображения и массивы OpenGL.
По возможности отключайте обработку освещения, наложения текстур и смешивания цветов.
Старайтесь выводить только те объекты, которые действительно попадают в поле видимости камеры. Обычно для этого вся сцена разбивается на более маленькие трехмерные сегменты. После этого можно воспользоваться режимом выбора и такими технологиями, как BSP деревья и порталы.
По умолчанию OpenGL обрабатывает обе грани многоугольника. Но при выводе таких замкнутых моделей, как сфера или куб, это ни к чему.