Как отмечалось в разделе 6.4, прямоугольное поле просмотра определяется следующей функцией OpenGL.
glViewport (xvmin, yvmin, vpWidth, vpHeight); Первые два параметра этой функции задают точку экрана с целочисленными координатами, которая является левым нижним углом поля просмотра относительно левого нижнего угла окна экрана. Последние два параметра задают целочисленную ширину и высоту поля просмотра. Чтобы сохранить пропорции объектов на сцене, характеристическое отношение поля просмотра задается равным характеристическому отношению отсекающего окна.
Создание окон на экране и работа с ними выполняется с помощью процедур GLUT; подробно различные функции работы с окнами из библиотеки GLUT рассмотрены в разделе 6.4. Поле просмотра по умолчанию имеет такие же размеры и положение, что и текущее окно на экране.
ПРИМЕР ПРОГРАММЫ ТРЕХМЕРНОГО НАБЛЮДЕНИЯ OpenGL
Ниже приводится пример программы, выводящей на экран перспективную проекцию квадрата, как показано на рис. 7.55. Квадрат определен на плоскости ху, и начало системы наблюдения выбирается так, чтобы передняя грань наблюдалась под углом. Далее с помощью функции glFrustum получаем перспективную проекцию, выбрав центр квадрата в качестве точки взгляда. Если переместить начало координат системы наблюдения на другую сторону многоугольника, задняя грань будет отображаться как каркасный объект.
♦include <GL/glut.h>
GLint winWidth = 600, winHeight = 600;
/* Исходный размер окна на экране. */
GLfloat хО = 100.0, уО =50.0, z0 = 50.0;
/* Начало координат системы наблюдения. */
GLfloat xref = 50.0, yref = 50.0, zref =0.0; // Точка взгляда. GLfloat Vx = 0.0, Vy = 1.0, Vz = 0.0; // Вектор верха.
/* Задаются координатные границы отсекающего окна: */
GLfloat xwMin = -40.0, ywMin = -60.0, xwMax = 40.0,
ywMax = 60.0;
/* Задается положение ближней и дальней отсекающих плоскостей: */
GLfloat dnear = 25.0, dfar = 125.0;
void init (void)
{
glClearColor (1.0, 1.0, 1.0, 0.0); glMatrixMode (GL_MODELVIEW);
gluLookAt (xO, yO, zO, xref, yref, zref, Vx, Vy, Vz); glMatrixMode (GL_PROJECTION);
glFrustum (xwMin, xwMax, ywMin, ywMax, dnear, dfar);
}
void displayFcn (void)
{
glClear (GL_COLOR_BUFFER_BIT);
/* Задаются параметры квадратной закрашенной области. */ glColor3f (0.0, 1.0, 0.0);
/* Квадрат будет закрашен зеленым цветом. */ glPolygonMode (GL_FRONT, GL_FILL);
glPolygonMode (GL_BACK, GL_LINE); // Каркасная задняя грань. glBegin (GL_QUADS);
glVertex3f (0.0, 0.0, 0.0); glVertex3f (100.0, 0.0, 0.0); glVertex3f (100.0, 100.0, 0.0); glVertex3f (0.0, 100.0, 0.0); glEnd ( ); glFlush ( );
)
void reshapeFcn (GLint newWidth, GLint newHeight)
{
glViewport (0, 0, newWidth, newHeight); winWidth = newWidth; winHeight = newHeight;
}
void main (int argc, char** argv)
{
glutlnit (&argc, argv);
glutlnitDisplayMode (GLUT_SINGLE | GLUT_RGB); glutlnitWindowPosition (50, 50); glutlnitWindowSize (winWidth, winHeight); glutCreateWindow ("Перспективная проекция квадрата");
init ( ) ;
glutDisplayFunc (displayFcn); glutReshapeFunc (reshapeFcn); glutMainLoop ( );