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