Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

книги / C++Builder. ╨г╤З╨╡╨▒╨╜╤Л╨╣ ╨║╤Г╤А╤Б

.pdf
Скачиваний:
0
Добавлен:
12.11.2023
Размер:
9.63 Mб
Скачать

Рис. 11.4. Каркасная модель куба

Получившаяся картинка иллюстрирует важную вещь: исполь­ зование команды g lF ru stu m приводит к созданию перспектив­ ной проекции. Хорошо видно, что ребра куба не параллельны друг другу и имеют точку схода где-то на горизонте.

11.4.1.2. Использование функции glOrtho

Для задания ортографической (параллельной) проекции ис­ пользуется функция g lO r th o . Аргументы этой функции имеют точно такой же смысл, что и у функции g l Frustum , но последние два аргумента могут иметь отрицательное значение.

Пример 11.11

- В обработчике событий O n R e s i z e программы предыдуще­ го раздела задайте видовые параметры с помощью следующей ко­ манды:

g l O r t h o ( - 2 , 2, -2, 2, 0, 1 5 . 0 ) ;

Результат работы программы показан на рис. 11.5.

Рис. 11.6.ИспользованиефункцииgluOrtho2D

Пример 11.12

Обработчик события O nR esize программы имеет следую­ щий вид:

void _fastcall TForml::FormResize (TObject ^Sender)

{

glViewport (0, 0# ClientWidth, ClientHeight);

glLoadldentity();

2);

// задаем перспективу

gluOrtho2D(-2, 2, -2 ,

// поворот объекта

ось X

glRotatef (30.0, 1.0,

0.0,

0.0);

// поворот объекта

ось Y

glRotatef (60.0, 0.0,

1.0,

0.0);

InvalidateRect(Handle, NULL, false) ;

}

Обратите внимание, что здесь отсутствует начальный сдвиг по оси Z. Куб рисуется вокруг глаза наблюдателя и проецируется на плоскость экрана. Согласно установкам этой команды передняя и задняя части нашего куба частично обрезаются.

11.4.1.4.Использование функции gluPerspective

Иногда для задания перспективного преобразования (рис. 11.7) удобнее воспользоваться следующей процедурой из библиотеки утилит OpenGL

void gluPerspective(GLdouble AngleY, GLdouble Aspect, GLdouble Near, GLdouble Far);

Эта процедура создает матрицу для задания симметричного поля зрения и умножает текущую матрицу на нее.

far

Рис. 11.7. К использованию команды g lu P e rs p e c tiv e

Здесь A ngleY - угол зрения камеры в плоскости OXZ, лежа­ щий в диапазоне [ 0 ,1 8 0 ] . Параметр A s p e c t - отношение ши­ рины области к ее высоте, N e a r и F a r - расстояния вдоль отрица­ тельного направления оси Z, определяющие ближнюю и дальнюю плоскости отсечения.

Команда g l u P e r s p e c t i v e , пожалуй, наиболее популярна в плане использования для первоначального задания видовых пара­ метров. Команда, как ясно из ее названия, также находится в биб­ лиотеке g l u . Смысл аргументов команды поясняется в коммента­ риях следующего примера. Как правило, в качестве значения вто­ рого аргумента команды g l u P e r s p e c t i v e , так называемого аспекта, задают отношение ширины и высоты области вывода.

Измените эту программу следующим образом:

- Объявите в файле реализации модуля глобальные перемен­

ные:

G L f l o a t

A s p e c t , AngleY ;

- В

обработчике события O n C re a te формы задайте началь­

ные значения переменным.

- В

обработчике события O n R e s iz e вызов функции

g l u P e r s p e c t i v e будет иметь следующий вид:

g l u P e r s p e c t i v e ( A n g l e Y , A s p e c t , 1 . 0 , 1 5 . 0 ) ;

- Создайте обработчик события OnKeyDown формы.

void __fastcall T F o r m l : : FormKeyDown(TObject * S e n d e r , WORD &Key, T S h i f t S t a t e S h i f t )

{

if

(Key

==

VK_ESCAPE) C l o s e ( ) ;

if

(Key

==

VK_DOWN)

{

 

AngleY

-= 0 . 1 ;

 

F orm R e size(N U L L );

}

 

 

if

(Key

== VK_UP)

{

 

 

AngleY

+= 0 . 1 ;

 

F orm R e size(N U L L );

}

 

 

if

(Key

== VK_RIGHT)

{

A s p e c t -= 0 . 1 ;

F orm R e size(N U L L );

}

if (Key == VK_LEFT)

{

A s p e c t += 0 . 1 ;

F orm R esize(N U L L );

}

}

нат. Командой g l u L o o k A t удобно пользоваться при перемещени­ ях точки зрения в пространстве.

При задании параметров вида можно ограничиться миниму­ мом команд, например:

Пример 11.14

v o id __f a s t c a l l T F o r m l : : F o r m R e s i z e ( T O b j e c t *S ender)

{

g l L o a d l d e n t i t y ( ) ;

g l u P e r s p e c t i v e ( 5 0 . 0 ,

d o u b l e ( C l i e n t W i d t h / C l i e n t H e i g h t ,

2 . 0 ,

1 0 . 0 )

;

 

 

glu L o o k A t

( 3 . 2

, 2, 2 . 5 ,

0 . 4 ,

0 . 5 , 0 . 5 , 0, 0, 1 ) ;

I n v a l i d a t e R e c t ( H a n d l e ,

NULL,

f a l s e ) ;

}

Обратите внимание, что, как подчеркивается в документации, вектор «ир» не должен быть параллельным линии, соединяющей точку зрения и контрольную точку.

11.4.2.Матрицы OpenGL

ВOpenGL имеется несколько важных матриц. Матрица мо­ дели связана с координатами объектов. Она используется для того, чтобы в пространстве построить картину как бы видимую глазу наблюдателя. Другая матрица, матрица проекций, связана с по­ строением проекций пространственных объектов на плоскость. Для корректного вывода пространственных фигур параметры вида задаются при установленной матрице проекции, после чего необ­ ходимо переключиться в пространство модели. То есть обычная последовательность здесь, например, такая:

g lV ie w p o r t(0, 0, C lie n tW id th , C l i e n t H e i g h t ) ; glMatixMode(GL_PROJECTION);

g l L o a d l d e n t i t y ();

g lF r u s tu m (-1 , 1, -1 , 1, 3, 1 0 ); glM atrixM ode (GL__MODELVIEW) ;

g l L o a d l d e n t i t y ();

При написании программ с использованием OpenGL обычно используют два подхода.

- Параметры вида помещаются в обработчике изменения раз­ меров окна. Стартовые сдвиги и повороты обычно располагаются здесь же, а код воспроизведения сцены заключается между коман­ дами g l P u s h M a t r i x и g lP o p M a trix .

- Иногда поступают иначе: код воспроизведения начинается с g l L o a d l d e n t i t y , а далее идут стартовые трансформации и соб­ ственно код сцены.

Команда g l L o a d l d e n t i t y заменяет текущую матрицу еди­ ничной матрицей (с единицами по диагонали и равными нулю всеми остальными элементами). Это является частным случаем более универсальной команды g lL o a d M a trix , предназначенной для замены текущей матрицы на заданную, имя которой передает­ ся в качестве аргумента.

11.4.3. Буфер глубины

При создании контекста воспроизведения в число параметров формата пикселов входят размеры разделов памяти, предоставляе­ мой для нужд OpenGL, или буферов. Помимо буферов кадра, в OpenGL присутствуют еще три буфера: буфер глубины, буфер трафарета и вспомогательный буфер. Для специальных нужд мо­ гут использоваться еще буфер выбора и буфер обратной связи, они подготавливаются пользователем по мере надобности.

Буфер глубины используется для передачи пространства. При воспроизведении каждого пиксела в этот буфер записывается ин­ формация о значении координаты Z пиксела, так называемая оконная Z. Если на пиксел приходится несколько точек, на экран будет выводиться точка с наименьшим значением этой координа­ ты. При пространственных построениях отказ от использования буфера глубины приводит к неверной передаче пространства.

Для использования буфера глубины необходимо:

Соседние файлы в папке книги