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

Примитивы и управление положением объектов (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 определяет, будет ли создаваться сторона, нижняя и верхняя крышки цилиндра.

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

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

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