В этой главе нас ждет еще один пример с использованием эффекта зеркального отражения, так что мы не прощаемся с этой темой окончательно.
Закончу раздел примером, в котором хотя и эмулируется зеркало, однако непосредственно эффекта отражения не создается. Если вы хотите сделать подарок своей девушке то закажите для неё букет тут: http://www.rostov-flowers.ru/Bukets.aspx.
Откройте проект из подкаталога Ех75. После запуска откомпилированного модуля на экране появляется следующая картина: по кругу, в центре которого находится глаз наблюдателя, вращаются четыре цветных кубика. В верхней части экрана располагается прямоугольник, в котором как в зеркальце заднего вида отражается кубик, находящийся за спиной наблюдателя (рис. 4.49).
Для зеркальца на экране создается вырезка, точка зрения наблюдателя разворачивается на 180 градусов, и сцена воспроизводится второй раз:
// обычная точка зрения
glViewport(О, О, ClientWidth, ClientHeight); glMatrixMode(GL_PR0JECTION); glLoadldenti ty;
gluPerspective(45.0, Clientwidth / ClientHeight, 0.1, 100.0);
glMatrixMode (GL_MODELVIEW) ;
giLoadidentity;
gluLookAt(0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0); glClear (GL_COLOR_BUFFER_BIT or GL_DEPTH_B0FFER_BIT) ; tl воспроизводим систему из четырех кубиков glPushMatrix;
glRotatef(Angle, 0.0, 1.0, 0.0);
glCallList(1). glPopMatrix;
11 точка зрения для зеркальца
glDisable (GL_LIGHTING); // чтобы линии не стали серыми glviewport (Clientwidth shr 2, ClientHeight-(ClientHeight shr 2),
Clientwidth shr 1, ClientHeight shr 3); glEnable (GL_SCISSOR_TEST) ; // вырезка для зеркальца
giscissor (Clientwidth shr 2, ClientHeight-(ClientHeight shr 2),
Clientwidth shr 1, ClientHeight shr 3); jlClear (GL_COLOR_BUFFER_BIT or GL_DEPTH_BOFFER_BIT) ; glMatrixMode (GL_MODELVIEW) ; giLoadidentity; glMatrixMode
glOrtho(-1.001, 1.001, -1.001, 1.001, -1.001, 1.0D1); / / белая рамочка вокруг зеркальца , glColor3f(1.0, 1.0, 1.0); glBegin (GL__LINE_LCOP);
glVertex3i(-1, 1, 1);
glvertex3i( 1, 1, 1);
glVertex3i( 1,-1, 1);
glVertex3i(-1,-1, 1); glEnd;
11 вид внутри зеркальца giLoadidentity;
(Clientwidth shr 1) / (ClientHeight shr 3); о (ClientHeight shr 31/ (Clientwidth shr 1); gluPerspective(45.0*b, a, 0.1, 100.0); '/ разворачиваемся на 160 градусов glMatrixMode (GL_M0DELVIEW) ; giLoadidentity,
gluLookAtl 0.0, 0.0,-1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0); glEnable (GLLIGHTING),
glScalef (-1.0, 1,0, 1.0); // важно — эмулируем зеркало / разворачиваем нормали кубиков, так эффектнее glFrontFace (GL_CW) ; glPushMatrix;
|