Страницы

Friday, 27 May 2011

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

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

Дополнительные объекты

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

Кубы

Как конусы, кубы еще один простой объект для создания. Только для их создания необходимо небольшое количество полигонов и, не взирая на размер, все кубы имеют один уровень детализации. При создании куба, второй параметр для createObject() является массивом из трех значений: ширина, высота и глубина куба.

Код ниже, может быть использован вместо объекта $cone в листинге 1 для производства куба:
$cube = $world->createObject('cube', array(100, 100, 100));
$cube->setColor(new Image_3D_Color(255, 255, 255));
$cube->transform($world->createMatrix('rotation', array(-60,60,40)));
Рисунок 6. 3D куб созданный с помощью пакета Image_3D


Сферы

Продолжаем снова редактировать исходный пример из листинга 1, вы замените конус сферой. Здесь, второй параметр будет массив, содержащий значение для r, что задает радиус сферы, и detail, которая является целым числом, определяет относительную гладкость объекта. Уровень детализации может быть как 1, который больше похож на смятый лист бумаги, чем на сферу. Использование значений 4, 5 или 6 является лучшим для детализации. Все, что выше чем 6 является причиной чрезвычайно долгого времени воссоздания (измеряется в минутах, а не в секундах).
$sphere = $world->createObject('sphere', array('r' => 85, 'detail' => 5));  
$sphere->setColor(new Image_3D_Color(255, 255, 255));
Рисунок 7. 3D сфера созданная с помощью пакета Image_3D


Сравните статистику для создания этой сферы (см. листинг 4) с тем, что видели для конуса в листинге 2.

Листинг 4. Статистика генерации сферы с детализацией 5
Image 3D

Objects:   1
Lights:    2
Polygons:  4096
Points:    2050

Фактически, если вы увеличите детализацию этой сферы до 6, количество полигонов и точек увеличится в четыре раза.

Торы

Согласно Википедии, тор это замкнутая поверхность и определяется как произведение двух окружностей: S1 х S1. Если ваши знания геометрии желают лучшего, вы можете называть его просто бубликом.

Вставьте следующий код в свое 3D пространство чтобы увидеть, как создается тор.

Листинг 5. Создание экземпляра объекта тора
$torus = $world->createObject('torus', array('inner_radius' => 90,
                                             'outer_radius' => 120,
                                             'detail_1' => 30,     
                                             'detail_2' => 30));   
$torus->setColor(new Image_3D_Color(255, 255, 255));
$torus->transform($world->createMatrix('Rotation', array(-45,0,-30)));
$torus->transform($world->createMatrix('Move', array(0,-20,0)));
Другой набор значений который передается вторым параметром createObject(). В этом случае, inner_radius и outer_radius являются внутренним и внешним радиусами бублика. Detail_1 и detail_2 несколько менее очевидны, если вы поэкспериментируйте с регулировкой этих значений, вы обнаружите, что detail_1 контролирует количество полос (линий перпендикулярно к кольцу), а detail_2 контролирует количество чередований (линий, которые идут параллельно внешнему краю кольца).

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


Текст

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

Листинг 6. Создание экземпляра объекта текста
$text = $world->createObject('text', 'Databases!');
$text->setColor(new Image_3D_Color(255, 255, 255));
$text->transform($world->createMatrix('Scale', array(6, 6, 6)));
$text->transform($world->createMatrix('Rotation', array(-35, 30, -15)));
$text->transform($world->createMatrix('Move', array(-150, 10, 20)));
Вместо массива, как в предыдущих примерах, передаваемого вторым параметром createObject(), чтобы создать объект текста, вам просто нужно передать текст который будет отображен.

Невероятно, но вы усвоили половину руководства и не было ни слова сказано о вездесущих системах, о которых написано во многих учебниках по PHP. Этим еще не упомянутым системам выявлено уважение в 3D ниже.

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


3D Studio Max

Инструменты которые вы видели до сих пор для создания 3D изображений были достаточно просты, и существует не так много возможностей для создания изображений с нуля. Возможность импорта готовых 3D Studio Max файлов (см. листинг 7) добавляет некоторый интересный потенциал.

Листинг 7. Создание экземпляра файла 3D Studio Max
$obj = $world->createObject('3ds', 'Image_3D.3ds');
$obj->setColor(new Image_3D_Color(255, 255, 255));
$obj->transform($world->createMatrix('Rotation', array(110, 40, 0)));
$obj->transform($world->createMatrix('Scale', array(7, 7, 7)));
Как вы можете видеть, создание объекта примерно так же просто, как поиск файла 3D Studio Max. Если вы потратили хоть немного времени копаясь в установке Image_3D, вы, возможно, нашли несколько примеров которые включены в этот пакет PEAR. Импортированный файл Image_3D.3ds в листинге выше, взят из этих примеров. Полученное изображение показано ниже.

Рисунок 10. Отображаются импортированный файл 3D Studio Max с использованием пакета Image_3D


Конечно, здесь есть одна проблема: размер импортированного файла 3D Studio Max в приведенном выше примере был менее 200 Кб и довольно простой. Открытие больших файлов может привести к остановке вашего сервера или PHP.

Сочетание нескольких объектов в одном пространстве

Пока вы видели только отдельные объекты в 3D пространстве, но нет никакой причины останавливаться на достигнутом. В листинге 8, вы увидите пример того, как объединить более 100 объектов в одном пространстве.

Как и раньше, просто замените код из листинга 1, который определяет $cone.

Листинг 8. Создание куба собранного из объектов сфер
for ($x=0; $x < 5; $x++) {
    for ($y=0; $y < 5; $y++) {
        for ($z=0; $z < 5; $z++) {
            $sphere = $world->createObject('sphere', array('r' => 25, 'detail' => 4));
            $sphere->setColor(new Image_3D_Color(255, 255, 255));
            $sphere->transform($world->createMatrix('Move', array($x * 75, $y * 75, $z * 75)));
            $sphere->transform($world->createMatrix('Rotation', array(45, 30, 15)));
        }
    }
}

$world->transform($world->createMatrix('Move', array(-225, -100, 0)));
Листинг 8 определяет три цикла который увеличивает $x, $y и $z от 0-4. Во внутреннем, создается один объект сферы. Используя преобразование перемещения, каждая новая сфера смещена от начала координат в направлениях X, Y и Z. После перемещения, каждая сфера вращается вокруг начала координат.

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

Имейте в виду, что этот пример создает 125 сфер. Если у вас возникли проблемы с созданием одной сферы с детализацией 4, учтите сколько времени займет создание более 124. При значении детализации 4 или 5 изображение будет выглядеть действительно красиво, но имеет смысл выбрать 1 или 2, пока вы не будете уверены, что все работает как ожидалось.

Согласитесь, что полученное изображение, показанное на рисунке 11, гораздо более захватывающее, чем простые кубы и конусы.

Рисунок 11. 125 сфер располагаются так, чтобы создать матрицу в форме куба


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

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