Как отмечалось в разделе 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 ( );


⇐ вернуться назад | | далее ⇒