}
void drawScene ( HDC hDC, int angle ) {
GLfloat blue Q = { 0.0, 0.0, 1.0, 1.0 }; GLfloat yellow [] = {1.0, 1.0, 0.0, 1.0 };
glClear ( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
gIMatrixMode (GLJVIODELVIEW ); gILoadldentity (); gITranslatef ( 0.0, 0.0, -64.0 ); gIRotatef ( 30.0, 1.0,0.0,0.0 ); gIRotatef (30.0, 0.0, 1.0, 0.0 );
// draw the block anchoring the arm gIMaterialfv ( GL_FRONT, GL_AMBIENT_AND„DIFFUSE, yellow ); drawBox (1.0, 3.0, -2.0, 2.0, -2.0, 2.0 ); drawBox (-3.0, -1.0, -2.0, 2.0, -2.0, 2.0 );
// rotate the coordinate system and draw the arm's base member gIMaterialfv ( GL_FRONT, GL_AMBIENT_AND_DIFFUSE, blue ); gIRotatef ((GLfloat) angle, 1.0, 0.0, 0.0 ); drawBox (-1.0, 1.0, -1.0, 1.0, -5.0, 5.0 );
// translate the coordinate system to the end of base member, rotate it,
// and draw the second member gITranslatef ( 0.0, 0.0, -5.0 ); gIRotatef (-(GLfloat) angle / 2.0, 1.0, 0.0, 0.0 ); drawBox (-1.0, 1.0, -1.0, 1.0, -10.0, 0.0 );
// translate and rotate coordinate
// system again and draw arm's third member gITranslatef ( 0.0, 0.0,-5.0 ); gIRotatef (-(GLfloat) angle / 2.0, 1.0, 0.0, 0.0 ); drawBox (-1.0, 1.0, -1.0, 1.0, -10.0, 0.0 );
gIFIush (); // render the scene to pixel buffer
}
При помощи OpenGL можно создавать анимации. При этом для изображения используется режим работы с двумя буферами, когда содержимое одного из них показывается, а в другом осуществляется построение. После окончания построения специальная команда меняет буферы местами (по аналогии с двухстраничным режимом работы). Приводимая программа для Windows строит анимацию движения руки робота. Обратите внимание на использование флага PFD_DOUBLE_BUFFER при задании формата пикселов и команду SwapBuffers, меняющую буферы местами (по умолчанию вывод происходит в невидимый буфер).
Компьютерная графика. Полигональные модели
Kl // File arm2.cpp
#include <windows.h> #include <gl\gl.h> #include <gl\glu.h>
LONG WINAPI wndProc ( HWND, UINT, WPARAM, LP ARAM ); void r setDCPixelFormat ( HDC ); void initializeRC ();