Страницы

Sunday, 29 May 2011

Руководство по Image_3D: Дополнительные драйверы вывода (часть 8 из 13)

Перевод восьмой части руководства по PEAR пакету Image_3D, оригинал http://www.ibm.com/developerworks/opensource/tutorials/os-php-3d/section8.html

Дополнительные драйверы вывода

До сих пор все изображения, которые вы создали, использовали драйвер GD. Вы видели, что этот драйвер производит изображения в формате PNG, но в вашем распоряжении есть ещё четыре дополнительных драйвера: SVG, SVGRotate, ZBuffer, и ASCII.

SVG

Формат файла The Scalable Vector Graphics (SVG) являет собой определение векторов в формате XML, которые собирают 2D изображения. W3C стандартизировало формат в 2001 году, но его использование в интернете было затруднено в связи отсутствия браузеров, которые могут отображать SVG-файлы. В настоящее время все браузеры имеют встроенную поддержку SVG.

Создание SVG-изображений с помощью Image_3D достаточно легкое дело. Просто измените последние две строки кода в листинге 1 следующим образом:
$world->createDriver('svg');
$world->render(400, 400, 'object.svg');
Полученный файл изображения должен напоминать первый конус который вы создали.

Интересным аспектом файлов SVG является то, что деревом XML, определяющее изображение, можно манипулировать, используя JavaScript и DOM. Представьте себе, манипулирование изображениями в том же порядке, что dHTML используется для управления веб-страниц. Бывает, что драйвер SVGRotate генерирует SVG-файл, который содержит сценарий, необходимый только для этой цели.

Изменение драйвера вывода, опять же, очень простое изменение последних двух строк кода:
$world->createDriver('svgrotate');
$world->render(400, 400, 'object.svg');
Полученный файл, при просмотре в браузере поддерживающим SVG, включает в себя встроенные элементы управления для вращения и масштабирования конуса в режиме реального времени. Скриншот изображения будет показан ниже.

Рисунок 15. Драйвер SVGRotate включает в себя элементы управления и сценарии для управления изображением в режиме реального времени


Отметим, что поддержка скриптовых файлов SVG ограничена. Полученный файл работал в Internet Explorer с Adobe SVG плагином, но не правильно отображался в Firefox.

ZBuffer

Для перевода 3D пространства на 2D изображение требуется специальный алгоритм, который может определить, какие объекты наложены и скрыть другие. В 3D моделировании, управление видимостью объектов в 2D пространстве называется Z-буферизация.

Пока ни в одном из ваших примеров не было проблем с объектами наложенными друг на друга. Если вы столкнулись с этой проблемой, лучшим вариантом является изменение вашего драйвера GD на ZBuffer. Драйвер ZBuffer по-прежнему использует GD для получения изображений PNG, но он лучше управляет 3D объектами, поскольку они переведены в 2D растровые изображения.

Используйте код в листинге 13, для умышленного причинении конфликта в Z-буферизации объектов, вы создадите два объекта, которые занимают одно пространство. Сфере задается прозрачность в 150 так что вы можете видеть плоскость, которая проходит через ее центр.

Листинг 13. Четырехсторонняя плоскость рассекает сферу
$sphere = $world->createObject('sphere', array('r' => 85, 'detail' => 4));
$sphere->setColor(new Image_3D_Color(255, 255, 255, 150));

$plane = $world->createObject('polygon', array( 
                                new Image_3D_Point(-120, 0, -120),
                                new Image_3D_Point(-120, 0,  120),
                                new Image_3D_Point( 120, 0,  120),
                                new Image_3D_Point( 120, 0, -120)
                              ) );
$plane->setColor(new Image_3D_Color(255, 255, 255));
$plane->transform($world->createMatrix('Rotation', array(15,15,-10)));
Если вы воспроизведете этот объект с помощью драйвера GD, сфера появятся перед плоскостью, как показано на рисунке ниже.

Рисунок 16. Два перекрывающихся 3D объекта воссозданных отдельно с помощью драйвера GD


Тем не менее, вы знаете исходя из координат плоскости, которую вы создали, что она должна разрезать непосредственно сферу. Изменение драйвера на ZBuffer решит этот вопрос в результирующем PNG файле, как показано ниже.

Рисунок 17. Конфликты между двумя перекрывающимися 3D объектами решены путем применения драйвера ZBuffer


ASCII

Драйвер ASCII не входит в ваши примеры, но цель этого драйвера обеспечение создания изображения, которое будет отображаться в цветном терминале ANSI. Если вы работаете на ПК с ОС Windows® , вывод этого драйвера, вероятно, не будет очень полезным для вас.

Другие части перевода

Перед началом работы (часть 1 из 13)
Расположение в пространстве (часть 2 из 13)
Создание вашего первого мира (часть 3 из 13)
Источники света и цвета (часть 4 из 13)
Изменение объектов и форм (часть 5 из 13)
Дополнительные объекты (часть 6 из 13)
Пользовательские формы и поверхности (часть 7 из 13)
Дополнительные драйверы вывода (часть 8 из 13)
Возвращение к практическим примерам (часть 9 из 13)
Суммарно (часть 10 из 13)
Скачать (часть 11 из 13)
Ресурсы (часть 12 из 13)
Об авторе (часть 13 из 13)

Автор перевода: reket.

No comments:

Post a Comment