М. Ву, Т. Девис, Дж. Нейдер, Д. Шрайнер - OpenGL. Руководство по программированию (Библиотека программиста) (2006) (1124363), страница 28
Текст из файла (страница 28)
По умолчанию начальными значениями окна про- смотра являются (О, О, тп Игк(ЬР, гя(пНегйЬР), где Ып ЮЫЬР и Рог пНеРйЬ( — разме- ры экранного окна. Ф Фф Недеформированное Деформированное Рнс. 3.12. Отображение видимого объема в окно просмотра На рис. 3.17 для левой части проецирование квадратного изображения на квад- ратное окно просмотра было произведено следующим набором команд; 41чРеглрест(че((ачу, 1.9, пеаг, Раг); 4Ш(енрог(9, О, 400, 409); Алла правой части окно приведено к неравносторонней прялюугольной области просмотра, но проекция осталась неизменной. Изображение получается сжатым яо оси х: 11еРегерест гче (Речу, 1. 9, пеаг, Раг); е1у~енрогт(9, О, 400, 200); Для устранения несоответствия нужно принести аспектное отношение в соответ- ствие с областью просмотра; 41чРегересс(че((очу, 2.0, пеаг, (аг); 4(Ч(енрогс(9.
О, 499, 2ОО); Асвектное отношение (ширины к высоте) для окна просмотра обычно совпадает с таковым для видимого объема. Иначе проецируемое в окно просмотра изображение будет деформировано (рис. 3.17). Помните, что последующие изменения римера экранного окна сами собой не затрагивают область просмотра. Приложение должно реагировать на эти изменения, соответственно подстраивая окно просмотра. 126 Глава 3 е Визуализация Упражнение Измените приведенную программу таким образом, чтобы объект рисовался дважды, в разных окнах просмотра. Можете нарисовать объект с различными преобразованиями проецирования и/или вида для каждого окна просмотра.
Чтобы создать два смежных окна просмотра, используйте команды, приведенные ниже, вместе с соответствующими командами модельно-видовых преобразований и преобразований проекции: в(Ч1енрог((0. О, змеек/2, з)веу); Х)Ч)енроге(з!тех/2, О. з1зех/2, зътеу); Измененная координата глубины Координата глубины (г) преобразуется при вписывании в окно просмотра (и после этого сохраняется в буфере глубины). Ее значение можно масштабировать для того, чтобы опо попало в требуемый диапазон, с помощью функции к(Пер СП- калке (). (Буфер глубины и использование координаты глубины обсуждаются в главе 10.) В отличие от оконных координат х и у, оконная координата г, которой оперирует ОрепС1, всегда принимает значения в диапазоне от 0.0 до 1.0.
чоЫ 810ертвяапбе(СЕс!ап)рс( пеаг, СЕс!а)пр(( уаг); Определяет преобразование для координаты д происходящее во время отображения на окно просмотра. Аргументы пеаг и /аг представляют минимальное и максимальное значения, которые могут быть сохранены в буфере глубины. По умолчанию они равны, соответственно, 0.0 и 1.0. Эти значения принудительно ограничиваются интервалом (О, 1]. В перспективной проекции измененная координата глубины (как и координаты х и у) подвергается перспективному делению по координате вс Чем дальше измененная координата глубины от ближней плоскости отсечения, тем менее точно ее местоположение (рис. 3.18). Ьхмхх „оооо охво ,Еов Рис.
3.28. Перспективная проекция и изменение координат глубины Проблемы преобразований 127 Таким образом, перспективное деление влияет на точность операций, которые опираются на измененную координату глубины, и особенно на буферизацию по глубине, используемую для удаления невидимых поверхностей. Проблемы преобразований Фотографу несложно ориентировать камеру в правильном направлении, но в компьютерной графике положение и направление выражаются через углы и ко- ординаты. Не составляет труда, и мы можем зто засвидетельствовать, получить известный эффект черного экрана.
Хотя есть множество других причин для ошибки, чаще всего этот эффект, то есть отсутствие чего бы то ни было на экране, проистекает из-за неправильного позиционирования «камеры», когда модель вы- яадает из поля зрения. Похожая проблема имеет место, если не выбрано поле зре- вяя, являющееся достаточно широким, чтобы увидеть объекты целиком, и доста- точно узким, чтобы объекты были визуально различимы.
Если настойчивость черного экрана превосходит все ваши усилия, попробуйте решить проблему с помощью следуюгпих действий: 1. Проверьте очевидные вещи. Удостоверьтесь, включена лн ваша система. На всякий случай взгляните, не рисуете ли вы цветом, совпадающим с цветом очистки экрана. Проверьте, правильно ли включены/выключены все нужные режимы (такие как освещение, текстурирование, альфа-смешивание, логические операции или устранение ступенчатости), 3. Помните, что в командах проецирования координаты ближней и дальней плоскостей означают расстояние от точки наблюдения и (по умолчанию) линия взгляда направлена вдоль оси г. Таким образом, если расстояние до ближней плоскости равно 1.0, а до далъней — З.О, координаты г видимых объектов должны быть в интервале от — 1.0 до — 3.0.
Для того чтобы убедиться, что вы не отсекаете все объекты в сцене, временно установите отступы для ближней и дальней плоскостей отсечения в какие-либо не имеющие смысла значения, например 0.001 и 1 000 000.0. Это изменит результат таких операций, как буферизация по глубине и туман, но позволит отобразить непреднамеренно отсеченные объекты. 3. Оцените, где находится точка обзора, в каком направлении вы смотрите и где располагаются объекты.
Так проще получить реальное трехмерное пространство — используйте, например, руки, чтобы вообразить этн вещи. 1. Убедитесь, что вы знаете, вокруг чего вращаетесь. Вы можете считать, что вы поворачиваетесь вокруг произвольной точки, хотя вернулись назад к началу координат. Кружение вокруг любой точки — это нормально, но только если не ожидать такого поворота событий.
5. Проверьте ориентацию. Используйте функцию к1оеоокд11) для нацеливания видимого объема на ваши объекты или рисуйте объекты около начала координат н используйте функцию к1тгапз1ате*() для переноса камеры в направлении осп г на расстояние, достаточное, чтобы все они попали в объем види- 128 Глава 3 ° Визуализация мости. Если у вас получилось захватить все объекты, попытайтесь постепенно изменять видимый объем до тех пор (как описано далее), пока не достигнете нужного результата.
6. Для перспективных преобразований убедитесь, что ближняя плоскость отсечения расположена не слишком близко к наблюдателю (камере) или точность буфера глубины достаточна. Даже п<>еле того как вы нацелили камеру в правильном направлении и увидели объекты, они могут оказаться слишком маленькими или чересчур большими, В случае а1орегзрЕСС>че() бь<васт нужно изменить угол, опредслясоший поле зрения, подгонкой значения первого аргумента втой функции. Можно прибегнуть к тригонометрии для вычисления нужного угла поля зрения, учтя размеры объекта и его расстояние от точки обзора: тангенс половины требуемого угла равен половине размера обьекта, деленной на расстояние до объекта (рис.
3.19). Для вычисления половинного угла от искомого в вашем распоряжении имеется библиотечная функция арктангенса. В листингс 3.3 приведен пример, где арктангенс вычислен с помощью функции асап2 () из длин прилегающей и противоположной сторон (катетов) прямоугольного треугольника. Результат необходимо преобразовать из ралианов в градусы. Рнс. 3.19. Использование тригонометрии для вычисления поля зрения Листинг З.З. Вычисление поля зрения все<<ее Р1 3.1415826535 оооо)е са1со\аселп81е(пооосе з>се, воете О<зСапсе) ( Оооосе гаОСЛеСа. Оеа(не<а: гав<не(а = 2.0 ' а(ап2 (в<се!2.8, О<з<апсе); лез(не<а = (180.0 * гав(ле(а) I Р1; ге(огп Оез(нега: ) Управление стеком матриц 129 Конечно, ча|це размер объекта неизвестен, а известно только расстояние между ючкой наблюдения и некоторой точкой в сцене.
Для получения более точного гяачення выясните, где проходят границы прямоугольного параллелепипеда, ог)иничиваюшего сцену, найдя максимальные и минимальные координаты х, у и г вовсем объектам сцены. Затем вычислите радиус сферы, описанной вокруг этого прямоугольного параллелепипеда, и используйте координаты центра сферы для яэлучения расстояния, а радиус — для определения размера.
Пусть все координаты объекта удовлетворяют следующим условиям: — 1 < х < 3, 5<у < 7 и -5 < г ~ 5. Координаты центра будут равны (1, 6, 0), а радиус описанной ~ферм равен расстоянию от центра до любого угла прямоугольного параллелепи- педа, например с координатами (3, 7, 5): (3-1)' 4(7+6)з э(5 — О)' =к/30 =5.477. Если координаты точки наблюдения — (8, 9, 10), расстояние от нее до центра равно (8 — 1)' +(9-6)' +(10-0)' = Л58 =12 570. Тангенс половинного угла равен 5 477, деленным на 12.570, что составляет 0.4357, то есть половинный угол равен 23.54'.
Помните, что угол поля зрения влияет на оптимальное расположение точки обзора если вы хотите получить реалистичное изображение. Например, если результатом вычисления явился угол в 179', точка наблюдения должна быть удалена на )Юлю дюйма от экрана для поддержания реализма. Если полученное значение угяз просмотра слишком большое, нужно переместить позицию наблюдателя дальше от объекта. Управление стеком матриц Матрицы модельно-видовых преобразований и преобразований проекции, кото- рые вы создаете, загружаете и перемножаете, это только вершина айсберга.