VRML в примерах
Марина Миланина, Diamond Team
Что такое VRML
Язык VRML (Virtual Realty Modelling Languagy) предназначен для описания трехмерных изображений и оперирует объектами, описывающими геометрические фигуры и их расположение в пространстве.
Vrml-файл представляет собой обычный текстовый файл, интерпретируемый браузером. Поскольку большинство Большинство — большая часть чего-либо. Под большинством в редких случаях имеют ввиду абсолютное большинство, то есть более половины какой-либо группы. Обычно большинство означает количественное преимущество одной части над другой. К примеру, треть и четверть. браузеров не имеет встроенных средств поддержки vrml, для просмотра Vrml-документов необходимо подключить вспомогательную программу - Vrml-браузер, например, Live3D или Cosmo Player.
Как и в случае с HTML, один и тот же vrml-документ может выглядеть по-разному в разных VRML-браузерах. Кроме того, многие разработчики VRML-браузеров добавляют нестандартные расширения Расширение имени файла (англ.filename extension, часто говорят просто расширение файла или расширение)— последовательность символов, добавляемых к имени файла и предназначенных для идентификации типа (формата) файла. Это один из распространённых способов, с помощью которых пользователь или программное обеспечение компьютера может определить тип данных, хранящихся в файле. VRML в свой браузер.
Существует немало VRML-редакторов, делающих удобней и быстрее процесс создания Vrml-документов, однако несложные модели, рассматриваемые в данной статье, можно создать при помощи самого простого текстового редактора.
Единицы измерения
В VRML приняты следующие единицы измерения:
- Расстояние и размер: метры
- Углы: радианы
- Остальные значения: выражаются, как часть от 1.
- Координаты
Координаты— величины, определяющие положение точки (тела) в пространстве (на плоскости, на прямой). Совокупность координат всех точек пространства является системой координат. берутся в трехмерной декартовой системе координат (см. рис.)
Заголовок VRML-файла
Как уже говорилось, Vrml-документ представляет собой обычный тестовый файл.
Для того, чтобы VRML-браузер распознал файл с VRML-кодом, в начале файла ставится специальный заголовок - file header:
#VRML V1.0 ascii
Такой заголовок обязательно должен находиться в первой строке файла, кроме того, перед знаком диеза не должно быть пробелов.
Примитивы VRML
В VRML определены четыре базовые фигуры: куб (верней не куб, а прямоугольный параллепипед), сфера, цилиндр Цилиндр (др.-греч. — валик, каток)— геометрическое тело, ограниченное цилиндрической поверхностью и двумя параллельными плоскостями, пересекающими её. Цилиндрическая поверхность - поверхность, получаемая таким поступательным движением прямой (образующей) в пространстве, что выделенная точка образующей движется вдоль плоской кривой (направляющей). Часть поверхности цилиндра, ограниченная цилиндрической поверхностью называется боковой поверхностью цилиндра. Другая часть, ограниченная параллельными плоскостями, это основания цилиндра. Таким образом граница основания будет по форме совпадать с направляющей. и конус.
Эти фигуры называются примитивами (primitives). Набор примитивов невелик, однако комбинируя их, можно строить достаточно сложные трехмерные изображения Изображение— объект, образ, явление, в той или иной степени подобное (но не идентичное) изображаемому или сам процесс их создания. Подобие достигается вследствие физических законов получения изображения (например, оптическое изображение) либо результатом труда создателя изображения (например, рисунок, живопись, скульптура, сценический образ). Под изображением в узком смысле, подразумевают произведение в живописи или графике.. Например, вот такие:
Рассмотрим поподробней каждый из примитивов.
Куб
Возможные параметры: width - ширина, height - высота, depth - глубина Глубина— расстояние от поверхности водоёма до его дна. Средняя глубина мирового океана— 3790м, а самая глубокая впадина— Марианская (11022м)..
Cube {
width 2 # ширина Длина— физическая величина, числовая характеристика протяжённости линий. В узком смысле под длиной понимают линейный размер предмета в продольном направлении (обычно это направление наибольшего размера), то есть расстояние между его двумя наиболее удалёнными точками, измеренное горизонтально, в отличие от высоты, которая измеряется в вертикальном направлении, а также ширины или толщины, которые измеряются поперёк объекта (под прямым углом к длине). В физике термин «длина» обычно используется как синоним «расстояния» и обозначается L или l.
height 3 # высота
depth 1 # глубина
}
Сфера
Параметр у сферы только один, это radius.
Sphere {
radius 1 # радиус
}
Конус
Возможные параметры: bottomRadius - радиус основания, height - высота, parts - определяет, какие части конуса будут видны. Параметр parts может принимать значения ALL, SIDES или BOTTOM.
Cone {
parts ALL #видны и основание, и боковая поверхность конуса
bottomRadius 1 #радиус Радиус (лат.radius— спица колеса, луч)— отрезок, соединяющий центр окружности (или сферы) с любой точкой, лежащей на окружности (или поверхности сферы), а также длина этого отрезка. Радиус составляет половину диаметра. основания
height 2 #высота
}
Цилиндр Цилиндр (др.-греч. — валик, каток)— геометрическое тело, ограниченное цилиндрической поверхностью и двумя параллельными плоскостями, пересекающими её. Цилиндрическая поверхность— поверхность, получаемая таким поступательным движением прямой (образующей) в пространстве, что выделенная точка образующей движется вдоль плоской кривой (направляющей). Часть поверхности цилиндра, ограниченная цилиндрической поверхностью называется боковой поверхностью цилиндра. Другая часть, ограниченная параллельными плоскостями, это основания цилиндра. Таким образом граница основания будет по форме совпадать с направляющей.
Для цилиндра можно задать параметры radius и height. Кроме того, с помощью параметра parts для цилиндра можно определить будут ли отображаться основания цилиндра и его боковая поверхность. Параметр parts может принимать значения ALL, SIDES, BOTTOM или TOP.
Cylinder {
parts ALL #видны все части цилиндра
radius 1 #радиус основания
height 2 #высота цилиндра
}
Цвет и текстура
Цвет фигуры, определяется с помощью объекта Material.
Material {
ambientColor 0.2 0.2 0.2
diffuseColor 0.8 0.8 0.8
specularColor 0 0 0
emissiveColor 0 0 0
transparency 0
}
Параметры ambientColor, diffuseColor, specularColor и emissiveColor управляют цветами и указываются в палитре RGB (красный, зеленый и голубой), причем первая цифра определяет интенсивность красного цвета, вторая - зеленого, а третья - синего.
К примеру, , может быть описан следующим образом:
#VRML V1.0 ascii
Material {
diffuseColor 0 0 1
}
Cube {}
Параметр transparency может принимать значения от 0 до1 и определяет степень прозрачности, причем максимальная прозрачность достигается при transparency равном единице. В приведенном описано два цилиндра разных размеров, меньший из которых просвечивает сквозь другой.
#VRML V1.0 ascii
Material {
diffuseColor 0 0 1
transparency 0.7
}
Cylinder {
height 1
radius 1
}
Material {
emissiveColor 1 0 0
transparency 0
}
Cylinder {
height 0.8
radius 0.1
}
Для имитирования различных поверхностей в VRML существует объект Texture2.
В качестве текстуры легче всего использовать обычный графический файл, например, в GIF-формате. В таком случае для "натягивания" текстуры на трехмерное изображение нужно только указать путь к файлу в параметре filename объекта Texture2.
. #VRML V1.0 ascii
Texture2 {
filename "krp.gif"
image 0 0 0
wrapS REPEAT
wrapT REPEAT
}
Cube {
width 1
height 1
depth 1
}
Параметры wrapS и wrapT могут принимать значения REPEAT или CLAMP, и управляют натягиванием текстуры по соответственно горизонтальной и вертикальной осям.
Положение объектов в пространстве
Изменение координат
По умолчанию любой описанный нами объект будет располагаться точно по центру окна браузера. По этой причине, если мы опишем к примеру два одинаковых цилиндра, они сольются друг с другом. Для того, чтобы изменить положение второго цилиндра, применим узел Translation.
Узел Translation определяет координаты объекта:
Translation {
translation 1 2 3 #т.е. соответственно x=1 y=2 z=3
}
Вообще говоря, координаты Координаты— величины, определяющие положение точки (тела) в пространстве (на плоскости, на прямой). Совокупность координат всех точек пространства является системой координат. указываемые в Translation не являются абсолютными. Фактически это координаты относительно предыдущего узла Translation. Чтобы прояснить это вопрос, рассмотрим пример:
#VRML V1.0 ascii
Cube {
width 1
height 1
depth 1
}
# Этот куб по умолчанию располагается в центре
Translation {
translation 2 0 0
}
#Второй куб сдвинут вправо на 2
Cube {
width 1
height 1
depth 1
}
Translation {
translation 2 0 0
}
#Третий куб сдвинут вправо на два относительно 2-го !!!!
Cube {
width 1
height 1
depth 1
}
Как видите, третий кубик вовсе не совпадает с первым, хотя в в узле Translation указаны те же координаты.
В VRML 1.0 принято следующее правило: узлы, модифицирующие свойства фигур (Translation, Material и т.п.), действуют на все далее описанные фигуры.
Чтобы ограничить область действия модифицирующих узлов, фигуры необходимо сгруппировать с помощью узла Separator.
Separator
{
другие узлы
}
Узел Separator работает как контейнер, он может содержать любые другие узлы, и основным его предназначение Значение— ассоциативная связь между знаком и предметом обозначения.м является именно ограничение области действия узлов типа Translation и Material.
Сравните пример с предыдущим:
#VRML V1.0 ascii
Separator {
Cube {
width 1
height 1
depth 1
}
}# конец области действия узла Separator
Separator {
Translation {
translation 2 0 0
}
#Второй куб сдвинут вправо на 2
Cube {
width 1
height 1
depth 1
}
}# конец области действия узла Separator
Separator {
Translation {
translation 2 0 0
}
#Третий куб сдвинут вправо на два относительно 1-го.
Cube {
width 1
height 1
depth 1
}
}# конец области действия узла Separator
Хотя в примере описано три кубика, мы видим только два, так как второй и третий совпадают.
Вообще говоря рекомендуется всегда и везде использовать узел Separator. Он не только избавит от ошибок, связанных с относительностью координат, но и сделает VRML-код более простым и понятным.
Вращение
Для вращения фигур вокруг осей координат применяется узел Rotation.
Rotation {
rotation 0 1 0 1.57
}
Первые три цифры определяет будет ли осуществлен поворот вокруг соответственно осей x, y и z, а четвертая задает угол вращения в радианах. В приведенном выше листинге поворот осуществляется вокруг оси y на 90 градусов.
|
Углы в градусах
| Радианы
| | 30
| 0.52
| | 45
| 0.78
| | 60
| 1.04
| | 90
| 1.57
| | 180
| 3.14
| | 270
| 4.71
|
Составим букву T из двух цилиндров. По умолчанию цилиндр ориентирован вертикально (см. рисунок Рисунок — изображение на плоскости, созданное средствами графики. В роли графической основы присутствует в любом изображении на плоскости, в этом значении оценивается с точки зрения качества (понятие рисунка в живописи и т. п.). Рисунок может выполняться как самостоятельное по значению произведение графики либо служить вспомогательным этапом для создания живописных, графических, реже — скульптурных работ или архитектурных замыслов. Рисунки как предварительные наброски и эскизы для создания более масштабных живописных произведений часто имеют самодостаточную и выдающуюся художественную ценность.). Поэтому для успешного выполнения задачи повернем его вокруг оси z на 90 градусов.
#VRML V1.0 ascii
Separator { #Красный цилиндр
Material { emissiveColor 1 0.6 0.6 }
Cylinder {
height 1
radius 0.3
}
}
Separator { # Синий цилиндр, повернутый на 90 градусов вокруг оси z
Translation {
translation 0 0.5 0
}
Rotation {
rotation 0 0 1 1.57
}
Material { emissiveColor 0.5 0.5 1 }
Cylinder {
height 1
radius 0.3
}
}
Масштабирование
Узел Scale масштабирует фигуры по одному или нескольким измерениям. Три цифры, стоящие после параметра scaleFactor определяют коэффициенты Коэффициент (от лат.co(cum)— «совместно» и лат.efficients— «производящий»)— числовой множитель при буквенном выражении, известный множитель при той или иной степени неизвестного, или постоянный множитель при переменной величине. масштабирования относительно осей x,y и z.
Scale {
scaleFactor 1 1 1
}
В следующем примере, узел Scale сжимает сферу по оси x, и из сферы получается эллипсоид.
#VRML V1.0 ascii
Material { emissiveColor 1 1 0 }
Scale {
scaleFactor 0.7 1 1 #сжимаем сферу по оси x
}
Sphere { radius 1}
}
Определение собственных объект Объект (лат.objectum— предмет)— философская категория, если определять её в пределах эпистемологии, выражающая нечто, существующее в реальной действительности (то есть независимо от сознания)— предмет, явление или процесс, на которые направлена предметно-практическая и познавательная деятельность субъекта (наблюдателя). В качестве объекта может выступать и сам субъект, в качестве субъекта выступает личность, социальная группа или всё общество.ов
VRML предоставляет прекрасную возможность сократить и сделать более понятным исходный код VRML-файла путем описания собственных объектов. Это значит, что если в изображении несколько раз повторяется одна и та же фигура, то ее можно описать всего лишь один раз и в дальнейшем только ссылаться на нее.
Объект описывается одним из способов:
DEF name
Cube {}
или
DEF name
Material {}
или
DEF name
Separator {
Сгруппированные узлы, описывающие фигуру и свойства Свойство (в философии, математике и логике)— атрибут предмета (объекта). Например, о красном предмете говорится, что он обладает свойством красноты. Свойство можно рассматривать как форму предмета самого по себе, притом, что он может обладать и другими свойствами. Свойства, следовательно, подпадают под действие парадокса Рассела и парадокса Греллинга-Нельсона. материала
}
Для того, чтобы вставить в VRML-файл ранее определенную фигуру, используется команда USE
Separator {
USE name
}
Создадим VRML-файл, описывающий стул, при этом ножку стула опишем как объект LEG:
#VRML V1.0 ascii
Material { emissiveColor 1 0.5 0.5 }
Separator {
Translation { translation 1 1 1 }
DEF LEG #Определяем объект - ножку стула
Separator { # leg
Cylinder {
height 0.8
radius 0.1
}
} # определили ножку
}
Separator {
Translation { translation 0 1 1 }
USE LEG # используем определенный объект
}
Separator { # еще одна ножка
Translation { translation 1 1 0 }
USE LEG
}
Separator { # последняя ножка
Translation { translation 0 1 0 }
USE LEG
}
Separator { # сиденье
Translation { translation 0.49 1.5 0.5 }
Cube {
height 0.2
width 1.2
depth 1.2
}
}
Separator { # спинка
Translation { translation 0.49 2 0 }
Cube {
height 0.8
width 1.2
depth 0.2
}
}
Separator { # закругление спинки
Translation { translation 0.49 2.1 0 }
Rotation {
rotation 1 0 0 1.57
}
Cylinder {
radius 0.6
height 0.2
}
}
Как видите, нам не понадобилось описывать каждую ножку в отдельности - в результате объем VRML-кода стал меньше, а сам код более читабельным.
Еще один способ Метод (от греч. — «способ»)— систематизированная совокупность шагов, действий, которые необходимо предпринять, чтобы решить определенную задачу или достичь определенной цели. В отличие от области знаний или исследований, является авторским, то есть созданным конкретной персоной или группой персон, научной или практической школой. В силу своей ограниченности рамками действия и результата, методы имеют тенденцию морально устаревать, преобразовываясь в другие методы, развиваясь в соответствии с временем, достижениями технической и научной мысли, потребностями общества. Совокупность однородных методов принято называть подходом. Развитие методов является естественным следствием развития научной мысли. уменьшить размер VRML-файла - вставлять фигуры из другого файла.
Это позволяет делать узел WWWInline:
#VRML V1.0 ascii
Separator {
WWWInline {
name ""
bboxSize 0 0 0
bboxCenter 0 0 0
}
}
Параметр name - это путь к файлу, параметры bboxSize и bboxCenter не обязательны и показывают пользователю размеры и положение вставляемого объекта, пока объект подгружается.
Вместо заключения, хочется обратить Ваше внимание на две особенности VRML, незнание которых сильно затруднит создание VRML-документов вручную.
-
Все описания узлов и параметров в VRML регистрозависимы. Если Вы используете буквы неправильного регистра - то VRML-браузер просто проигнорирует такое описание.
- В VRML имеет огромное значение порядок описания узлов. Так к примеру,
...
Rotation {...}
Scale {...}
...
и
...
Scale {...}
Rotation {...}
...
дают совершенно разный результат.
Большое спасибо за картинки:)
|