Страницы

Tuesday 24 May 2011

Руководство по Image_3D: Создание вашего первого мира (часть 3 из 13)

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

Создание вашего первого мира

Ваше первое изображение будет включать в себя все основные элементы, необходимые для любого изображения, созданного с помощь Image_3D. Из этого примера, вы будете иметь правильное понимание пространства и освещения, чтобы быстро изучить все основные объекты в пакете.

Конусы

Целью этого первого примера будет заключаться в создании освещенного конусообразного объекта на белом фоне. Полученное пространство будет воспроизведено на изображении размером 400x400 пикселей.

Листинг 1. Создание конуса в 3D пространстве
<?php
require_once('Image/3D.php');

// Создание пустого трехмерного пространства
$world = new Image_3D();
$world->setColor(new Image_3D_Color(255, 255, 255));

// Синий источник света слева
$light1 = $world->createLight(-300, 0, -300);
$light1->setColor(new Image_3D_Color(100, 100, 255));

// Зеленый источник света сверху справа
$light2 = $world->createLight(300, -300, -300);
$light2->setColor(new Image_3D_Color(100, 255, 100));

// Создание объекта конуса
$cone = $world->createObject('cone', array('detail' => 64));
$cone->setColor(new Image_3D_Color(255, 255, 255));
$cone->transform($world->createMatrix('scale', array(70, 220, 70)));
$cone->transform($world->createMatrix('rotation', array(-45, -120, -10)));
$cone->transform($world->createMatrix('move', array(-50, -30, 10)));

// Воспроизведение и сохранение 2D изображения
$world->createRenderer('perspectively');
$world->createDriver('gd');
$world->render(400, 400, 'object.png');
?>
Каждое изображение которое вы создаете начинается с создания нового объекта Image_3D, который вы будете называть $world. Цвет фона для пространства устанавливается путем создания объекта Image_3D_Color. Три параметра для конструктора этого объекта являются RGB значения цвета которого вы хотите создать.

Вы создали два объекта Image_3D_Light в пространстве. Представьте себе, что первый, голубой свет, расположен слева от начала координат и от плоскости экрана. Второй располагается в правом верхнем углу от начала координат, а также от экрана, это зеленый.

Дальше, конус находится в пространстве. Обратите внимание, что цвет, который вы назначили для этого объекта, белый. Это объясняется тем, объект берет на себя цвета двух источников света которые вы расположили в пространстве - лучший способ для выделения противоположных аспектов объекта с помощью различных цветов.

К конусу применяются три преобразования. Во-первых, масштаб объекта увеличен. Объект конуса уникален в том отношении, что ему не назначается размер, когда он будет создан. По сути он создается в 1x1x1 пространстве и его размер должен быть изменен. Во-вторых, вращаясь конус также захватывает свет. Это своего рода процесс проб и ошибок. Тогда вы перемещаете конус, просто в центр изображения.

Последним шагом для вашего сценария является создание 2D визуализации 3D пространства. Вы будете использовать визуализацию "perspectively" (в перспективе) во всех ваших примерах (другой вариант "isometric" (в изометрии)). Выбран драйвер вывода GD, который будет создавать изображение в формате PNG. Установили размер изображения 400x400 пикселей, и он будет сохранена в файл: object.png.

Для создания изображения сценарий должен быть запущен из командной строки:

php -f build_cone.php

Созданный файл изображения должен выглядеть, как показано ниже.

Рисунок 2. 3D конус созданный с помощью пакета Image_3D


Контроль детализации и время визуализации

Я надеюсь, что пример был достаточно прост. Вы будете использовать то же пространство, освещение и визуализацию через несколько дополнительных примеров, чтобы продемонстрировать другие встроенные типы объектов, которые идут в поставке с Image_3D.

Прежде чем двигаться дальше, есть два момента, о вашем первом сценарии. При создании экземпляра объекта конуса, вы передали массив в качестве второго аргумента, array('detail' => 64), который устанавливает количество полигонов используется для генерации конуса. Меньшее количество оснований -  более угловатый вид, в то время как большее число генерирует намного более гладкие поверхности (см. рисунок 3).

Рисунок 3. Различные уровни детализации 3D конусов. Показаны уровни 8, 16, 32 и 64


С более высоким уровнем детализации, Image_3D будет дольше создавать изображение. Конусы довольно простые объекты для создания, так что эффект не страшен. Когда вы перейдет к сферам и более сложным формам, вы увидите, что скорость визуализации может быстро выйти из-под контроля.

Существует встроенный метод статистики объекта Image_3D, который обеспечит вас некоторой информацией о том, как изображение было создано. Вставьте следующую строку в конце предыдущего сценария.

echo $world->stats();
Перезапущенный скрипт отобразит результат в листинге 2.

Листинг 2. Статистика генерации объекта конуса
Image 3D

Objects:   1
Lights:    2
Polygons:  130
Points:    67

Помимо этих простых деталей, рассмотрите возможность использования пакета PEAR::Benchmark (см. раздел Ресурсы) для измерения времени выполнения сценариев, если они создают более сложные 3D изображения.

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

Перед началом работы (часть 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