Примитивы и управление положением объектов (Transform)

Итак, здесь начинается практическая часть изложения VRML. В качестве наглядного проекта начнем создание, к примеру, рабочего стола, на который постепенно набросаем всяких "предметов". Да и сам по себе стол постепенно оживет. При описании синтаксиса в качестве численных аргументов будут указаны значения, принятые по умолчанию.

ВАЖНО! В спецификации есть замечательная фраза, касающаяся ВСЕХ примитивов:

The Box (Cone, Shpere, Cylinder) geometry requires outside faces only. When viewed from the inside the results are undefined.

Т.е. вид этих тел ИЗНУТРИ строго не оговорен и зависит от броузера. В большинстве случаев вида изнутри просто НЕТ, т.е. объекта как бы и вовсе нет.

Box (паралеллепипед)

Описание прямоугольного параллелепипеда выглядит предельно просто:

Box       {size      2      2      2}

По умолчанию центр тяжести помещается в 0,0,0.

Таким образом код кубика 2x2x2 будет выглядеть так

#VRML V2.0 utf8
Shape          {geometry        Box     {}}

Узел Shape указывает броузеру, что идет описание формы объекта. Можете посмотреть, что получилось

Поскольку нам понадобится крышка для будущего стола, давайте изменим размеры. Прикиньте размеры стола, за которым сидите в метрах. Не забывайте про расположение осей.

Просмотр. Текст кода.

Теперь очередь за ножками стола. Здесь очень уместно объяснить использование узлов DEF/USE и PROTO

Если Вы знаете хотя бы какой-нибудь язык программирования, то это очень легко понять. Вместо описания каждой из четырех одинаковых ножек стола отдельно, мы определяем ПЕРЕМЕННУЮ (DEF), а потом используем ее (USE).

Однако если просто написать USE, то второй объект будет порожден в том же месте, что и исходный. Для управления положением объекта существует узел Transform. На примере с ножками стола легко увидеть, как использовать DEF/USE и Transform.

Вот как они выглядят. Просмотр. Текст кода.

Как видно из кода, исходная первая ножка была создана в точке с координатами 0,0,0, и ей была присвоена переменная с именем "nozhka". Оставшиеся три ножки были порождены смещением переменной "nozhka" вдоль осей X и Z.

Теперь надо совместить ножки стола и его крышку. Имея отдельные файла с этими объектами, можно поступить двумя способами: либо в обычном текстовом редакторе вырезать из одного файла объект и вставить в другой, либо воспользоваться узлом Inline.

Вариант 1.Просмотр. Текст кода.

Вариант 2. Просмотр. Текст кода.

Как видно из просмотра wrl файлов, результат абсолютно одинаков. Осталось только воспользоваться узлом Transform, чтобы правильно взаимно разместить крышку и ножки стола. Предлагаю двигать крышку:

Просмотр. Текст кода.

Sphere (сфера)

Описание сфер выглядит так

Sphere            {radius           1}

По умолчанию центр сферы помещается в точку 0,0,0. Таким образом, если Вы будете указывать ТОЛЬКО узлы Sphere, то получите ВСЕ сферы с центрами в 0,0,0, как матрешки. Я надеюсь, уже ясно, что от этого нас спасет узел Transform.

Предлагаю водрузить на стол, например глобус, т.е. пока только его сферическую часть без подставки.

Просмотр. Текст кода.

Из-за того, что не указан радиус сферы, она по умолчанию получилась радиусом 1 метр, этакий двухметровый глобус на столе :). Вместо указания радиуса, воспользуемся масштабированием, предусмотренным в узле Transorm.

Просмотр. Текст кода.

Пусть шарик пока повисит над столом, подставку сделаем из других примитивов.

Cone (конус)

Описание конуса:

Cone {bottomRadius 1
height 2
side TRUE
bottom             TRUE }

По умолчанию центр его высоты цилиндра размещается в 0,0,0. Логическое утверждение TRUE/FALSE (ИСТИНА/ЛОЖЬ) для side и bottom определяет, будет ли создаваться сторона и донышко конуса. При side TRUE и bottom FALSE, Вы получите конус без донышка; при side FALSE и bottom TRUE, получите только донышко (удобно создавать диски, видимые, правда, только с одной стороны: напомню, что изнутри вид конуса не определен, см начало этой страницы); при side FALSE и bottom FALSE получите конус, невидимый и неощутимый при движении сквозь него, в общем это будет отсутствие конуса.

Создадим коническую подставку для нашего глобуса и поместим ее не вертикально, а наклонно. Для этого воспользуемся еще одной возможностью для позиционирования в узле Transform - rotation (вращение).

rotation описывается 4 числами: первые три задают направление оси вращения (например 1 0 0 - ось X, 0 1 0 - ось Y, 0 0 1 - ось Z, 1 1 0 - ось проходит по биссектриссе угла между осями X и Y), а последнее - величину угла вращения в радианах против часовой стрелки. Направление вращения можно менять, изменяя знак либо угла вращения, либо направления оси, скажем, можно задать ось не 0 0 1, а 0 0 -1.

Просмотр. Текст кода.

Cylinder (цилиндр)

Описание цилиндра:

Cylinder {bottom TRUE
height 2
radius 1
side TRUE
top            TRUE }

По умолчанию центр высоты цилиндра размещается в 0,0,0.

Логическое утверждение TRUE/FALSE (ИСТИНА/ЛОЖЬ) для side, bottom, top определяет, будет ли создаваться сторона, нижняя и верхняя крышки цилиндра.

Создадим цилиндрическое основание для подставки глобуса.

Просмотр. Текст кода.

Назад | Содержание | Вперед