Vrml’97 примитивы и управление положением объектов (transform)


Содержание

Преобразование объектов в примитивы

Что произойдёт, если сложить два объекта obj1 + obj2 , вычесть один из другого obj1 — obj2 или вывести их на экран, воспользовавшись alert(obj) ?

В этом случае объекты сначала автоматически преобразуются в примитивы, а затем выполняется операция.

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

  1. Все объекты в логическом контексте являются true . Существуют лишь их численные и строковые преобразования.
  2. Численные преобразования происходят, когда мы вычитаем объекты или выполняем математические операции. Например, объекты Date (мы рассмотрим их в статье Дата и время) могут вычитаться, и результатом date1 — date2 будет временной отрезок между двумя датами.
  3. Что касается строковых преобразований – они обычно происходят, когда мы выводим объект alert(obj) , а также в других случаях, когда объект используется как строка.

Преобразование к примитивам

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

Существуют три варианта преобразований («три хинта»), описанные в спецификации:

Для преобразования объекта к строке, когда операция ожидает получить строку, например alert :

Для преобразования объекта к числу, в случае математических операций:

Происходит редко, когда оператор «не уверен», какой тип ожидать.

Например, бинарный плюс + может работать с обоими типами: строками (объединять их) и числами (складывать). Таким образом, и те, и другие будут вычисляться. Или когда происходит сравнение объектов с помощью нестрогого равенства == со строкой, числом или символом, и неясно, какое преобразование должно быть выполнено.

Оператор больше/меньше <> также может работать как со строками, так и с числами. Однако, по историческим причинам он использует хинт «number», а не «default».

На практике все встроенные объекты, исключая Date (мы познакомимся с ним чуть позже), реализуют «default» преобразования тем же способом, что и «number» . И нам следует поступать также.

Обратите внимание, что существуют лишь три варианта хинтов. Всё настолько просто. Не существует хинта со значением «boolean» (все объекты являются true в логическом контексте) или каких-либо ещё. И если мы считаем «default» и «number» одинаковыми, как большинство встроенных объектов, то остаются всего два варианта преобразований.

В процессе преобразования движок JavaScript пытается найти и вызвать три следующих метода объекта:

  1. Вызывает obj[Symbol.toPrimitive](hint) – метод с символьным ключом Symbol.toPrimitive (системный символ), если такой метод существует, и передаёт ему хинт.
  2. Иначе, если хинт равен «string»
    • пытается вызвать obj.toString() , а если его нет, то obj.valueOf() , если он существует.
  3. В случае, если хинт равен «number» или «default»
    • пытается вызвать obj.valueOf() , а если его нет, то obj.toString() , если он существует.

Symbol.toPrimitive

Начнём с универсального подхода – символа Symbol.toPrimitive : метод с таким названием (если есть) используется для всех преобразований:

Для примера используем его в реализации объекта user :

Управление положением 3D объектов (C#)

Всем привет!
Буквально пару дней занимаюсь WPF, пока что еще мало знаю.
В интернете нашел пример создания куба с натянутой текстуркой. Проблем в понимании как и что формируется нет, т.к. есть опыт работы с DirectX. Вопрос собственно такой, как можно посредством клавиш клавиатуры заставить этот куб вращаться, к примеру по нажатию стрелки влево , поворачивать куб на 10 градусов вокруг оси У против часовой стрелки. И как можно перемешать куб.

вот код примера

тут организована анимация, а меня интересует именно управляемое вращение и перемещение

09.03.2012, 22:43

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

Управление положением окна
Доброго времени суток. У меня такой вопрос: как можно отправить форму своей программы, на второй.

Управление положением MessageBox
Можно ли как то управлять ей ? что бы выбрать место для её отображения ? Хотел что бы она.

Управление положением формы
У меня есть главная форма F1. Во время работы динамически порождается множество форм F3 (это.

Управление положением сторонней программы
Доброго времени суток. У меня такой возник вопрос: возможно ли из свой программы управлять.

Язык трехмерного моделирования VRML и его образовательные возможности

Знание некоторых принципов легко возмещает незнание некоторых фактов.
Гельвеций
Всегда считалось, что грамотность, например, доступна лишь тем, кто обладает умственными способностями, особенно подготовленными для восприятия сложных задач чтения и письма. Разумеется, с появлением книгопечатания и массового образования выяснилось, что грамотными в состоянии стать большинство людей.
Айзек Азимов
Ну что просить-то будешь, служивый? Только попроще чего, а то просят телевизоры какие-то, транзисторы. Один совсем обалдел: “Выполни, говорит, за меня годовой план по лесопилке”.
— Ага, — сказал я. — А телевизор вы, значит, все-таки не можете?
— Нет, — честно призналась щука. — Телевизор не могу. И этот. комбайн с проигрывателем тоже не могу. Не верю я в них. Ты чего-нибудь попроще. Сапоги, скажем, скороходы или шапку-невидимку.
Аркадий и Борис Стругацкие

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

Конечно, в статье мы ознакомимся только с введением в объемную (в прямом и в переносном смысле) книгу под названием VRML. Но зато эти знания дадут возможность в дальнейшем без особых затруднений ее при необходимости читать.

По ходу изложения придется неоднократно ссылаться на материал, опубликованный в первой части статьи. Договоримся везде обозначать эту ссылку максимально кратко — в части 1.

О методике изложения

Вашему вниманию предлагается “неформальное” введение в язык VRML, которое отличается от традиционных способов изложения. По крайней мере большинство материалов в Сети довольно четко отождествляются с одной из двух групп: “VRML в примерах” и группе с несколько условным названием “36 узлов VRML 1.0 1” , которая по сути является слегка расширенным переводом технической спецификации. Разумеется, эти два подхода могут объединяться, но к пониманию это приближает не сильно: обоим подходам не хватает некоторого обобщения.

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

Второй подход, несмотря на полноту предложенного материала, также далек от оптимального. Фактов, как всегда, много, все сразу не запомнишь; и опять почти вся работа по их классификации ложится на обучаемого. Его первое впечатление о предмете нетрудно предсказать — куча разрозненных фактов, а я не прочел еще и половины…

В прекрасном фильме [1] по методике обучения показан следующий замечательный пример: предлагается запомнить приведенную на рисунке систему кодирования цифр и затем с ее помощью записать несколько чисел. Результаты оказываются весьма посредственными. Но когда участникам эксперимента показывают рисунок, который поясняет, откуда взялись “таинственные значки”, то оказывается, что и запоминать-то особенно нечего…

Характерно, что описанные выше трудности в методике изложения не есть особенности VRML, о котором мы сейчас говорим. Возьмите любой язык программирования, и там тоже обнаружатся подобные подходы (“изучаем язык X на примерах” или “полное описание всех конструкций языка X”). А “рецептурное” освоение Windows “для чайников” вам ничего не напоминает?

Итак, не хватает систематизации материала, некоторого своеобразного “каркаса”, этаких “ящиков с подписями”, куда мы сможем раскладывать наши фактические знания и примеры. А уж извлечение из хорошо структурированного хранилища данных происходит легко и быстро!

По-видимому, развитыми способностями к систематизации обладают далеко не все люди, даже среди тех, кто пишет статьи (это особенно заметно в Интернете, где нет никакого критического отбора авторов). К счастью, они все же есть; в частности, про VRML можно привести в качестве примера статьи А.Авдуевского [2] и А.Медведева [3], которые очень сильно помогают в понимании базовых принципов языка. Именно принципы и будут нашей главной целью, а зная их, уже можно найти и разобраться в тех из пресловутых 36 (или даже большем числе) узлов, которые вам конкретно понадобились!

В последнее время много (по мнению автора, даже чрезмерно много) говорят о технологиях. Следует четко понимать, что технология есть готовое знание, кем-то проанализированное и сформулированное. Целью же обучения, напротив, является формирование у обучаемых способности самостоятельно систематизировать, обобщать и подбирать необходимые в данной ситуации знания. Следовательно, роль технологий не следует абсолютизировать!

Общие основы VRML

1. Общие правила VRML-описаний (программ). Как мы уже знаем из части 1, описание VRML-объектов (мира) хранится в текстовом файле с расширением WRL; для сокращения времени загрузки текст часто передается в архивированном виде, поэтому не все файлы с этим расширением, которые были “закачаны” из Сети, можно непосредственно прочитать в Блокноте. В простейшем случае мир — это автономный файл, но часто он ссылается на некоторые графические файлы (текстуры), и значительно реже — на выделяемые в отдельный файл WRL объекты-прототипы (ссылка на них обозначается EXTERNPROTO). В данной статье мы ограничимся случаем простейших автономных VRML-файлов.

Примечание. Договоримся не делать особой разницы между терминами “описание VRML-мира” и “VRML-программа”.


Каждый файл с VRML-программой может содержать следующие части:

Формально обязательным является лишь заголовок; в подавляющем большинстве файлов 2 есть описание сцены. Остальные разделы появляются при необходимости.

Примечание. Об описании прототипов говорится в примере 6.2.2, а о маршрутах событий — в 6.1.5.

Заголовок всех файлов практически одинаков и имеет вид:

Внимание! Между словами везде стоит ровно один пробел!

Кроме очевидного указания на язык и его версию (мы везде будем использовать стандарт VRML97, который маркируется как версия 2.0), в заголовке задается кодировка символов. Как правило, используется набор символов Unicode, что при работе с русскими буквами будет приводить к некоторым особенностям. В данной статье мы не будем их касаться, поскольку с текстами, “живущими” в виртуальных мирах, и без кодировки слишком много проблем (см. пример в разделе 3).

Знак “#” выделяет комментарии, и поэтому (исключая заголовок!) интерпретатор VRML игнорирует любой текст, стоящий в строке правее. В многострочных комментариях, как нетрудно догадаться, надо пометить каждую строку.

Символы пробела и табуляции являются разделителями; их количество произвольно. В частности, при оформлении текстов можно пользоваться отступами, как это делается в языках типа Паскаля.

Таким же разделителем, согласно описаниям, является переход на новую строку. Тем не менее в отдельных случаях при переносе на новую строку части единой конструкции у меня иногда возникали трудности: изображение “портилось”.

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

0 0 0, 0 0.5 0, 0 1 0

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

Если верить известному киногерою Штирлицу, лучше всего запоминаются последние слова. Поэтому завершим этот раздел самым важным правилом.

Язык VRML является регистрово-зависимым, т.е. во всех конструкциях заглавные и строчные буквы различаются! Поэтому при наборе любого примера обязательно(!) обращайте внимание, где набирать заглавные, а где строчные буквы.

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

Координаты трехмерной точки представляют собой совокупность трех произвольных вещественных чисел, включая отрицательные. Часто обсуждается вопрос о том, что эти числа желательно указывать в метрах, мотивируя тем, что при слиянии двух разных миров будет соблюден относительный масштаб. Этой рекомендации не стоит уделять особого внимания, причем не только потому, что различные миры на практике редко объединяют. Гораздо существеннее, что каждый создаваемый мир имеет свой собственный характерный масштаб, которому единица измерения 1 метр не обязательно подходит: возьмите Солнечную систему или объемную модель молекулы — примеры, о которых шла речь в части 1. Поэтому более глубокий подход заключается в том, чтобы в вашем виртуальном мире выбрать некоторый характерный масштаб и принять его за единицу, а все остальные величины соотносить с ним. В частности, в Солнечной системе удобно связать единицы измерения с расстоянием от Земли до Солнца (ученые называют среднее расстояние между данными планетами астрономической единицей) или, может быть, принять за единицу весь размер Солнечной системы, т.е. максимальное удаление Плутона от Солнца.

Примечание. Интересно, что для координат предлагается иметь физическую единицу измерения, а для яркостных характеристик — нет.

Зато учитывать единицу измерения углов необходимо совершенно обязательно: все углы в VRML измеряются не в градусах, а в радианах! В частности, вместо 90° приходится писать 1.57, т.е. приближенное значение /2. Те, кто не любит стереометрию, могут составить (с помощью компьютера) таблицу для значений характерных углов.

Цвет, как и в большинстве компьютерных приложений, представляется в модели RGB. Тем не менее интенсивность компонентов указывается не в целых числах, а в дробных, заключенных к тому же в диапазоне от 0 до 1. Наиболее простые цвета выглядят так:

0.4 0.4 0.4 — оттенок серого и т.д.

Аналогично цветовым компонентам, физическим свойствам яркости, прозрачности и т.д. также ставятся в соответствие условные дробные величины от 0 до 1. Например, прозрачность 1 делает тело полностью прозрачным, 0 — абсолютно непрозрачным, а значение 0.3 задает некоторый промежуточный уровень.

3. Оси координат. Вопрос этот существенно запутали сами авторы языка. Так в версиях 1.0 и 2.0 направление оси z является противоположным (см. рисунок).

Если вы думаете, что данная деталь не очень существенна, то это не всегда так. Конечно, рассматривая симметричные тела вроде сферы или куба, вы не заметите особой разницы при изменении направления оси. Но вот, например, для текстов смена направления оси может оказаться весьма печальным преобразованием. В самом деле, пусть на параллелепипеде, моделирующем стену, имеется некоторая надпись, скажем, VRML. Тогда при изменении системы координат мы увидим следующее:

Иными словами, если раньше текст был на “передней” грани, то теперь он оказывается “сзади” стены (чтобы увидеть текст, мы ее “обошли”) и выглядит весьма экзотично. Характерно, что обе приведенные картинки есть отображения двумя разными просмотрщиками (с разными системами координат) одного и того же(!) WRL-файла.

1. Обратите также внимание на разное расположение текста по координате Y.

2. Если вы думаете, что это все неприятности, которые происходят в виртуальных мирах с текстами, то вы посмотрели не все примеры из части 1. Посетите виртуальный Мавзолей [4] и обратите внимание, как выглядит надпись над входом. И это при том, что изображение заведомо рассматривается в “родном” ПО!

Договоримся, что во всех наших примерах мы будем пользоваться системой координат, принятой в версии 2.0.

Правила описания VRML-сцен

4. Граф сцены: узлы и поля (объектная модель). Теперь, когда мы ознакомились с наиболее общими основополагающими принципами языка VRML, перейдем к изучению его конкретных конструкций. Виртуальный мир в терминологии языка называется сценой, которая представляется в виде графа из отдельных объектов, называемых узлами (node). Узлы образуют четкую структуру, которую в информатике принято называть деревом.

Рассмотрим некоторый фрагмент VRML-программы, являющийся частью одного из наших примеров, которые мы будем сегодня рассматривать. Он описывает куб, стенки которого имеют степень прозрачности 0.7 (см. пример 6.1.2).

Фактически пока мы учимся разбираться в “чужом” VRML-тексте, что всегда полезно, прежде чем начинать что-либо писать самому.

Итак, соответствующий фрагмент программы имеет следующий вид.

Первое, что в записи бросается в глаза: отдельные конструкции языка заключаются в фигурные скобки, причем скобки могут быть вложенными. Для того чтобы не запутаться в многочисленных скобках, принято использовать отступы (одинаковые для одноуровневых скобок) и комментарии со словом end, которые показывают, где какая структура заканчивается. Разумеется, все эти “дополнительные к скобкам” приемы применены исключительно для удобства чтения человеком и на изображение объемных объектов на экране никак не влияют.

Примечание. Указанные приемы позволяют писать VRML-текст с меньшим числом ошибок и, если ошибка все же допущена, быстрее ее найти. Это очень важно, поскольку программное обеспечение по отображению 3D-миров нередко просто игнорирует ошибочные конструкции или выполняет их “как-то по-своему”, а когда встроенная диагностика все же предусмотрена, она очень малоинформативна и неудобна…

Далее обратим внимание на слова, написанные с заглавной буквы (для удобства читателей они выделены жирным шрифтом), — это есть не что иное, как узлы (объекты) сцены. Проследив за расстановкой скобок, можно построить дерево узлов, приведенное на рисунке, которое и является графом некоторого фрагмента сцены. В частности, видно, что объект Shape (по-русски “фигура”, “образ”) включает в себя два объекта — Appearance (“внешность”, “наружность”) и Box (изначально “коробка”, но в компьютерной терминологии изображение на экране прямоугольника или параллелепипеда). Последний и есть собственно куб, а информация из первого позволяет куб нарисовать требуемым образом. Узел Appearance, в свою очередь, включает в себя еще один узел (“подузел”) Material, описывающий физические свойства виртуального материала, из которого состоит куб. В нашем случае материал обладает некоторым свойством прозрачности (transparency).

Как мы видим, узлы VRML неодинаковы по смыслу, например, Box и Appearance явно имеют различное предназначение. К сожалению, единая общепринятая классификация узлов как-то не сложилась, поэтому здесь мы не будем обсуждать этот вопрос.

Очень важно подчеркнуть, что с теоретической точки зрения конструкции Box, Material и другие надо называть типом узлов, а не именем! Дело в том, что если кубов будет несколько, то все они будут описываться узлом Box. Что касается уникального имени для объекта, то его в VRML также можно назначить некоторому узлу, но делать это не обязательно. О том, как выглядит синтаксис именования узлов и где он необходим, показано в примере 6.1.5.

В анализируемом фрагменте имеются еще слова, начинающиеся со строчной буквы (надеюсь, читатели помнят о важности регистра?), — appearance, material, transparency и geometry. Это поля (fields), которые являются составными частями объекта и предназначены для хранения в той или иной форме информации об устройстве объекта. Поля в VRML бывают разные, поэтому имеет смысл рассмотреть их подробнее.

Начнем “с конца”: наиболее понятным является поле transparency, имеющее значение 0.7 и принадлежащее объекту типа Material. Это пример самой простой разновидности полей — те, в которых хранятся конкретные значения. Не следует только думать, что это всегда числовое значение и что оно обязательно одно. В частности, поле может являться координатами точки, а значит, содержать в себе 3 вещественных числа (аналогичное свойство имеет место и для полей, хранящих цвет); существуют даже поля для набора координат. Кроме того, специальные поля могут хранить картинку, время и некоторые другие типы данных 3 . Полный список типов полей можно посмотреть, например, в [3].

Примечание. Поля с префиксом SF хранят только одно значение. Если же указан префикс MF, то такое поле может вмещать в себя несколько значений (аналог массива). Например, поле SFNode ссылается на один узел, а MFNode способно хранить ссылки на несколько; аналогично SFFloat хранит единственное вещественное значение, а MFFloat — целый набор таких значений.

Описанный механизм “стыковки” узлов между собой через посредство полей ведет к тому, что узлы в VRML сочетаются по строго определенным правилам, например, узел типа Material нельзя “присоединить напрямую” к узлу типа Shape (там нет для этого соответствующего поля). Причина такой избирательности, по-видимому, заключается в необходимости максимально быстрого разбора текста программы интерпретатором VRML.

Анализ приведенного рисунка, возможно, вызвал у внимательных читателей некоторое недоумение: узел Box пуст, неужели у него совсем нет полей? Конечно, есть, но тут действует еще одно важное правило, о котором мы еще не успели сказать. Любое поле объекта в VRML обязательно имеет значение по умолчанию, причем оно не обязательно нулевое или пустое. Например, стороны объекта Box по умолчанию устанавливаются равными 2 (от –1 до 1, начало координат — в центре). Если нас устраивает значение по умолчанию, то в описании соответствующее поле можно пропускать, значительно сокращая запись. Между прочим, и материал бывает не только прозрачным: объекты имеют цвет (точнее, даже несколько, в частности, рассеиваемый или цвет свечения), светимость и некоторые другие характеристики. Просто в нашем примере “задействовано” только одно свойство, поэтому все остальные пропущены и получат значения по умолчанию.

Таким образом, мы полностью разобрались в том, каким образом описывается дерево сцены. Возможно, кому-то такой способ показался утомительным. Им можно посоветовать воспользоваться программным обеспечением более высокого уровня, например, White Dune [5], о котором уже рассказывалось в части 1. Одно из ценных свойств этого ПО состоит в том, что всю “разметку” оно генерирует самостоятельно, а вам остается только в диалоге ввести значения параметров в соответствующие поля (в нашем случае — в поле transparency).

На следующем рисунке изображен фрагмент окна программы после нажатия на кнопку с изображением кубика. Разобранный нами ранее фрагмент в левой части рисунка выделен рамочкой. Видна четкая иерархия объектов, а также в правой части поля для выделенного объекта Shape их узлы-значения Appearance и Box. Если сохранить проект, то в полученном текстовом файле вы легко найдете соответствующий фрагмент, правда, без комментариев после закрывающихся скобок.

Мы не будем сейчас спорить, какой способ лучше — написание текста в Блокноте или автоматическая генерация VRML с помощью специализированной программы-редактора. Очевидно, что тем, кого интересует только результат, последний подход вполне подойдет. Но если читатели хотят, следуя заголовку статьи, понимать VRML и иметь возможность его корректировать и улучшать после универсального редактора, то не обойтись и без “ручного” набора. Оптимальное решение, как всегда, посередине: надо понимать VRML-текст и уметь его править, но какие-то рутинные операции вполне можно выполнять и в редакторе. Тем не менее на стадии первоначального понимания, на которой мы с вами находимся сейчас, лучше пока к помощи редактора не прибегать.

И еще одно замечание методического характера. Наличие иерархической структуры в виде дерева и свойств у его узлов определенно указывают на объектно-ориентированный характер VRML. И это действительно хороший пример ОО описания. Более того, автор рискует утверждать, что детальный (в духе того, как это делается в данной статье) разбор 2–3 примеров на VRML дает для понимания объектно-ориентированной модели существенно больше, нежели реализация 20–30 простейших приложений в среде Visual Basic или Delphi. Все дело в том, что хотя построение библиотеки визуальных компонентов и немыслимо без ОО подхода, но это ощущается лишь при изучении ее внутреннего устройства или при создании собственного компонента, но не в моменты написания обработчиков кнопок из 2–3 операторов. Полностью избавляя нас от необходимости набирать описания, характерные для ООП, современные системы программирования скрывают от нас его сущность, а это едва ли полезно для обучения. Мы даже порекомендовали бы тем читателям, которые интересуются вопросами ООП, после полного прочтения данной публикации составить для себя полную модель узла VRML как объекта (при этом можно дополнительно посмотреть статьи [2] и [3]).

5. Реализация динамических эффектов. Для придания трехмерным сценам каких-либо динамических эффектов используются специальные поля, которые в VRML 2.0 называются exposedField. В переводе с английского exposed означает “открытый”, “видимый”, но по смыслу наиболее хорошо к данному термину, наверное, подходит имеющийся в словаре вариант “подвергаемый воздействию”. Данные поля могут изменять свои значения под влиянием происходящих в виртуальном мире событий. Под событиями подразумевается передача информации от одного объекта другому.

Узел получает сообщения типа eventIn, которые обычно влекут за собой изменения его состояния; события такого рода обозначаются set_X (set_color, set_position) . Отправляемые узлом сообщения обычно содержат информацию об изменении его состояния (color_changed, position_changed) и имеют тип eventOut.

Поле exposedField X эквивалентно следующей конструкции:

где field — это само поле, в котором хранится значение, изменяемое по eventIn ; происходящее изменение сопровождается инициацией события eventOut . Более подробно о конкретных событиях и их цепочках написано в примере 6.1.5.

Примечание. Интересно подчеркнуть, что похожую структуру (поле, метод чтения и метод записи) имеют свойства объектов в Delphi [6]. Например, когда вы пишете X.Color:=clRed , пытаясь сделать объект X красным, то внутри системы происходит не присвоение, а вызов метода SetColor(clRed) , который не просто помещает необходимое значение во внутреннее поле FColor , но и “перекрашивает” объект.

Динамические эффекты создаются при помощи двух типов специализированных узлов: интерполяторов и сенсоров. Они объединяются в некоторый маршрут, по которому передается сообщение.

Начало цепочке событий дает какой-нибудь сенсор. Существуют различные типы сенсоров; большая часть этих узлов реагирует на воздействие на объект при помощи мыши. TouchSensor реагирует на “прикосновение”, т.е. щелчок кнопки. CylinderSensor, PlaneSensor и SphereSensor срабатывают при попытке изменения положения объекта и носят обобщенное название DragSensor. CylinderSensor срабатывает при попытке повернуть объект вокруг оси; такой сенсор применим для моделирования колеса из “Поля чудес”. В отличие от CylinderSensor SphereSensor реагирует на попытку повернуть объект в любом направлении. Как уже понятно, PlaneSensor активируется при попытке линейного перемещения объекта. Узлы ProximitySensor и VisibilitySensor генерируют сообщения о том, что виртуальная камера приблизилась к объекту на заданное расстояние или объект попал в ее поле зрения. TimeSensor представляет собой часовой механизм, отсчитывающий время до генерации события. С одним узлом может быть ассоциировано несколько сенсоров, сообщения которых обрабатываются по очереди.

Сообщение от сенсора передается интерполятору. Такое название для этого класса узлов выбрано потому, что автор VRML-сцены задает любое изменение объекта в виде нескольких промежуточных стадий, а плавным преобразование объекта становится при помощи интерполяции этих дискретных положений. Узел PositionInterpolator способен переместить объект, а OrientatonInterpolator его повернуть, но это только простейшие возможности. При помощи ScalarInterpolator можно как угодно увеличить или уменьшить любой выражаемый численно параметр: радиус, длину ребра все, что хотите. Объект можно перекрасить при помощи ColorInterpolator . Если это многогранник, то CoordinateInterpolator “перекособочит” его, а если объект сферического происхождения, то NormalInterpolator превратит его в мяч для регби или в куриное яйцо.

Для установки порядка передачи сообщений между объектами в VRML имеется директива ROUTE.
В конце файла помещаются строки следующего вида:


Посмотреть, как выглядит запись конкретных операторов, можно в примере 6.1.5.

Вот, наконец, и вся основная теория. А теперь перейдем к примерам.

6.1.1. Простейший куб. Чтобы просто получить на экране куб (аналог первой задачи для начинающего “Hello, world!” в обычном программировании), достаточно следующей простейшей программы.

#VRML V2.0 utf8
Shape <
geometry Box< >
>

На экране появится яркий светлый куб. Как уже говорилось выше, размер каждой из его сторон равен 2.0, но проверить это на практике невозможно, поскольку кроме куба на экране нет ничего (не с чем сравнить!).

6.1.2. Добавим прозрачности. Поскольку конечная цель состоит в построении сечения, необходимо сделать куб прозрачным, в противном случае сечение внутри куба увидеть не удастся. Сечением займемся позднее, а пока листинг для прозрачного куба. Он детально разобран в разделе 4, поэтому в комментариях не нуждается.

Наш куб на экране станет бледнее, поскольку теперь его грани стали прозрачными.

Примечание. В некоторых просмотрщиках прозрачный куб не виден (сам он не светится, а об источниках света мы пока не позаботились), поэтому необходимо включить режим подсветки. К сожалению, универсальную рекомендацию, как это сделать, здесь дать невозможно. В крайнем случае допишите строчку, описывающую источник света, как это делается в 6.1.4.

6.1.3. Построим сечение. Это более трудный с точки зрения языка VRML этап. Листинг, который надо добавить к предыдущему, выглядит следующим образом.

Данный текст предназначен для рисования сечения куба красного цвета, которое приведено на рисунке.

Рассмотрим описание сечения подробнее. Узел Material определяет диффузный (т.е. рассеивающийся при отражении) красный цвет (о кодировании цветов см. раздел 2). Узел IndexedFaceSet задает в пространстве плоскость, определенную соединением характерных точек. Их координаты, начиная с левой верхней вершины, помещены в поле point узле Coordinate. В данной записи стоит обратить внимание на то, как записаны “тройки” координат: они заключены в квадратные скобки, что подчеркивает множественность значений для данного типа. Далее следует поле coordIndex, которое задает порядок соединения точек. Важно заметить, что номера точек начинаются с 0, а брать их из предшествующего списка по порядку, как в данном примере, совсем необязательно. Последовательность завершается заведомо неиспользуемым значением –1; после него можно добавлять и другие плоскости, правда, в нашем примере это не требуется.

Примечания. 1. Те, кто знаком с языками программирования, несомненно, узнали в полях coord и coordIndex массив (его эквивалентное описание на Паскале выглядит так: ARRAY [0..N–1] OF RECORD X, Y, Z: REAL END) и его индекс. 2. То, что сечение на экране совместится с требуемыми гранями куба, подтвердит правильность наших знаний о координатах его вершин по умолчанию.

Наконец, установка значения FALSE в последнем поле узла под названием solid (“твердый”, “сплошной”) облегчает “закраску” плоскости: если установить его в TRUE, то сечение станет твердым и придется принимать дополнительные меры по окраске противоположной его стороны.

6.1.4. Позаботимся об освещении. Как уже было сказано в примере 6.1.2, в некоторых виртуальных мирах может оказаться слишком темно, поэтому стоит завести собственный источник освещения. Добавить его совсем просто, дописав к тексту, который у нас получился в примере 6.1.3, всего одну строку:

# Эту строку надо добавить к примеру 6.1.3!

В результате в точке (0, 0, 3) появится небольшой прожектор, который не даст нашему творению исчезнуть с экрана, даже если пользователь, который его рассматривает, случайно выключит свет в виртуальном мире.

6.1.5. Обеспечим хороший осмотр. Конечно, передвигаясь в VRML-мире с помощью мыши или клавиатуры, можно обойти наш кубик вокруг и все рассмотреть. Но есть и более приятная возможность: заставить кубик поворачиваться [2]. Если вы еще не устали, попробуем это осуществить.

Полный листинг примера приведен ниже. Чтобы сэкономить время, можно дополнить пример 6.1.4 тремя вставками текста, которые выделены жирным шрифтом.

#VRML V2.0 utf8
DEF Spin_Timer TimeSensor
loop TRUE
> # end TimeSensor

DEF Spin_Interpolator OrientationInterpolator
keyValue [0 1 0 0, 0 1 0 3.14159,
0 1 0 6.2831]
> # end OrientationInterpolator
DEF Rotating_Cube Transform
[
# 6.1.3
Shape
> # end Appearance
geometry Box< >
> # end Shape
Shape

> # end Appearance
geometry IndexedFaceSet
-1 -1 1]>
coordIndex [0 1 2 3 -1]
solid FALSE
> # end IndexedFaceSet
> # end Shape
# end 6.1.3
] # end children
> # end Tranform

# 6.1.4
SpotLight
# end 6.1.4
ROUTE Spin_Timer.fraction_changed TO Spin_Interpolator.set_fraction
ROUTE Spin_Interpolator.value_changed TO Rotating_Cube.set_rotation

Рассмотрим полученный листинг подробнее.

Первый из добавляемых объектов TimeSensor обеспечивает периодическую (благодаря значению поля loop 5 ) подачу сигналов для очередного поворота. Скорость вращения можно регулировать значением поля cycleInterval.

Примечание. Конструкция DEF Spin_Timer TimeSensor демонстрирует присвоение создаваемому узлу типа TimeSensor выбранного нами имени Spin_Timer. Наличие имени узла в VRML, как мы знаем, не является обязательным. И хотя до сих пор мы обходились без имен объектов, в данном случае они совершенно необходимы для последующего описания маршрута передачи информации между узлами.

Срабатывание таймера передается следующему объекту OrientationInterpolator. Его поле keyValue представляет собой массив возможных значений изменяемого (интерполируемого) параметра. В данном случае этот параметр есть набор значений для поля rotation узла Transform (т.е. начальной установки нашего куба с сечением). Каждый поворот задается четверкой чисел: первые три выбирают оси вращения (набор 0 1 0, который используется, описывает поворот вокруг “второй” оси Y) и угол поворота в радианах (0, и 2 ). Использование интерполяции позволяет задать всего три положения объекта начальное, конечное и одно промежуточное. Поле key определяет временныRе характеристики вращения: в нашем случае переход от одного положения к другому происходит равномерно.

Примечание. Очень советую загрузить данный VRML-файл в программу White Dune и выделить рассматриваемый узел: в нижней части окна вы увидите графическое отображение процесса движения и сможете его “проиграть”.

Интерполятор будет воздействовать на узел Rotating_Cube, в котором путем “подключения” к полю children (“дети” типичный образчик терминологии в ООП-наследовании!) сгруппированы уже знакомые нам два узла типа Shape с кубом и его сечением. Здесь все осталось по-старому, не забудьте только добавить закрывающие скобки в конце описания объединенного узла.

Наконец, в последних строках файла строится маршрут (ROUTINE) передачи сообщений для описываемого динамического события. Отчетливо просматривается цепочка узлов Spin_Timer ® Spin_Interpolator ® Rotating_Cube (вот где потребовались данные нами ранее имена узлов!), передающая изменения от одного события к другому.

Как видно из приведенного выше описания, усилий для создания вращения потребовалось много, но они того стоили!

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

Размеры основных (сферических) частей снеговика и его итоговый вид представлены на рисунке. Посмотрим, как это выглядит на VRML.

6.2.1. Самое первое решение. На первом этапе создадим изображение, руководствуясь исключительно простотой действий и не обращая пока внимание на оптимальность результатов. “Платой” за такой подход всегда является хотя и легко читаемая, но чрезвычайно громоздкая программа. Тем не менее в обучении такой подход часто бывает оправдан, поскольку можно быстро увидеть результат. А оптимизацией займемся в следующем разделе.

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

Нетрудно видеть, что снеговик состоит из 5 сфер. В соответствии с этим в листинге 5 из 8 фрагментов очень похожи. Мы рассмотрим только один из них; поскольку первая (нижняя) сфера не является типичной (она имеет центр в начале координат и единичный радиус см. рисунок), мы обратимся ко второй. Ее описание легко найти в тексте по комментарию middle.

Фрагмент, описывающий “средний” ком снеговика, начинается с узла типа Transform. Его назначение состоит в задании геометрических характеристик изображения объекта-потомка, в частности, наиболее часто используется его поле translation. В нашем случае это поле содержит тройку чисел
0 1.7 0, что является набором координат для центра рассматриваемой сферы. Таким способом обеспечивается позиционирование нашей сферы в виртуальном пространстве.

К описанному выше узлу через поле children подсоединяется стандартный узел типа Shape, описывающий уже знакомым нам образом сферу. Отметим только, что, кроме диффузного белого цвета снеговика, мы добавили ему еще некоторую “подсветку изнутри” с помощью поля emissiveColor. Желающие могут проверить, насколько хуже будет выглядеть снеговик без этой в общем-то не очень логичной меры.

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

Гораздо больший интерес представляют конический красный (VRML-цвет 1 0 0) нос, имитирующий традиционную морковку, и цилиндрические глаза.

Обратимся к описанию носа. Поскольку по умолчанию конус строится вершиной вверх, а нос снеговика требуется по понятным причинам направить “вперед”, необходимо произвести поворот конуса. Поле rotation обеспечивает это. Как мы уже видели в примере 6.1.5, поворот характеризуется набором из четырех чисел: тройка 1 0 0 описывает поворот вокруг оси X на 1.57 радиан, т.е. на 90°.

С аналогичным поворотом строятся и оба цилиндрических глаза черного (0.1 0.1 0.1) цвета.

Автор надеется, что опыт, полученный читателями при разборе и реализации предыдущих примеров, позволит легко “прочитать” предлагаемую VRML-программу.

6.2.2. Займемся оптимизацией. Анализируя программу, вы, вероятно, обратили внимание на то, что образующие снеговика сферы описываются практически идентичным текстом, отличающимся лишь числовыми значениями, которые задают радиус и положение центра сферы. Возникает естественное желание как-то оформить общую часть и затем обращаться к ней, указывая конкретные значения параметров.

Для таких целей в VRML предусмотрен специальный механизм прототипы. При создании прототипа мы соберем в него общее описание сферического объекта, а затем будем ссылаться на него, указывая конкретные числовые значения параметров.

Давайте удалим текст VRML-программы, соответствующий пяти сферам, а вместо него наберем следующий листинг.

Примечание. Одно из описаний можно оставить и из него сформировать прототип.

PROTO KOM[field SFVec3f p 0 0 0
field SFFloat r 1
]
<
Transform
children
[Shape
emissiveColor 0.5 0.5 0.5
> # end Material
> # end Appearance
geometry Sphere

> # end Shape
] # end children
> # end Transform
> # end KOM
KOM <>
KOM

KOM

KOM

KOM

Описание прототипа открывается служебным словом PROTO, за которым следует имя прототипа. В нашем случае это KOM, набранное обязательно (!) латинскими буквами. Далее в квадратных скобках описываются параметры прототипа, которые можно будет в дальнейшем задавать при обращении к нему.

Описание параметров-полей заслуживает того, чтобы познакомиться с ним поподробнее. После стандартного ключевого слова field (как вы, наверное, помните, field и означает поле) следует его тип, имя и значение поля по умолчанию. В нашем случае имеется два поля позиция центра сферы p и ее радиус r. Первый имеет тип SFVec3f, т.е. одно значение трехмерного вектора, которое, естественно, задается тремя вещественными числами. Радиус сферы имеет (единственное) вещественное значение SFFloat. Указанные значения по умолчанию традиционны для VRML, кроме того, они полностью соответствуют нижнему кому снеговика.

Далее следует (заключенный в фигурные скобки) стандартный текст описания сферы из виртуального снега, уже хорошо нам знакомый. Единственное отличие заключается в написании полей, в которые подставляются параметры. Например, для центра сферы это выглядит так:

translation IS p

— где IS это служебное слово, показывающее необходимость подстановки значения параметра p. По смыслу эта запись означает, что в поле translation необходимо поместить то значение, которое при обращении будет указано для параметра p. А само обращение к прототипу KOM, показанное в конце фрагмента, настолько очевидно, что особых комментариев не требует.

Примечание. Те из читателей, кто знаком с языком программирования вроде Паскаля, конечно, узнали в описанном механизме обращение к процедуре с параметрами. Все-таки как полезно уметь программировать при работе на компьютере! Это может пригодиться в самых неожиданных местах.

В качестве упражнения можем порекомендовать читателям оформить описание глаза снеговика в виде прототипа. Обратите внимание на тот факт, что для глаза радиус не является внешним параметром (в отличие от комьев оба глаза одинаковы), поэтому его стоит по-прежнему оставить в виде конкретной константы.

Что же мы получили в итоге всей этой оптимизации с прототипами? Программу, которая в несколько раз короче, и знание механизма, который позволяет компактно описывать однотипные объекты. Эти объекты даже можно вынести в отдельный файл; тогда они будут называться EXTERNPROTO. Об использовании данной возможности языка VRML можно почитать в [7].

И в заключение еще одно замечание по поводу технологий. Мы можем сделать снеговика, используя готовые технологии, например, многократно упоминавшуюся программу White Dune. При этом даже вообще не обязательно знать правила записи VRML. Но результат, который получится, будет эквивалентен листингу в 6.2.1. Тем не менее получение эффективного результата требует понимания сущности и правил устройства технологии, что в очередной раз подтвердил пример 6.2.2.

6.3. Еще примеры: короткие, но интересные. В заключение приведем еще пару коротеньких листингов, демонстрирующих некоторые интересные возможности VRML.


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

А вот как это выглядит:

6.3.2. Да будет звук! И еще один прекрасный пример компактной VRML-программы [3], описывающей шарик, который издает звук, когда на него наталкивается наблюдатель.

#VRML V2.0 utf8
DEF SphereWithSound Collision
[Shape

>
Sound
«boom.wav»>
>
]
>
ROUTE SphereWithSound.collideTime TO BoomSound.startTime

Разумеется, в том же каталоге должен лежать звуковой файл “boom.wav”.

Как это можно использовать

Приведенные в публикации материалы могут быть полезны не только учителям информатики при рассказе о современных 3D-технологиях компьютерной графики. Автор надеется, что изложенная теория и разобранные примеры позволят творческим учителям организовать своих учеников на изготовление простейших электронных ресурсов по стереометрии, астрономии, химии, физике и другим школьным предметам. Одна из целей части 1 публикации как раз и состояла в том, чтобы показом ярких возможностей VRML разбудить фантазию. А в части 2 публикации кратко познакомить с тем, как подобные материалы можно разрабатывать.

Не сомневаюсь, что при наличии интереса читатели смогут своими силами создать действительно наглядные, красивые и практически полезные VRML-объекты и даже простейшие виртуальные миры (вроде музейных залов, на стенах которых вместо картин развешены портреты ученых или математические формулы, или “фотографии” экзотической планеты). Желаю всяческих творческих успехов на данном поприще!

Ссылки

1. Teaching Teaching & Understanding Understanding. http://www.daimi.au.dk/

6. Конопка Р. Создание оригинальных компонент в среде Delphi. Киев: НИПФ-ДиаСофт Лтд., 1996, 512 с.

1 Разумеется, версия 2.0 тоже представлена, просто там труднее сосчитать полное количество узлов.

2 В файлах с описанием внешних прототипов сцена, как правило, отсутствует.

3 Существует также особый класс полей exposedField, о которых речь впереди.

4 Мой редактор усиленно рекомендует “удалить повторяющееся слово” .

5 Loop по-английски означает “петля”; в компьютерной терминологии это общепринятое название цикла.

Национальная библиотека им. Н. Э. Баумана
Bauman National Library

Персональные инструменты

VRML (Virtual Reality Modeling Language)

  • .wrl (plain)
  • .wrz (compression)
  • model/vrml
  • x-world/x-vrml
  • application/x-cc3d
Тип формата 3D computer graphics Расширенный от Labyrinth Стандарт ISO/IEC 14772-1:1997 Веб-сайт http://www.web3d.org/

VRML (англ. Virtual Realit Modeling Language ) — язык моделирования виртуальной реальности) — стандартный формат файлов для демонстрации трёхмерной интерактивной векторной графики, чаще всего используется в веб-технологиях. VRML предназначен для описания трехмерных изображений и оперирует объектами, описывающими геометрические фигуры и их расположение в пространстве. VRML дает разработчику возможность не только проектировать статические и динамические 3D модели, он также позволяет включать и обрабатывать в этих моделях гиперссылки на звуковые, видео, html-файлы и другие VRML объекты. Поскольку большинство браузеров не имеет встроенных средств поддержки VRML, для просмотра vrml-документов необходимо подключить вспомогательную программу – vrml-браузер. Первая версия VRML была выпущена в ноябре 1994 года. Эта версия была основана на API и файловом формате программной компоненты Open Inventor, изначально разработанной в SGI. Текущая и функционально завершенная версия — VRML97 (ISO/IEC 14772-1:1997). Сейчас VRML вытесняется форматом X3D (ISO/IEC 19775-1).

Содержание

История создания и развития VRML

В январе 1994 года, Mark Pesce и Tony Parisi придумывают концепцию трехмерного HTML, своеобразного языка описания трехмерных сцен с поддержкой гиперссылок, и создают пакет программ и экспериментальный формат, названные ими Labyrinth — первый прообраз VRML. Весной 1994 года на первой ежегодной конференции по World Wide Web в Женеве участники конференции согласились иметь общий язык для определения 3-мерного описания и гиперсвязей для всемирной паутины — аналога HTML для виртуальной действительности. Так впервые возник термин Virtual Reality Markup Language (VRML), где слово «Markup» вскоре было заменено на «Modelling» чтобы отразить графическую природу VRML (в литературе встречаются и другие варианты расшифровки, в частности Virtual Reality Meta Language, однако сочетание Virtual Reality Modelling Language является не только наиболее устоявшимся. Были также сформулированы основные требования, которым он должен был удовлетворять: независимость от компьютерной платформы, расширяемость и возможность работы по низкоскоростным каналам связи. Вскоре Silicon Graphics публично заявила об открытости технологии и анонсировала разработку средств просмотра. Выразительные возможности языка VRML 1.0, были крайне бедны. С его помощью можно было описывать только полигональные статические сцены с гиперссылками. В 1996 г. международным vrml-сообществом был объявлен конкурс на лучший вариант спецификации следующей версии языка, получившей название VRML 2.0 и утвержденной в августе 1996 г. Самым главным отличием, помимо изменения структуры дерева трехмерной сцены и добавления большого количества новых узлов, стало введение в язык средств динамического изменения сцены и интерактивного взаимодействия с пользователем. Самым главным новшеством была возможность моделировать не только внешний вид объектов, но и программировать сколь угодно сложное их поведение. Появились возможности управления не только расположением текстур на объекте (mapping), но и анимации этих текстур для достижения реалистичности, например, при изображении воды. Вторая версия VRML стала намного сложнее первой. Если сначала можно было программировать движение фигур в простом текстовом редакторе (подобно первым алгоритмам двумерной компьютерной графики), на второй стадии потребовались специальные редакторы для создания vrml-объектов в vrml-файлах. В 1998 г. незначительно переработанная спецификация VRML 2.0 под названием VRML 97 была принята в качестве официального стандарта ISO/IEC 1477. Появление VRML 2.0 вызвало всплеск интереса к 3D в Сети как у пользователей, так и у разработчиков. В течение нескольких месяцев после принятия спецификации было разработано большое количество программ просмотра (браузеров) VRML 2.0. Можно конвертировать трехмерные объекты из 3D Studio Max или AutoCAD.

Компания SGI возобновила свой интерес к VRML, купив ParaGraph International и выпустив программные продукты Cosmo Player и Cosmo World Builder. Однако менее чем через год фирма перестала поддерживать этот стандарт. Когда SGI сложила с себя бразды правления, спецификация поплыла в неопределенном направлении. Пытаясь омолодить спецификацию, VRML Consortium был переименован в Web3D Consortium. Затем Web3D Consortium объявил о слиянии с World Wide Web Consortium (W3C). Тем самым они надеялись интегрировать VRML с другими сетевыми стандартами, такими как XHTML, XML, SVG, DOM, и SMIL. Очередной удар VRML получил в начале 1999 года, когда фирма Platinum Technologies — один из ранних разработчиков VRML браузеров, отказалась от поддержки, в качестве последнего жеста доброй воли, объявила об открытии своих технологий для open source community. Имелась надежда, что превращение VRML в открытый проект (как это было в самом начале), возобновит интерес к VRML тысяч новых независимых разработчиков. Но прежде чем Platinum успела опубликовать свои коды, она была куплена компанией Computer Associates, и исходники так и не были открыты. Чем можно объяснить, что этот стандарт перестал развиваться? Основной причиной являлось преждевременность его появления. В настоящее время появляется много новых 3D технологий. Некоторые из этих новых технологий лучше, быстрее, чем их vrml-предшественники. Некоторые из новых продуктов проще в использовании, некоторые включают новые интересные возможности. Однако в основе большинства из них лежит VRML 2.0. MPEG-4 Interactive Profile (ISO/IEC 14496) был основан на VRML (теперь на X3D) и X3D, по большей части, обратно-совместим с ним. VRML также продолжает использоваться в качестве файлового формата для обмена 3D-моделями, особенно в САПР. Хотя VRML ещё продолжает использоваться в некоторых областях, особенно в образовательной и исследовательской сфере, где наиболее ценятся открытые спецификации, можно сказать, что он вытеснен форматом X3D X3D — это стандарт ISO, предназначенный для работы с трёхмерной графикой в реальном времени. X3D — это наследник VRML. X3D является расширением VRML. В X3D возможно кодировать сцену используя синтаксис XML, равно как и Open Inventor — подобный синтаксис VRML97, а также расширенный интерфейс прикладного программирования (API).

VRML-файл

VRML-файл представляет собой обычный текстовый файл в формате ASCII с расширением .wrl, интерпретируемый браузером, где, например, вершины и грани многогранников могут указываться вместе с цветом поверхности, текстурами, блеском, прозрачностью и так далее. URL могут быть связаны с графическими компонентами, таким образом, что веб-браузер может получать веб-страницу или новый VRML-файл из сети Интернет тогда, когда пользователь щёлкает по какому-либо графическому компоненту. Движение, звуки, освещение и другие аспекты виртуального мира могут появляться как реакция на действия пользователя или же на другие внешние события, например таймеры. Особый компонент Script Node позволяет добавлять программный код (например, Java или JavaScript (ECMAScript)) к VRML-файлу.
VRML-файлы обычно называются мирами и имеют расширение .wrl (например: island.wrl). Хотя VRML-миры используют текстовый формат они часто могут быть сжаты с использованием алгоритма компрессии gzip для того, чтобы их можно было передавать по сети за меньшее время. Большинство программ трёхмерного моделирования могут сохранять объекты и сцены в формате VRML.

Единицы измерения

В VRML приняты следующие единицы измерения:

9. Трансформации объектов

В среде Мах с любым объектом, набором нескольких объектов или группой можно производить три базовые операции преобразований — Move, Rotate и Scale (Перемещение, Поворот и Масштабирование), которые объединены одним общим термином — Transforms (Трансформации). Все трансформации назначены соответствующим кнопкам в Main Toolbar (Основной Панели), а Scale (Масштабирование) — списку кнопок. Преобразование перемещения позволяет изменять положение объекта в трехмерном пространстве, поворота -его ориентацию и масштабирования — линейные размеры объекта. Причем последнее преобразование может быть трех видов:

  • Uniform (Однородное) — равномерное масштабирование по трем координатным осям X,Y, Z;
  • Non-Uniform (Неоднородное) — выполняется по одной из осей или плоскостей объекта;
  • Squash (Сплющивание) — взаимно противоположное одновременное масштабирование по одной из осей и плоскости двух других, или наоборот.

Все команды трансформаций продублированы в контекстном меню объекта и могут быть вызваны правым щелчком на выбранном объекте.

Обычно выполнение преобразований с объектами сцены выполняется с приблизительной точностью («на глаз») в соответствии с визуальным восприятием положения, ориентации или масштаба. Однако, существуют случаи, когда необходим точный ввод параметров, для осуществления которого и служит способ Type-In (Точный Ввод). Соответствующее диалоговое окно может быть вызвано через пункт Transform Type-In (Точный Ввод Параметров Трансформаций) падающего меню Tools. В зависимости от типа выбранной трансформации, вызывается окно Move, Rotate или Scale Transform Type-In (Перемещение, Поворот или Масштабирование), которое содержит две группы счетчиков — Absolute : World (Абсолютные : Мировые Координаты) и Offset : Screen (Приращения : Экранные Координаты) (рис. 4.14).

РИСУНОК 4.14. Точный Ввод Параметров

Первоначально, при вызове этого окна в счетчиках первой группы отображаются точные значения положения выбранного объекта в трехмерном пространстве, его ориентация. При переключении на другой вид трансформаций (используя соответствующие модальные кнопки в Main Toolbar (Основной Панели) или через вызов контекстного меню редактируемого объекта) окно Type-In сразу же изменяется на соответствующее.

Дополнительными средствами, управляющими параметрами трансформаций в Мах, являются Restriction (Ограничения), задаваемые группой модальных кнопок, Reference Coordinate System (Координатная Система), выбираемая из списка кнопок. Все они расположены на панели инструментов Axis Constraints (Ограничения осей) (рис. 4.15). Еще один список кнопок Point Center (Центр Трансформаций), предназначенный для управления трансформациями, находится на Main Toolbar (Основной Панели).

РИСУНОК 4.15. Группа кнопок Ограничений Остановимся на каждом из них подробнее.

Общие сведения о классах Transform Transforms Overview

В этом разделе описано, как использовать двумерные Transform классы для вращения, масштабирования, перемещения (преобразования) и наклона FrameworkElement объектов. This topic describes how to use the 2-D Transform classes to rotate, scale, move (translate), and skew FrameworkElement objects.

Что такое преобразование? What Is a Transform?

Transform определяет, как сопоставлять или преобразовывать точки из одного пространства координат в другое пространство координат. A Transform defines how to map, or transform, points from one coordinate space to another coordinate space. Это сопоставление описывается Matrixпреобразования, которое представляет собой коллекцию из трех строк с тремя столбцами Double значений. This mapping is described by a transformation Matrix, which is a collection of three rows with three columns of Double values.

В Windows Presentation Foundation (WPF) используются основные матрицы строк. Windows Presentation Foundation (WPF) uses row-major matrices. Векторы представляют собой массивы на основе строк, а не на основе столбцов. Vectors are expressed as row-vectors, not column vectors.

В следующей таблице показана структура матрицы WPF WPF . The following table shows the structure of a WPF WPF matrix.

Матрица двумерного преобразования A 2-D transformation matrix


По умолчанию: 1.0 Default: 1.0 M12

По умолчанию: 0.0 Default: 0.0 0,0 0.0 M21

По умолчанию: 0.0 Default: 0.0 M22

По умолчанию: 1.0 Default: 1.0 0,0 0.0 OffsetX

По умолчанию: 0.0 Default: 0.0 OffsetY

По умолчанию: 0.0 Default: 0.0 1,0 1.0

Изменяя значения элементов матрицы, можно поворачивать, масштабировать, наклонять и перемещать объект. By manipulating matrix values, you can rotate, scale, skew, and move (translate) an object. Например, если изменить значение в первом столбце третьей строки (значение OffsetX) на 100, можно использовать его для перемещения объектов 100 по оси x. For example, if you change the value in the first column of the third row (the OffsetX value) to 100, you can use it to move an object 100 units along the x-axis. Если изменить значение во втором столбце второй строки на 3, можно использовать его для растяжения объекта в три раза больше по сравнению с текущим размером. If you change the value in the second column of the second row to 3, you can use it to stretch an object to three times its current height. Если изменить оба значения, объект будет перемещен на 100 единиц по оси X, а его ширина будет увеличена в 3 раза. If you change both values, you move the object 100 units along the x-axis and stretch its height by a factor of 3. Поскольку Windows Presentation Foundation (WPF) поддерживает только аффинное преобразование, значения в правом столбце всегда имеют значение 0, 0, 1. Because Windows Presentation Foundation (WPF) only supports affine transforms, the values in the right column are always 0, 0, 1.

Хотя Windows Presentation Foundation (WPF) позволяет напрямую манипулировать значениями матрицы, она также предоставляет несколько Transform классов, позволяющих преобразовывать объект, не зная, как настроена базовая структура матрицы. Although Windows Presentation Foundation (WPF) enables you to directly manipulate matrix values, it also provides several Transform classes that enable you to transform an object without knowing how the underlying matrix structure is configured. Например, класс ScaleTransform позволяет масштабировать объект, устанавливая его свойства ScaleX и ScaleY, вместо того, чтобы манипулировать матрицей преобразования. For example, the ScaleTransform class enables you to scale an object by setting its ScaleX and ScaleY properties, instead of manipulating a transformation matrix. Аналогичным образом класс RotateTransform позволяет поворачивать объект, просто устанавливая его свойство Angle. Likewise, the RotateTransform class enables you to rotate an object by just setting its Angle property.

Классы преобразования Transform Classes

Windows Presentation Foundation (WPF) предоставляет следующие двумерные классы Transform для общих операций преобразования: Windows Presentation Foundation (WPF) provides the following 2-D Transform classes for common transformation operations:

Class Class Описание Description Пример Example Рисунки Illustration
RotateTransform Поворачивает элемент на указанный Angle. Rotates an element by the specified Angle. Вращение объекта Rotate an Object
ScaleTransform Масштабирует элемент по заданному ScaleXу и ScaleYным суммам. Scales an element by the specified ScaleX and ScaleY amounts. Масштабирование элемента Scale an Element
SkewTransform Наклоняет элемент на указанное количество AngleX и AngleY. Skews an element by the specified AngleX and AngleY amounts. Наклон элемента Skew an Element
TranslateTransform Перемещает (преобразует) элемент на заданную X и Y суммы. Moves (translates) an element by the specified X and Y amounts. Перемещение элемента Translate an Element

Для создания более сложных преобразований Windows Presentation Foundation (WPF) предоставляет следующие два класса: For creating more complex transformations, Windows Presentation Foundation (WPF) provides the following two classes:

Class Class Описание Description Пример Example
TransformGroup Группирует несколько TransformGroup объектов в одну Transform, которую затем можно применить к свойствам преобразования. Groups multiple TransformGroup objects into a single Transform that you can then apply to transform properties. Применение нескольких преобразований к объекту Apply Multiple Transforms to an Object
MatrixTransform Создает пользовательские преобразования, которые не предоставляются другими классами Transform. Creates custom transformations that are not provided by the other Transform classes. При использовании MatrixTransformвы напрямую управляете матрицей. When you use a MatrixTransform, you manipulate a Matrix directly. Использование MatrixTransform для создания пользовательских преобразований Use a MatrixTransform to Create Custom Transforms

Windows Presentation Foundation (WPF) также предоставляет трехмерные преобразования. Windows Presentation Foundation (WPF) also provides 3-D transformations. Дополнительные сведения см. в описании класса Transform3D. For more information, see the Transform3D class.

Общие свойства преобразования Common Transformation Properties

Один из способов преобразования объекта — объявить соответствующий тип Transform и применить его к свойству преобразования объекта. One way to transform an object is to declare the appropriate Transform type and apply it to the transformation property of the object. У различных типов объектов есть различные типы свойств преобразования. Different types of objects have different types of transformation properties. В следующей таблице перечислены несколько часто используемых типов Windows Presentation Foundation (WPF) и их свойства преобразования. The following table lists several commonly used Windows Presentation Foundation (WPF) types and their transformation properties.

Type Type Свойства преобразования Transformation properties
Brush Transform, RelativeTransform Transform, RelativeTransform
ContainerVisual Transform
DrawingGroup Transform
FrameworkElement RenderTransform, LayoutTransform RenderTransform, LayoutTransform
Geometry Transform
TextEffect Transform
UIElement RenderTransform

Преобразования и системы координат Transformations and Coordinate Systems

При преобразовании объекта преобразуется не только объект, но и пространство координат, в котором он существует. When you transform an object, you do not just transform the object, you transform coordinate space in which that object exists. По умолчанию в качестве центральной точки для преобразования используется начало системы координат целевого объекта: (0, 0). By default, a transform is centered at the origin of the target object’s coordinate system: (0,0). Единственным исключением является TranslateTransform. у TranslateTransform нет свойств центра для установки, так как результат перевода одинаков, независимо от того, где он находится в центре. The only exception is TranslateTransform; a TranslateTransform has no center properties to set because the translation effect is the same regardless of where it is centered.

В следующем примере используется RotateTransform для поворота элемента Rectangle, типа FrameworkElement, на 45 градусов относительно центра по умолчанию, (0, 0). The following example uses a RotateTransform to rotate a Rectangle element, a type of FrameworkElement, by 45 degrees about its default center, (0, 0). На следующем рисунке показан результат поворота. The following illustration shows the effect of the rotation.

Элемент Rectangle, повернутый на 45 градусов относительно точки (0,0) A Rectangle element rotated 45 degrees about the point (0,0)

По умолчанию элемент поворачивается относительно левого верхнего угла: (0, 0). By default, the element rotates about its upper-left corner, (0, 0). Классы RotateTransform, ScaleTransformи SkewTransform предоставляют свойства CenterX и Center, позволяющие указать точку, в которой применяется преобразование. The RotateTransform, ScaleTransform, and SkewTransform classes provide CenterX and CenterY properties that enable you to specify the point at which the transform is applied.

В следующем примере также используется RotateTransform для поворота элемента Rectangle на 45 градусов; Однако на этот раз свойства CenterX и CenterY задаются так, чтобы у RotateTransform был центр (25, 25). The next example also uses a RotateTransform to rotate a Rectangle element by 45 degrees; however, this time the CenterX and CenterY properties are set so that the RotateTransform has a center of (25, 25). На следующем рисунке показан результат поворота. The following illustration shows the effect of the rotation.

Элемент Rectangle, повернутый на 45 градусов относительно точки (25, 25) A Rectangle element rotated 45 degrees about the point (25, 25)

Преобразование элемента FrameworkElement Transforming a FrameworkElement

Чтобы применить преобразования к FrameworkElement, создайте Transform и примените его к одному из двух свойств, предоставляемых классом FrameworkElement. To apply transformations to a FrameworkElement, create a Transform and apply it to one of the two properties that the FrameworkElement class provides:

LayoutTransform — преобразование, которое применяется перед проходом макета. LayoutTransform – A transform that is applied before the layout pass. После применения преобразования система разметки обрабатывает преобразованные размер и положение элемента. After the transform is applied, the layout system processes the transformed size and position of the element.

RenderTransform — преобразование, изменяющее внешний вид элемента, но применяемое после завершения прохода макета. RenderTransform – A transform that modifies the appearance of the element but is applied after the layout pass is complete. Используя свойство RenderTransform, а не свойство LayoutTransform, можно получить преимущества производительности. By using the RenderTransform property instead of the LayoutTransform property, you can obtain performance benefits.

Какое свойство следует использовать? Which property should you use? Из-за преимуществ производительности, предоставляемых ею, используйте свойство RenderTransform, если это возможно, особенно при использовании анимированных объектов Transform. Because of the performance benefits that it provides, use the RenderTransform property whenever possible, especially when you use animated Transform objects. Используйте свойство LayoutTransform при масштабировании, повороте или наклоне, а также необходимо, чтобы родительский элемент элемента подпревратился в преобразованный размер элемента. Use the LayoutTransform property when scaling, rotating, or skewing and you need the parent of the element to adjust to the transformed size of the element. Обратите внимание, что при использовании со свойством LayoutTransform TranslateTransform объекты не оказывают влияния на элементы. Note that, when they are used with the LayoutTransform property, TranslateTransform objects appear to have no effect on elements. Это вызвано тем, что система разметки возвращает преобразуемый элемент в исходное положение в ходе обработки. That is because the layout system returns the translated element to its original position as part of its processing.

Дополнительные сведения о разметке в Windows Presentation Foundation (WPF) Windows Presentation Foundation (WPF) см. в разделе Общие сведения о разметке. For additional information about layout in Windows Presentation Foundation (WPF) Windows Presentation Foundation (WPF) , see Layout overview.

Пример: поворот элемента FrameworkElement на 45 градусов Example: Rotate a FrameworkElement 45 Degrees

В следующем примере используется RotateTransform для поворота кнопки по часовой стрелке на 45 градусов. The following example uses a RotateTransform to rotate a button clockwise by 45 degrees. Кнопка содержится в StackPanel с двумя другими кнопками. The button is contained in a StackPanel that has two other buttons.

По умолчанию RotateTransform поворачивается относительно точки (0, 0). By default, a RotateTransform rotates about the point (0, 0). Так как в примере не задана центральная точка, то кнопка поворачивается вокруг точки (0, 0), т. е. левого верхнего угла. Because the example does not specify a center value, the button rotates about the point (0, 0), which is its upper-left corner. RotateTransform применяется к свойству RenderTransform. The RotateTransform is applied to the RenderTransform property. На рисунке ниже показан результат преобразования. The following illustration shows the result of the transformation.

Поворот на 45 градусов по часовой стрелке вокруг левого верхнего угла Clockwise rotation 45 degrees from upper-left corner

В следующем примере также используется RotateTransform для поворота кнопки 45 градусов по часовой стрелке, но также устанавливается RenderTransformOrigin для кнопки (0,5, 0,5). The next example also uses a RotateTransform to rotate a button 45 degrees clockwise, but it also sets the RenderTransformOrigin of the button to (0.5, 0.5). Значение свойства RenderTransformOrigin задается относительно размера кнопки. The value of the RenderTransformOrigin property is relative to the size of the button. В результате кнопка поворачивается вокруг центра, а не вокруг левого верхнего угла. As a result, the rotation is applied to the center of the button, instead of its upper-left corner. На рисунке ниже показан результат преобразования. The following illustration shows the result of the transformation.

Поворот на 45 градусов по часовой стрелке вокруг центра Clockwise rotation 45 degrees around center

В следующем примере для поворота кнопки используется свойство LayoutTransform, а не свойство RenderTransform. The following example uses the LayoutTransform property instead of the RenderTransform property to rotate the button. При этом преобразование влияет на разметку кнопки, что приводит к запуску полного прохода системы разметки. This causes the transformation to affect the layout of the button, which triggers a full pass by the layout system. Так как размер кнопки был изменен, то после поворота кнопки также изменяется ее положение. As a result, the button is rotated and then repositioned because its size has changed. На рисунке ниже показан результат преобразования. The following illustration shows the result of the transformation.

Поворот кнопки с использованием LayoutTransform LayoutTransform used to rotate the button

Анимация преобразований Animating Transformations

Поскольку они наследуются от класса Animatable, классы Transform могут быть анимированы. Because they inherit from the Animatable class, the Transform classes can be animated. Чтобы анимировать Transform, примените анимацию совместимого типа к свойству, которое необходимо анимировать. To animate a Transform, apply an animation of a compatible type to the property you want to animate.

В следующем примере используется Storyboard и DoubleAnimation с RotateTransform, чтобы Button при нажатии прокрутки. The following example uses a Storyboard and a DoubleAnimation with a RotateTransform to make a Button spin in place when it is clicked.

Полный пример см. в разделе Примеры двумерных преобразований. For the complete sample, see 2-D Transforms Sample. Дополнительные сведения об анимации см. в разделе Общие сведения об эффектах анимации. For more information about animations, see the Animation Overview.

Возможности объектов Freezable Freezable Features

Так как он наследуется от класса Freezable, класс Transform предоставляет несколько специальных функций: Transform объекты могут быть объявлены как ресурсы, совместно использоваться несколькими объектами, как доступные только для чтения, чтобы повысить производительность, клонировать и сделать потокобезопасными. Because it inherits from the Freezable class, the Transform class provide several special features: Transform objects can be declared as resources, shared among multiple objects, made read-only to improve performance, cloned, and made thread-safe. Дополнительные сведения о различных функциях, предоставляемых Freezable объектами, см. в разделе Общие сведения об объектах Freezable. For more information about the different features that are provided by Freezable objects, see the Freezable Objects Overview.

Построение примитивов в VRML

Язык построения трехмерных сцен VRML имеет свои отличительные стороны. Это выражается в построении кода и структуре файла VRML сцены.

Файл VRML всегда начинается с заголовка:

Заголовок сообщает браузеру, что перед ним VRML файл, а также версию и кодировку файла.

VRML-мир описывается при помощи иерархического графа сцены. Основные строительные объекты графа называются узлами (nodes). В VRML97 определены 54 типа узлов. Среди них – геометрические примитивы, узлы, определяющие внешний вид объектов, узлы звука и его свойств, несколько типов группирующих узлов. Внутри узлов находятся поля, хранящие свойства объекта. В VRML97 есть 20 типов полей. В них может храниться что угодно, от размера куба до еще одного узла. Узлы записываются следующим образом:

Узел Group – простейший узел, он просто группирует вместе другие узлы [3].

В VRML существует основные четыре типа геометрических примитивов. Это прямоугольный параллелепипед (Box), цилиндр (Cylinder), сфера (Sphere) и конус (Cone). Форму каждого из этих примитивов представить несложно, это обычный прямоугольный параллелепипед или куб, цилиндр, сфера, конус. Единственная разница между ними это способ описания, он индивидуален для каждого примитива.

Узел Box со всеми параметрами по умолчанию – это куб со стороной 2 метра, центром в начале координат и сторонами параллельными координатным осям. В этом случае Box будет описываться так:

Vrml’97 примитивы и управление положением объектов (transform)

Язык VRML (Virtual Realty Modelling Languagy) предназначен для описания трехмерных изображений и оперирует объектами, описывающими геометрические фигуры и их расположение в пространстве.

Vrml-файл представляет собой обычный текстовый файл, интерпретируемый браузером. Поскольку большинство браузеров не имеет встроенных средств поддержки vrml, для просмотра Vrml-документов необходимо подключить вспомогательную программу — Vrml-браузер, например, Live3D или Cosmo Player.


Как и в случае с HTML, один и тот же vrml-документ может выглядеть по-разному в разных VRML-браузерах. Кроме того, многие разработчики VRML-браузеров добавляют нестандартные расширения VRML в свой браузер.

Существует немало VRML-редакторов, делающих удобней и быстрее процесс создания Vrml-документов, однако несложные модели, рассматриваемые в данной статье, можно создать при помощи самого простого текстового редактора. Единицы измерения

В VRML приняты следующие единицы измерения:

  • Расстояние и размер: метры
  • Углы: радианы
  • Остальные значения: выражаются, как часть от 1.
  • Координаты берутся в трехмерной декартовой системе координат (см. рис.)

Как уже говорилось, Vrml-документ представляет собой обычный тестовый файл.

Для того, чтобы VRML-браузер распознал файл с VRML-кодом, в начале файла ставится специальный заголовок — file header:

Такой заголовок обязательно должен находиться в первой строке файла, кроме того, перед знаком диеза не должно быть пробелов. Примитивы VRML

В VRML определены четыре базовые фигуры: куб (верней не куб, а прямоугольный параллепипед), сфера, цилиндр и конус.

Эти фигуры называются примитивами (primitives). Набор примитивов невелик, однако комбинируя их, можно строить достаточно сложные трехмерные изображения. Например, вот такие:

Рассмотрим поподробней каждый из примитивов.

Параметр у сферы только один, это radius.

Цвет фигуры, определяется с помощью объекта Material.

Параметры ambientColor, diffuseColor, specularColor и emissiveColor управляют цветами и указываются в палитре RGB (красный, зеленый и голубой), причем первая цифра определяет интенсивность красного цвета, вторая — зеленого, а третья — синего.

К примеру, синий кубик, может быть описан следующим образом:

Параметр transparency может принимать значения от 0 до1 и определяет степень прозрачности, причем максимальная прозрачность достигается при transparency равном единице. В приведенном примере описано два цилиндра разных размеров, меньший из которых просвечивает сквозь другой.

Для имитирования различных поверхностей в VRML существует объект Texture2.

В качестве текстуры легче всего использовать обычный графический файл, например, в GIF-формате. В таком случае для «натягивания» текстуры на трехмерное изображение нужно только указать путь к файлу в параметре filename объекта Texture2.

Параметры wrapS и wrapT могут принимать значения REPEAT или CLAMP, и управляют натягиванием текстуры по соответственно горизонтальной и вертикальной осям. Положение объектов в пространстве Изменение координат

По умолчанию любой описанный нами объект будет располагаться точно по центру окна браузера. По этой причине, если мы опишем к примеру два одинаковых цилиндра, они сольются друг с другом. Для того, чтобы изменить положение второго цилиндра, применим узел Translation.

Узел Translation определяет координаты объекта:

Вообще говоря, координаты указываемые в Translation не являются абсолютными. Фактически это координаты относительно предыдущего узла Translation. Чтобы прояснить это вопрос, рассмотрим пример:

Как видите, третий кубик вовсе не совпадает с первым, хотя в в узле Translation указаны те же координаты.

В VRML 1.0 принято следующее правило: узлы, модифицирующие свойства фигур (Translation, Material и т.п.), действуют на все далее описанные фигуры.

Чтобы ограничить область действия модифицирующих узлов, фигуры необходимо сгруппировать с помощью узла Separator.

Узел Separator работает как контейнер, он может содержать любые другие узлы, и основным его предназначением является именно ограничение области действия узлов типа Translation и Material.

Сравните следующий пример с предыдущим:

Хотя в примере описано три кубика, мы видим только два, так как второй и третий совпадают.

Вообще говоря рекомендуется всегда и везде использовать узел Separator. Он не только избавит от ошибок, связанных с относительностью координат, но и сделает VRML-код более простым и понятным.

Для вращения фигур вокруг осей координат применяется узел Rotation.

Первые три цифры определяет будет ли осуществлен поворот вокруг соответственно осей 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 градусов.

Узел Scale масштабирует фигуры по одному или нескольким измерениям. Три цифры, стоящие после параметра scaleFactor определяют коэффициенты масштабирования относительно осей x,y и z.

В следующем примере, узел Scale сжимает сферу по оси x, и из сферы получается эллипсоид.

VRML предоставляет прекрасную возможность сократить и сделать более понятным исходный код VRML-файла путем описания собственных объектов. Это значит, что если в изображении несколько раз повторяется одна и та же фигура, то ее можно описать всего лишь один раз и в дальнейшем только ссылаться на нее.

Объект описывается одним из способов:

Для того, чтобы вставить в VRML-файл ранее определенную фигуру, используется команда USE

Создадим VRML-файл, описывающий стул, при этом ножку стула опишем как объект LEG:

Как видите, нам не понадобилось описывать каждую ножку в отдельности — в результате объем VRML-кода стал меньше, а сам код более читабельным.

Еще один способ уменьшить размер VRML-файла — вставлять фигуры из другого файла.

Это позволяет делать узел WWWInline:

Параметр name — это путь к файлу, параметры bboxSize и bboxCenter не обязательны и показывают пользователю размеры и положение вставляемого объекта, пока объект подгружается.

Вместо заключения , хочется обратить Ваше внимание на две особенности VRML, незнание которых сильно затруднит создание VRML-документов вручную.

  1. Все описания узлов и параметров в VRML регистрозависимы. Если Вы используете буквы неправильного регистра — то VRML-браузер просто проигнорирует такое описание.
  2. В VRML имеет огромное значение порядок описания узлов. Так к примеру, описание и описание

дают совершенно разный результат.

Рис. 6.33. Окно диалога VRML 97 Exporter (Экспорт в VRML 97)

Рис. 6.33. Окно диалога VRML 97 Exporter (Экспорт в VRML 97)

Для настройки параметров экспорта в формате WRL выполните следующие действия:

  1. Определите состав элементов VRML-описания с помощью флажков раздела Generate (Генерировать):
  1. Normals (Нормали) — нормали граней VRML-объектов;
  2. Indentation (Отступы) — отступы в листинге описания, облегчающие его чтение;
  3. Primitives (Примитивы) — примитивы VRML на базе примитивов max 6;
  4. Color per Vertex (Цвет вершин) — сведения о цвете отдельных вершин.
  5. Coordinate Interpolators (Интерполяторы координат) — сведения об эффектах анимации, связанных с использованием модификаторов объектов. Если данный флажок не установлен, экспортируются только сведения о преобразованиях;
  6. Export H >

    Экспортирование VRML97

    VRLM97 — это единственный формат VRLM, с помощью которого в 3ds max 5 можно экспортировать файлы сцен. В диалоговом окне VRML97 Exporter (Экспорт VRML97), показанном на рис. 3.13, представлено множество параметров для генерации различных элементов, например Normals (Нормали), Primitives (Примитивы), Color per Vertex (Цвет вершины), Coordinate Interpolators (Интерполяция координат) и Flip-Book (Обратная книга).

    В раскрывающемся списке Initial View (Исходный вид) можно выбрать камеру, с позиции которой отобразится сцена файла при первой загрузке в броузер. Многие VRML-броузеры поддерживают несколько точек вида. При просмотре VRML-файла в броузере каждая камера сцены становится отдельной точкой вида. По умолчанию скрытые объекты сцены не экспортируются, поэтому, если их нужно экспортировать, установите флажок Export Hidden Objects (Экспортировать скрытые объекты). Установленный флажок Show Progress Bar позволяет отображать панель процесса экспортирования файла.

    Параметр Normals оказывает броузеру помощь в визуализации сглаженных объектов. Активизация параметра Indentation (Отступ) приводит к выравниванию кода, что делает его более читабельным в текстовом редакторе.

    Поддерживаемые VRML-броузером примитивные объекты гораздо эффективнее многоугольных каркасов. Поэтому весьма полезным оказывается параметр Primitives, который преобразует сложные объекты в примитивные, конечно, если это возможно.

    Параметр Color per Vertex экспортирует все цвета вершин, определенные в сцене. В разделе Vertex Color Source (Источник цвета вершины) можно установить переключатель Use MAX’S (Использовать установки МАХ) или Calculate on Export (Рассчитать при экспорте). В последнем случае цвета вершин определяются, исходя из освещения сцены. Кроме этого, устанавливая точность расчетов в раскрывающемся списке Digits of Precision, можно выбрать количество учитываемых десятичных знаков.

    По умолчанию все файлы текстур должны находиться в той же папке, что и .WRL-файл. Параметр Use Prefix (Использовать префикс) позволяет указать отдельную папку, в которой хранятся файлы текстур экспортируемой сцены.

    Установка флажка Coordinate Interpolators приводит к экспортированию эффектов анимации, созданных модификаторами и средствами искривления пространства. Параметр Flip-Book экспортирует VRML-сцены в виде нескольких файлов. Щелчок на кнопке Sample Rates (Скорость прокрутки) открывает диалоговое окно Animation Sample Rates (Скорости прокрутки анимации), показанное на рис. 3.13. С его помощью можно определить разные скорости в разделах Transform Controllers, Coordinate Interpolators и Flip-Book.

    Илон Маск рекомендует:  RenameFile - Функция Delphi
Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL