С.Г.Соловьев. Vitrual Reality Toolbox - обзор

Vitrual Reality Toolbox

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

Большинство материалов взято из стандартной документации www.mathworks.com что является довольно ествественным, так что для более полного ознакомления с данным вопросом рекомендую и Вам обратиться к ней, так как некотороые аспекты связанные с VR Toolbox не нашли своего отражения в этой статье, по одной простой причине - в одной статье это не описать.

VR Toolbox. Основные понятия

Обратимся к основным понятиям, связанным с рассматриваемой технологией.

  • Виртуальный мир (Virtual World) - трехмерная сцена созданная с помощью VRML (Virtual Reality Modeling Language) технологии.
  • Динамическая система(Dynamic sustem) - система созданная с помощью MATLAB или SIMULINK, описывающая систему объектов созданных с помощью VRML.
  • Анимация(Animation) - изменяющаяся под воздействием сигналов из SIMULINK трехмерная сцена.
  • Манипуляция(Manipulation) - изменение позиций или свойств объектов виртуального мира в процессе моделирования
  • VRML браузер(viewer) - используется для просмотра миртуальных миров. Можно использовать встроенный в VR Toolbox браузер, или установить плагин к вашему Web-браузеру.
  • VRML редактор - редактор для написания VRML кода. Есть специализированные редакторы и конструкторы, например VRMLPad или V-Realm Builder. Если вы уверены в своих силах, то подойдет даже обычный текстовый редактор.

Возможности VR Toolbox

Virtual Reality Toolbox предоставляет много возможностей для создания и просмотра моделей динамических систем в виртуальной реальности, а также возможность взаимодействия с этими моделями в реальном времени. Опишем эти возможности:

Поддержка VRML

VRML это открытый стандарт разработанный ISO(International Organization for Standartization). Язык VRML является обычным текстом, использующим WWW-ориентированный формат. С помощью VRML вы создаете виртуальный мир, который можно просмотреть с помощью VRML-браузера(см. ниже) и затем связываете VRML-модель с моделью SIMULINK.

Последней на текущий момент спецификацией VRML является VRML97, стандарт ISO/IEC 14772-1:1997. Спецификафия доступна по адресу www.web3d.org . Спецификация содержит описание создания 3D-сцен, звуков, локальной и удаленной работы с VRML.

VR Toolbox анализирует структуру виртуального мира, определяет какие для него доступны типы сигналов и делает возможным посылку этих сигналов из MATLAB и SIMULINK. Встроенный в VR Toolbox VRML-браузер поддерживает большинство узлов описанных в стандарте VRML97 (понятие узла будет определено ниже или читайте спецификацию) , позволяя осуществлять полный контроль созданным виртуальным миром. В любом случае существует множество plug-in"ов к Web- браузерам, которые поддерживают все возможные узлы.

Благодаря VR Toolbox все изменения сделанные в виртуальном мире отражаются и в MATLAB или SIMULINK. Например, если изменить расположение камеры в виртуальном мире, то и изменится соответствующее свойство объекта vrworld в MATLAB или SIMULINK. Также VR Toolbox содержит функции позволяющие читать и изменять свойства объектов виртуального мира.

Поддержка интерфейса MATLAB

VR Toolbox поддерживает гибкий MATLAB интерфейс для работы с виртуальным миром. После создания объектов в MATLAB и ассоциирования их с виртуальным миром, можно осуществлять управление этим виртуальным миром посредством предоставленных для этого функций и методов. Из MATLAB можно изметять позиции и свойства VRML объектов, связать те или иные действия с графическим интерфейсом пользователя (GUIs) посредством так называемых callback функций. Можно также просматривать мир посредством VRML-браузера и устанавливать значения для всех доступных узлов и их полей.

VR Toolbox также предоставляет функции для чтения и изменения свойств виртуального мира и сохранения VRML файлов с текущей конфигурацией виртуального мира.

Т.е. MATLAB предоставляет средства для для управления и манипуляции виртуальными объектами посредством использования объектов самого MATLAB.

Поддержка интерфейса SIMULINK

Построив модель динамической системы в SIMULINK с помощью VR Toolbox можно наблюдать имитацию ее поверения в реальном времени в 3D реальности.

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

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

Все доступные VRML узлы будут представлены в иерархическом порядке, иными словами в виде иерархического дерева(узлы могут быть и вложенными) . Также можно указать степень свободы для управления из SIMULINK. После закрытия диалогового окна Block Parameters SIMULINK изменит праметры блока вместе со входами и выходами в соответствии с выделенными узлами виртуального мира. После того как такие входы преобразуются в соответствующие SIMULINK сигналы можно будет наблюдать полученную сцену в VRML-браузере.

Т.е. SIMULINK дает средства для управления и манипуляции объектами виртуальной реальности с использованием блоков предоставляемых VR Toolbox.

VRML-браузеры

Как уже было сказано VR Toolbox содержит встроенный браузер(браузер по умолчанию) для просмотра виртуальных миров. Этот браузер поддерживается на PC,UNIX, MAC OS X, и Linux платформах. Если вы работаете на PC платформе, то можете установить VRML plug-in к вашему WEB-браузеру и пользоваться им. Для PC платформ VR Toolbox включает plug-in blaxxun Contact . Это единственный поодерживаемый VRML plug-in.

Если вы установили VRML plug-in, то для отображения процесса моделирования VR Toolbox устанавливает связь MATLAB и SIMULINK с активным VRML-браузером используя протокол TCP/IP. Такой подход позволяет просматривать процесс моделирования не только с локального узла, где были запущены MATLAB и SIMLINK, но и с любого удаленного узла через интернет-соединение.

VRML-редакторы

VRML-редакторы - это редакторы, использующиеся для создания 3D сцен с помощью языка VRML.

  • PC платформы - V-Realm Builder v2.0, поставляемый вместе в VR Toolbox. Если не хотите его использовать, то пользуйтесь своим любимым VRML-редактором(Я, например, предпочитаю VRMLPad) Установить редактор можно командой vrinstall . Как пользоваться V-Realm Builder"ом я расскажу в следующих статьях.
  • UNIX/LINUX платформы - редактор по умолчанию для них это редактор MATLAB. Здесь опять та же ситуация. Если не нравится измените свойство Editor на свой любимый текстовый редактор.

Поддержка SimMechanics

VR Toolbox также можно использовать для исследования поведения модели созданной с помощью SimMechanics. Сначала создаете модель механизма в SIMULINK используя блоки SimMechanics. Затем создаете детальную ее картину в виртуальном мире. Затем подключаете созданный мир к выходному элементу SimMechanics и смотрите как ведет себя соответствующая часть(или части) созданной системы в VRML-браузере.

Поддержка клиент-серверной архитектуры

Как уже было сказано VR Toolbox подключает MATLAB и SIMULINK к активному VRML-браузеру используя протокол TCP/IP. Сам Toolbox может быть использован в 2-х конфигурациях:

  • Один компьютер - SIMULINK, MATLAB и изображение сцены в виртуальном мире запущены на одном компьютере.
  • Сетевой компьютер - анимационная картинка с виртуальным миром просматривается, будучи запущенной на удаленном от компьютера на котором запущен VR Toolbox сервер узле. К этому одному серверу могут подключаться много клиентов. Изменять необходимые вам параметры вы можете и по сети.

Кратко о VRML

История VRML

С тех пор, как люди стали публиковать свои документы в World Wide Web(WWW), они все время пытались усилить эффект показом современных трехмерных сцен(лучше ведь один раз увидеть) , а также иметь возможность взаимодействовать с этой сценой(а еще лучше, если и пощупать) .

Сам же термин Virtual Reality Modeling Language(VRML) был озвучен Тимом Бернерсом Ли на Европейской Web конференции в 1994 году, где он заговорил о необходимости создания 3D Web стандарта. Вскоре после этого появилась активная группа инженеров и художников, которые приступили к работе над проектом www-vrml .Но потом они изменили название стандарта на Virtual Reality Modeling Language , чтобы подчеркнуть особую роль в нем графики. Результатом их усилий явилась спецификация VRML 1. В основу этой спецификации лег файловый формат изобретенный компанией Silicon Graphics(а точнее его часть) .

Стандарт VRML 1 был реализован в некоторых VRML-браузерах, но позволял создавать только статичные виртуальные миры. Это ограничение существенно мешало их широкому использованию. Довольно быстро стало очевидно, что язык нуждается в серьезной доработке, в добавлении возможностей анимации и интерактивности, в придаче виртуальному миру жизни. Так был создан стандарт VRML 2 и в 1997 году он был принят как интернациональный стандарт ISO/IEC 14772-1:1997 . С тех пор он известен как VRML97.

VRML97 предлагает открытую и гибкую основу для создания интерактивных трехмерных сцен (виртуальных миров) . Компьютеры постоянно наращивают свои вычислительные мощности и возможности работы с графикой, а линии связи становятся все быстрее, в свою очередь трехмерная графика уже стала невероятно популярной в компьютерных играх и современных видах искусства. Сейчас уже существует огромное колличество доступных VRML97-браузеров под различные платформы. Кроме того, наростает число авторских VRML-инструментов, коих уже богатый выбор. В добавок, много традиционных графических пакетов(CAD, visual art, и т.д.) предлагают возможномть экспорта/импорта моделей в формат VRML97.

Стандарт VRML97 продолжает развиваться консорциумом Web 3D. Новейший стандарт X3D (eXtensible 3D) явился наследником VRML97. X3D эластичный стандарт, который совместим и с текущим языком VRML и его браузерами. Для более детальной информации смотрите www.web3d.org

Координатная система VRML

В VRML используется правосторонняя Декартова координатная система. Для простоты рассмотрим большой, указательный и средний пальцы на правой руке человека. Пусть этот человек вы. Поставьте локоть правой руки на стол и зафиксируйте указанные пальцы перпендикулярно друг другу, держа ладонь и кисть на одной прямой. Большой палец - это ось x , указательный - ось y , средний - ось z .

Система координат VRML отличается от того, какая она в MATLAB. Эта разница легко видна из рисунка. Факт различия систем координат очень важно осознавать в ситуациях, когда приходится делать преобразования из одной из этих систем в другую. SimMechanics например использует координатную систему принятую в VRML.

Преобразования поворота - в VRML поворот происходит по правилу правого винта(как на рисунке) .

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

Все длины и дистанции измеряются в метрах, а все углы в радианах.

Формат VRML-файла

Для использования различных авторских инструментов по созданию виртуальных миров вовсе не требуются знания формата VRML файлов. Однако умение создавать простейшие 3D-сцены является весьма полезным. Эти знания помогут создавать виртуальные миры более эфективно и дадут понимание того как происходит управление виртуальным миром из VR Toolobox.

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

В VRML 3D сцена описываетя иерархической структурой(точнее деревом) объектов(узлов) . Каждый узел в дереве определяет часть функциональности сцены. Всего существуют 54 различных типа узлов. Некоторые из них представдяют собой геометрические узлы(реальные 3D объекты) . А некоторые представляют собой группирующие узлы и предназначены единственно для создания иерархии. Вот некоторые из них:

  • Узел(node) Box
  • Узел Transform - определяет позицию, масштаб, ориентацию, поворот, перенос всех дочерних элементов включенных в этот узел(группирующий узел) .
  • Узел Material(материал) - отвечает за материал на сцене
  • Узел DirectionalLight(направленный источник света) - отвечает за освещение сцены.
  • Узел Fog(туман) - позволяет изменять оптические свойства окружения
  • Узел ProximitySensor - придает интерактивность VRML97. Этот узел генерирует события активности пользователя(Enter,Exit,Moves)

Каждый перечисленный узел содержит поля, значения которых определяют функциональность каждого из них.

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

Каждому узлу можно присвоить уникальное имя, для чего используется ключевое слово DEF. Например, DEF MyNodeName Box задает имя MyNodeName для узла Box. Доступ к полям улов возможет только по их именам.

Приведу пример описанный в документации к VR Toolbox. На 3D сцене имеются два графических объекта: Сцена изображает некий, если хотите - пол, узлом Box и красный шарик над ним. Напишите в своем VRML-редакторе (или же в любом текстовом) следующий код.

Итак что же представляет из себя этот код? Первая строчка - заголовок, яволяется обязательной и показывает какую версию языка VRML вы используете(тут v2.0) и в какой кодировке написан текст(тут utf8) . Вообще говоря, кодировка utf8 описана в стандарте как обязательная и поддерживается любым VRML-браузером. Значок (#) используется для обозначения комментария везде, за исключением первой строки - заголовка. Напрмер, как видно и написано - вторая строчка это уже обычный комментарий и при интерпритации все написанное после символа (#) игнорируется.

Узел WorldInfo содержит информацию о созданном мире. В данном случае описан только один параметр заголовок(title) . Он используется VRML браузерами для того чтобы различать различные виртуальные миры. Узел ViewPoint является описанием месторасположения камеры. В данном случае в поле позиция(position) определена точка на 3D сцене в которой будет расположена камера.

Значения полей узла Box как видно, в большинстве своем оставлены по умолчанию. Например, дистанция от центра координатной системы, материал, цвет и так далее. Узлу лишь присвоено имя - Floor и присвоены размеры(длина, ширина, высота). Для того чтобы иметь возможность изменять позицию и остальные свойства нашего шарика он определен как дочерний узео узла Transform . Здесь стандартной сфере(значения всех полей по умолчанию) присвоена позиция - 10 метров от пола и цвет материала задан как красный.

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

Блуждая по просторам интернета, постоянно рискуешь напороться на некий объект, способный легко уничтожить уйму столь дефицитного личного и, пока еще, столь дорогого сетевого времени. Подобные "Черные Дыры" виртуальных закоулков без сомнения известны любому пользователю, сделавшему хотя бы несколько ходок, не говоря уже о профессиональных серферах и сталкерах сети. Странные существа люди - они даже составляют специальные хит-парады, посвященные подобным местам периодического времяубийства. Да, Вы и сами хорошо знаете всяческих Рэмблеров и прочие Топ 1000. С другой стороны, еще никто не пытается создать хит-парад интернет технологий, способных качественно и масштабно уничтожать личное время. HTML, mp3 и … и запишите VRML в первую пятерку!

Справка

VRML: аббревиатура от Virtual Reality Modeling Language (по отечественному ЯМВР, Язык Моделирования Виртуальной Реальности). Стандарт языка описания трехмерных сцен, содержащих объекты, а также возможных взаимодействий между объектами и наблюдателем. Основное назначение - описание набора объектов (сцены) в системах виртуальной реальности. Основное на данный момент применение - представление статической и интерактивной информации в сети интернет, в виде виртуальной трехмерной среды содержащей различные объекты. Существует три распространенных версии языка: VRML 1.0, 2.0 и VRML 97. На данный момент самой широко поддерживаемой версией является VRML 2.0. Развитие языка координируется VRML Architecture (по другим источникам Advisory) Group (перевод - Группа Архитектуры VRML), известной под аббревиатурой VAG.

История

Все началось 27 октября 1969 года, с первого TCP пакета. Затем были "telnet 1.0.0.2" и "ftp 1.0.0.2". Еще позже появился "ftp.cc.mil" и прочие DNS. В 1989 году начал развиваться WWW. Впрочем, все это события глубоко довиртуальной эры. В январе 1994 года, Mark Pesce и Tony Parisi придумывают концепцию трехмерного HTML, своеобразного языка описания трехмерных сцен с поддержкой гиперссылок, и создают пакет программ и экспериментальный формат, названные ими Labyrinth - первый прообраз VRML. В апреле 1994 года их проект участвует в First International Conference on the World Wide Web (Первой Интернациональной Конференции по WWW), где и звучит впервые термин VRML. Кстати, тогда он расшифровывался как Virtual Reality Markup Language, и лишь позже "markup" был заменен на более научно-звучное "modeling". В июне 1994 года известный журнал WIRED создает список рассылки, посвященной проблеме создания VRML, в течение недели на него подписываются около 1000 специалистов, что в 1994 году было крайне серьезным числом. Они и определяют направление развития концепции, придавая ей, в ходе многочисленных письменных обсуждений, первые очертания. До сих пор соблюдается хорошая традиция совершенствования языка: постоянный поиск решений удовлетворяющих большинство участвующих в обсуждении добровольцев, т.е. столь любимый первым президентом нашей родины консенсус. Практически сразу решено не заниматься изобретением велосипеда, а взять за основу какой либо существующий язык описания трехмерных сцен. Коим становится разработанный в Silicon Graphics Incorporation формат файлов программной библиотеки Open Inventor. Gavin Bell, инженер SGI модифицировал формат Open Inventor, создав первый вариант языка VRML, который был анонсирован в октябре 1994 года на "Второй Всемирной Конференции по WWW" и 5 ноября превратился в официальный проект стандарта VRML 1.0. Его коллега, Paul Strauss, написал первый VRML 1.0 клиент, назвав его трудно произносимым именем QvLib. Клиент был впервые представлен для платформы SGI, в январе 1995 года.

Печальная легенда гласит, что столь неудобоваримое название программы было придумано, дабы постоянно напоминать авторам о необходимости создать, чуть позже, название гораздо более удобное и красивое. Что, в полном согласии с известной пословицей, так и не было никогда сделано. Позже исходные тексты QvLib были предоставлены всем желающим, вызвав неконтролируемое распространение VRML по аппаратным платформам, сайтам и многочисленным сознаниям людей. Вскоре Parsi создает свою собственную компанию, Intervista, и начинает разработку трехмерного … как это лучше перевести … обозревателя, основанного на VRML. Который был назван WorldView и успешно существует до сих пор. Тогда же Parsi, Pesce и один известный архитектор из Сан-Франциско осуществляют проект Virtual SOMA - VRML модель южной части пригорода, призванной стать центром мультимедиа и интернет бизнеса, первое масштабное наполовину коммерческое применение VRML технологии. В апреле 1995 года SGI анонсирует новую программу просмотра WebSpace, открывая широкую кампанию по продвижению VRML. В ней принимаю участие такие фирмы, как Netscape, DEC, Spyglass, и NEC. Начинается рекламная шумиха в компьютерной (и не очень) прессе. На конференции SIGGRAPH"95 язык VRML, несомненно, является основной темой. С этого момента следует стремительная лавина анонсов новых обозревателей, средств создания VRML сцен и просто содержащих VRML контент сайтов. В августе 1995 года Pesce анонсирует создание VAG, начинается разработка проекта стандарта VRML 2.0. Первоначальный проект забит и затоптан в ходе обсуждения, но присланы шесть новых вариантов от ведущих компьютерных фирм:

  1. Active VRML от Microsoft
  2. Dynamic Worlds от GMD сотоварищи
  3. HoloWeb от Sun
  4. Moving Worlds от Silicon Graphics сотоварищи
  5. Out of this World от Apple
  6. Reactive Virtual Environment от IBM Japan

В ходе обсуждений выявляется лидер - Moving Worlds. Вскоре, благородная Apple отказывается от своего проекта в пользу Moving Worlds, остальные гиганты продолжают настаивать на своих вариантах. Некоторое время Moving Worlds шлифуется, постепенно становясь проектом стандарта VRML 2.0. В июне 1996 представители VAG договариваются, подписывая окончательное соглашение, считать работы над VRML 2.0 завершенными. Кстати, несмотря на поиск консенсуса, работа по созданию и принятию стандарта продвигается невероятно быстро. В декабре 1996 стандарт ISO/IEC DIS 14772-1 (VRML 2.0) принят окончательно. А в октябре 1997 года был завершен проект стандарта новой, расширенной версии языка, названной, в соответствии с последними веяниями, VRML 97. Следует отметить, что VRML абсолютный рекордсмен по скорости разработки и принятия официального стандарта, среди всех компьютерных языков. Развитие VRML продолжается, хоть и не столь бурно, по сей день. За сим прошу откланяться.

Из чего сделаны мальчики?

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

  1. Описать виртуальный мир.
  2. Предъявить этот мир пользователю, позволив ему взаимодействовать с ним.

Решим эти задачи, попробовав себя в непростой роли создателей VRML. В первую очередь необходимо создать информационную структуру, описывающую мир. Чрезвычайно гибкая и удобная (для пользователя или математика, но не для реализующего ее обработку программиста) структура - граф. Т.е. набор узлов (в терминологии VRML - node) дополненный информацией о связях между ними. Узлы похожи на обычные структуры данных, они содержат поля (fields) и события (events). Cвязи между узлами реализуются с помощью полей, имеющих тип указателя (на узел). Фактически, события также представляют собою указатель на объект способный эти события генерировать, или воспринимать, что сразу разделяет их на два типа - исходящие (EventOut) и входящие (EvevnIn), соответственно.

Благодаря подобной концепции, VRML, несомненно, может считаться объектно-ориентированным языком. Все это безобразие, схематически изображенное на рисунке 1, в сумме описывает мир * , в VRML понимании этого слова. Поля Field 1 и 2 представляют собою первичные параметры (например, цвет или точка в трехмерном пространстве), Field 3 является набором указателей на другие узлы, а Event 1 событием, поступающим от двух узлов.

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

Структура есть, предположим, что основные типы узлов, событий и полей также определены. Но, пока, это лишь на бумаге и в мыслях, нам же необходимо создать синтаксис языка - формальное описание возможного содержимого файла, в рамках которого наш мир будет формулироваться человеком или редактором. А затем, возможно, он будет интерпретироваться и демонстрироваться программой клиентом (так "успешно" обозванной мною обозревателем). Разумеется, обозревателя также необходимо разработать и написать, хотя, формально, рамки стандарта заканчиваются уже на этапе формулировки синтаксиса и описания функционирования определенных заранее узлов. Конкретная реализация программы, то, как она будет представлять информацию пользователю и то, как она будет обеспечивать его взаимодействие с виртуальным миром, остаются на совести разработчиков. Впрочем, этот факт совершенно не спасает от стойкого ощущения дежавю во время работы с большинством распространенных на данный момент клиентов. Достаточное ограничение в простор реализации вносят четкие правила относительно генерации событий и строго фиксированный набор параметров, определяющих визуальное (геометрия, материал и освещение) описание объектов. Подводя итоги, составим следующую табличку:

VRML технология

Стратегия Описание трехмерного виртуального мира, возможность взаимодействия с объектами.
Понятийный уровень Понятие узла, набора, поля, события.
Событийный уровень Правила генерации событий.
Структурный уровень Конкретные типы полей и событий (точка, число, цвет, URL,…).
Конкретные типы узлов, их структура (источник,…).
Языковой уровень Синтаксис описания структур (, {}, ROUTE, DEF,…).
Синтаксис описания узлов (Field, EventIn,…).
Имена предопределенных типов полей (SFColor, SFBool,…).
Имена предопределенных типов событий (addChildren,…).
Имена предопределенных типов узлов (Anchor, Material,…).
Клиентский уровень Среда распространения VRML описаний (файлы, HTTP,…).
Среда визуализации (OpenGL устройства, принтер,…).
Интерфейс навигации и взаимодействия (мышь, вид из глаз,…).

Типы, странные и не очень

Разберемся с первичными типами, основными строительными кирпичиками языка VRML. Все типы полей делятся на два класса, содержащие одно значение (так называемые SF типы) и наборы (MF). Для пущей простоты, имена первых всегда начинаются с букв SF, а вторых, как Вы, наверное, уже догадались, с MF. Для записи элементов набора используются квадратные скобки. Например, если у нас есть поле, набор целого типа MFInt32, под названием MyIntegerSet, мы можем описать его следующим образом:

MFInt32 MyIntegerSet

Кстати, VRML болезненно чувствителен к разнице между заглавными и строчными буквами. Поэтому, sfint32 и SFInt32 - два различных идентификатора. Это к слову, а теперь, попробуем заполнить наш набор значениями:

MyIntegerSet [ 1, 0, 0, 1 ]

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

MyIntegerSet

MyIntegerSet [ 1 ] или MyIntegerSet 0

И, даже, поступить так:

MyIntegerSet [ 0, ]

Некоторые первичные типы имеют как SF так и MF разновидность, например, если тип называется Color то соответствующие имена записываются как SFColor и MFColor,. Следующая таблица претендует на некоторую долю информативности:

Первичные типы данных

Имена типов Описание Пример значения
SFBool Логический тип TRUE
FALSE
SFColor
MFColor
Цвет (три плавающих числа из диапазона 0.0…1.0) 0.1 1.0 0.0
[ 0.1 0.2 0.3, 0.3 0.2 0.1 ]
SFFloat
MFFloat
Плавающее число (IEEE, 32 бит, С нотация) 1.1
[ 3.1415926, .01e-22, 1. ]
SFImage Изображение в виде X Y NC NC=1 - 255 градаций серого на одну точку
2 - по 255 градаций серого и прозрачности на точку.
3 - по 255 градаций RGB на одну точку.
4 - по 255 градаций RGB и прозрачности на точку.

320 200 1 0xff 0xff 0x00 0x2f…

20 30 2 0x1200 0x1300 0x00ff…

30 20 3 0xff00ff 0x00ff00…
25 25 4 0xff00ff00 0x000000ff…

SFInt32
MFInt32
Целый тип (со знаком, 32 бит, С нотация) 0x33
[ 0xffabcd9, 1, 2, -555555 ]
SFNode
MFNode
Определяет ссылку на узел. В качестве значения можно использовать экземпляр узла. Anchor { … }
[ Anchor { … }, Material {…} ]
SFRotation
MFRotation
Поворот. (ось поворота и угол, X Y Z Alpha). 0 1 0.0 3.1415926
SFString
MFString
Строка. (код UTF-8, в C нотации). "Hello, world! "
[""Sam" it"s me", "www.microsoft.com"]
SFTime Время, секунд с 1 января 1970 года. (UNIX формат, плавающее число, 64 бит, в С нотации). 1.34343454545e20
SFVec2f
MFVec2f
Двумерный вектор. (Плавающие числа 32 бита, в С нотации). 0.0 1.0
[ 1.0 2.0, 1.0 0.0 ]
SFVec3f
MFVec3f
Трехмерный вектор. (Плавающие числа 32 бита, в С нотации). 0.0 1.0 2.0

Засим, первичные типы успешно закончились.

Узлы, связи и все все все…

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

Экземпляры узлов описываются и заполняются так:

Где специальное слово ROUTE позволяет установить автоматическую отправку конкретного исходящего события одного узла в конкретное входящее событие другого. Также, можно создавать именованyые экземпляры узлов, с возможностью их одновременного использования в нескольких местах программы:

Заполним, для примера, узел предопределенного типа Anchor, попутно продемонстрировав использование неразлучной парочки DEF/USE :

# Простой красный материал DEF SimplyRedMaterial Material { diffuseColor 1 0 0 } # Ссылка в виде шарика Anchor { url "http://www.microsoft.com/" children [ Shape { geometry Sphere { radius 2.0 } appearance Appearance { material USE SimplyRedMaterial } } ] }

Определяет ссылку на сайт всеми любимой компании, которая (ссылка, не компания) содержит объект, содержащий, в свою очередь, геометрическую информацию (сфера единичного радиуса) и описание материала имеющего красный цвет в рассеянном свете. Уф… Вот такая вложенная структура данных понадобилась ради одного маленького красненького шарика, неправда ли, это эффективное средство убийства времени набирающего подобные программы человека? Шутки в сторону, вернемся к примеру. Поле children является стандартным для всех узлов, содержащих подчиненные узлы (так называемые "дети") и представляет собою набор типа MFNode . Как правило, узел каким то образом влияет на всех своих детей, например, перемещая их в пространстве, масштабируя, или придавая им какие либо общие свойства. В действительности, узел типа Material имеет множество других параметров, но, в данном примере, мы полагаемся на их значения по умолчанию, определенные где-то в недрах языка. Обратите внимание на комментарий, который обозначается символом # и продолжается до конца строки включительно. Кстати, если добавить в предыдущий пример такую вот первую строчку:

#VRML V2.0 utf8

Обязательную для всех VRML 2.0 программ, мы получим полноценный файл, который можно назвать "КакВамУгодно.wrl ", открыть в соответствующем обозревателе и даже кликнуть (по красному шарику). До сих пор, мы имели дело с заранее определенными, в языке, типами узлов Anchor , Shape , Sphere и Material . Но, если мы того пожелаем, можно легко определить новый тип узла. Делается это следующим образом:

PROTO [

Классификатор определяет каждый конкретный член нового типа узла. Возможны следующие классификаторы:

Поле данных, реагирующее на события (exposedField ) порождает исходящее событие _changed , которое генерируется при изменении значения данного поля каким либо образом и входящее событие set _, генерируя которое, значение поля можно менять. Разумеется, тип данных этих событий совпадает с типом обслуживаемого или поля. В квадратных скобках оператора PROTO задается интерфейс нового типа узла (доступные для использования поля и события), а в фигурных описывается его реализация. События представляют собою данные, какого либо типа, передаваемые от узла к узлу. Причем, настройка путей передачи происходит специальным ключевым словом ROUTE :

ROUTE . TO .

Вот пример использования ROUTE - столь любимый мною красный шарик, издающий звук, когда с ним сталкивается наблюдатель: DEF SphereWithSound Collision { children [ Shape { geometry Sphere { } appearance Appearance { material USE SimplyRedMaterial } } Sound { source DEF BoomSound AudioClip { url "boom.wav" } } ] } ROUTE SphereWithSound.collideTime TO BoomSound.startTime

Подобным образом можно легко строить сложно связанные иерархии объектов, в которых изменение каких либо параметров одного узла вызывает незамедлительную реакцию всей системы. Толкнул кубик, а с ним двинулся и шарик, и все такое… Приведу небольшую VRML программу, демонстрирующую не только определение новых типов узлов, но и другие возможностями языка: #VRML V2.0 utf8 PROTO TwoColorStool [ field SFColor legColor .8 .4 .7 field SFColor seatColor .6 .6 .1 ] { Transform { children [ # Сиденье стула Transform { translation 0 0.6 0 children Shape { appearance Appearance { material Material { diffuseColor IS seatColor } } geometry Box { size 1.2 0.2 1.2 } } } # Первая нога Transform { translation -.5 0 -.5 children DEF Leg Shape { appearance Appearance { material Material { diffuseColor IS legColor } } geometry Cylinder { height 1 radius .1 } } } # Вторая нога Transform { translation .5 0 -.5 children USE Leg } # Третья Transform { translation -.5 0 .5 children USE Leg } # Последняя Transform { translation .5 0 .5 children USE Leg } ]} }

Это определение нового типа узла - двухцветной табуретки. У нее есть два поля определяющие цвет сиденья и ножек соответственно. Давайте внимательно посмотрим на использованные для ее создания узлы:

  • Transform - осуществляет геометрическое преобразование своих детей, например сдвиг, поворот или масштабирование.
  • Shape - видимый объект, состоит из описания геометрии и параметров ее отображения, таких как материал, текстура и т.д.
  • Box , Cylinder - прямоугольник и цилиндр, соответственно.

Также, нам встретился новый оператор IS :

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

Продолжим: DEF XForm Transform { children [ TwoColorStool { legColor 1 0 0 seatColor 0 0 1 } DEF Clicker TouchSensor {} DEF TimeSource TimeSensor { cycleInterval 2.0 } # Animate one full turn about Y axis: DEF Animation OrientationInterpolator { key [ 0, .33, .66, 1.0 ] keyValue [ 0 1 0 0, 0 1 0 2.1, 0 1 0 4.2, 0 1 0 0 ] } ]} ROUTE Clicker.touchTime TO TimeSource.startTime ROUTE TimeSource.fraction_changed TO Animation.set_fraction ROUTE Animation.value_changed TO XForm.rotation NavigationInfo { type "EXAMINE" }

Здесь, мы определяем новый узел XForm типа Transform, который кроме уже описанной нами табуретки (синего цвета с зелеными ножками, рисунок 2) содержит датчик прикосновений TouchSensor , порождающий событие, когда в обозревателе по нашей табуретке щелкают мышкой (т.е. касаются) и таймер TimeSensor . Таймер настроен таким образом, что постоянно генерирует событие fraction_changed значение которого пробегает значение от 0 до 1 за две секунды. Также используется узел OrientationInterpolator , интерполирующий значение типа SFRotation по таблице в зависимости от значения поля fraction . Затем соответствующим образом построено взаимодействие между датчиком прикосновений, таймером, интерполятором и трансформатором позиции табуретки (три ROUTE ). В итоге мы получили объект (в нашем случае табуретку, но на ее месте может быть узел любого заранее определенного типа) способный повернуться вокруг себя за две секунды, если к нему прикоснулись. Избушка, избушка, встань к монитору… Последняя строчка переводит обозреватель перейти в режим изучения объекта, в котором наблюдатель не двигается, а просто рассматривает и трогает предмет.

Небольшое продолжение к нашему примеру демонстрирует возможность использования Java Script (если быть корректным - ECMA Script) в VRML программах:

DEF Sizer Script { eventIn SFTime startSizing eventOut SFVec3f scale field SFFloat sc 1.0 field SFBool sizeUp TRUE url "javascript: function startSizing() { if(sizeUp) sc+=0.04; else sc-=0.04; if(sc 1.3) sizeUp=!sizeUp; scale=sc; scale=sc; scale=sc; } " } DEF Ticker TimeSensor { cycleInterval 0.05 loop TRUE enabled FALSE } ROUTE Clicker.isOver TO Ticker.set_enabled ROUTE Ticker.cycleTime TO Sizer.startSizing ROUTE Sizer.scale TO XForm.scale

Вот так, с помощью предопределенного узла Script мы получаем практически безграничные возможности в определении правил, по которым будет жить наш мир. В данном примере мы заставляем нашу табуретку циклически менять размер (дышать), пока над ней находится курсор обозревателя, вне зависимости от того, прикоснулись мы к ней или нет. Для этого используется событие isOver узла TouchSenser, реагирующее на описанную выше ситуацию с мышиным курсором, таймер генерирующий 20 раз в секунду событие cycleTime и небольшой скрипт, создающий масштабирование, которое затем применяется к объекту.

Дополнения

Все, что было написано ранее, ни в коем случае не претендует на роль руководства или описания. Это лишь попытка показать, что же в действительности стоит за весьма претенциозным термином VRML. Любители формальных грамматик и полных описаний, а также просто заинтересованные читатели могут заглянуть . Где можно найти исчерпывающее описание синтаксиса и концепций VRML 2.0. И множество прокомментированных примеров от SGI, послуживших отличной основой для написания приведенных выше VRML программ. Впрочем, будьте внимательны: в доступных по этому адресу примерах, к моему искреннему удивлению, практически сразу обнаружилось несколько грубых ошибок. Которые, разумеется, убили некое сверхплановое количество свободного времени, но были успешно опознаны и уничтожены. Предвидя возможные недостаток желания или нехватку сетевого времени, приведу список некоторых предопределенных узлов VRML 2.0, отметив, где и как их можно использовать:

Группировка объектов:

Специальные группы:

Общие узлы:

Генераторы событий:

Геометрическая информация:

Дополнительная информация:

Свойства внешнего вида:

Интерполяторы по таблице значений:

Управление глобальными параметрами обозревателя:

Background Фон изображения
Fog Характеристики атмосферы
NavigationInfo Режим навигации и взаимодействия
Viewpoint Точка обзора

Клиенты всегда правы

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

  • Движение вперед-назад и повороты вправо-влево
  • Движение вверх-вниз и вправо-влево
  • Повороты вверх-вниз и вправо-влево
  • Автоматическое движение до указанного объекта
  • Переход на заранее определенную точку зрения
  • Возможность "потрогать" объект

Эти действия являются стандартными практически для любой клиентской программы. Опишу два самых успешных, распространенных и самозабвенно конкурирующих обозревателя, соответствующих стандарту VRML 2.0.

Cosmo Software - Cosmo Player:

Разработка SGI. Представляет собою plug-in для браузера, интегрируется в Netscape 3.0 и более или Microsoft Explorer 4.0 и более. Для отображения использует библиотеку OpenGL, и, следовательно, аппаратную акселерацию на любом OpenGL совместимом ускорителе. Для создания объемного звука используется DirectSound (DirectX 3.0) и выше, следовательно, также поддерживается аппаратное ускорение. Клиент соответствует стандарту VRML 2.0 и VRML 97. Поддерживает полноценные Java классы (а не только ECMA Script). Файлы VRML 1.0 автоматически конвертируются в VRML 2.0. Все передаваемые данные могут быть запакованы в GZIP архив, для уменьшения времени загрузки мира. Может быть использован любой программой, как встроенный ActiveX элемент, что позволяет программистам легко добавлять поддержку просмотра VRML в свои продукты. Содержит множество полезных мелочей, начиная с отката действий и заканчивая отладочной консолью для создающих VRML файлы разработчиков. Среди досадных ошибок - неправильная обработка параметров некоторых источников освещения, некоторые проблемы с заданием скорости перемещения из программы и поддержкой анимационных GIF изображений. В поставку входит очень миролюбивая игра "Chomp", с акулой в главной роли, полностью написанная на VRML и ECMA Script. Отличные скоростные качества. Данный клиент всячески рекомендуется мною к использованию. Поддерживаются различные платформы, в том числе: SGI, Windows (9x/NT/3.11) и Mac OS. Органы управления подробно изображены на рисунке 4, взятом из документации. Последнюю версию (Cosmo Player 2.1), море информации и отлично оформленный сайт с VRML афишками Вы найдете по адресу

Microsoft VRML 2.0 viewer:

Разработка … понятно чья. Основан на коде упомянутого ранее WorldView. Представляет собою plug-in для браузера, интегрируется в Microsoft Explorer 3.0 и более. Для отображения использует библиотеку DirectX 3.x и выше, и, следовательно, аппаратную акселерацию на любом DirectX совместимом ускорителе. Соответствует стандарту VRML 2.0 (есть некоторые несущественные расхождения). Поддерживает полноценные Java классы (а не только ECMA Script), но только как URL, а не внутри VRML текста. Поддерживает файлы VRML 1.0. Есть некоторые проблемы с GZIP файлами, приводящие, как правило, к предупреждениям которые можно игнорировать, но иногда прекращающие загрузку миров. Есть некоторые проблемы с реализацией ProximitySensor и обработкой сообщений таймера и событий, связанных с взаимодействием, что крайне печально. Достаточно компактный и удобный интерфейс. Несколько бестолковые настройки. Производительность (немного) и визуальное качество (сильно) уступают Cosmo Player. Рекомендуется как замена Cosmo Player, в случае невозможности использовать его по какой либо причине. Более подробная и глубокая справочная информация, подробно рассмотрено большое количество неоднозначных аспектов конкретной реализации. Не может быть использован как ActiveX элемент в сторонних программах. Только Windows (9x/NT) платформа. Последнюю версию, информацию и устаревшую галерею Вы найдете по адресу www.microsoft.com/vrml/

Впрочем, полуось (IBM OS/2) также не забыта разработчиками: фирма Now Interprises разработала OS/2 VRML viewer.

Редакторы, корректоры, конверторы:

Существует огромное множество инструментария для работы с VRML. Сформулируем, в кратце, основные категории подобных продуктов:

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

Где красиво убить время

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

Обязательно загляните на сайт Российской компании

Заключение

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

P.S.

В настоящее время на рынке VRML браузеров доминируют три следующие программы:

  1. Blaxxun Contact 4.3 () - поддержка сплайновых поверхностей (NURBS), версии с поддержкой DirectX/OpenGL, PIII-оптимизация геометрических вычислений, клиент к многопользовательским VRML-мирам;
  2. Cortona VRML client 2.1 () - поддержка сплайнов и сплайновых поверхностей (NURBS), поддержка Macromediа Flash и Real Video технологий, графические API DirectX/OpenGL, звуковой EAI2, PIII-оптимизация, версия клиента для многопользовательских VRML-миров;
  3. CosmoPlayer 2.1 - DirectX/OpenGL

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

3D Studio Max R3.1 обладает встроенным экспортером в VRML формат, который способен переводить MAX файлы в VRML. Этот экспортер поддерживает два VRML формата: VRML 97 и VRML 1.0. В этом уроке мы сосредоточимся на VRML 97 (это более новая версия) и разберемся в способах создания и экспорта файлов VRML в среде Max R3.1.

Прежде чем начать


Для работы нам потребуется не только 3DS Max R3.1, но и VRML вьювер, а также текстовый редактор. Кроме того, если вы собираетесь работать с текстурами, необходимо иметь программу обработки 2D графики (Photoshop).

VRML вьювер


Самый простой способ просмотреть VRML файл - это воспользоваться стандартным браузером (Netscape Navigator или Communicator, или Microsoft Internet Explorer), снабженным VRML плагином. При написании этой статьи я пользовался Cosmo Player 2.1.1., созданного SGI и распространяемого группой CAI - вам придется скачать около 4мб. Помните, что различные плагины и вьюверы рендерят файлы по-разному, и если вы создаете VRML для широкой публикации - будет лучше если вы протестируете его в разных программах.

(вышеописанный вьювер можно также поискать - и выбрать наиболее удобный для скачивания сервер)

Текстовый редактор


Подобно HTML VRML - это формат, основанный на ASCII и вам понадобится текстовый редактор для проверки и модификации кода. Я пользовался MS Word 97.

Графический редактор


Не буду подробно останавливаться на этом - думаю всем понятно, что при создании текстур программу, подобную Photoshop трудно заменить.

Введение в VRML


Давайте разберемся - что же такое VRML? Данный формат напрямую связан с понятием Virtual Reality (VR) - интерактивный трехмерный мир, по которому пользователь может перемещаться в зависимости от своего желания. В этом мире пользователь называется "avatar". Virtual Reality Modeling Language (VRML) - это ASCII язык, используемый для описания подобных миров. Подобно HTML, это язык, не являющийся чьей-либо собственностью и его может использовать каждый совершенно свободно, он поддерживает использование текста, графики, анимации и звука и был принят за общий стандарт. VRML браузеры осуществляют рендеринг таких миров в реальном времени.

Общие советы по созданию файлов для VRML в Max R3.1


При создании 3д сцен для последующего экспорта в VRML вы всегда должны пользоваться следующими правилами:

Минимизация количества полигонов


VRML сцены не должны содержать больше 3000 полигонов, в противном случае могут возникнуть проблемы, и не только со скоростью загрузки. Техники, используемые для этого описаны ниже.

Анимация с использованием простейших трансформаций


Анимация простейших трансформаций (масштабирование, перемещение, вращение) занимает гораздо меньше места в файлах VRML чем анимация использующая координатную интерполяцию. При координатной интерполяции VRML экспортер вынужден просчитывать каждую вершину отдельно, что отнимает время и существенно увеличивает размер конечного файла. Координатная интерполяция используется при анимации с использованием spacewarps, taper, модификаторов bend и twist, а также при анимации с использованием стека модификаторов и параметров объекта.

Материалы


Пользуйтесь исключительно материалами типов standard и multi/sub-object. Другие типы материалов (composite, morpher, raytrace) экспортироваться не будут.

Текстуры


Использование текстур увеличивает размер конечного файла, поэтому пользуйтесь текстурами небольшого размера и не злоупотребляйте ими.

Освещение


Если вы используете только стандартное освещение Max, скорее всего объекты вашей сцены не будут достаточно освещены. Обычно бывает необходимо добавить дополнительные источники освещения и при этом учитывать возможные манипуляции и передвижения пользователя. Если вы используете несколько источников освещения - уменьшите у них параметр multiplier иначе сцена будет слишком яркой.


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

Полигоны


Перед экспортом в VRML необходимо прятать те полигоны, которые невозможно увидеть. Спрятанные полигоны (hidden faces) не будут экспортироваться, что позволит существенно сократить размер файла.


Используйте примитивы (sphere, cylinder, cone, box и т.д.) где только возможно. Конвертирование объекта в editable mesh увеличит размер файла даже при минимальных изменениях геометрии.

Основные шаги при создании VRML сцен


Ниже приведен наиболее выгодный порядок действий по созданию VRML сцен.

    создание геометрии

    создание источников освещения и камер

    присваивание объектам материалов и текстур

    анимирование

    вставка вспомогательных VRML-объектов

    экспорт в VRML

    использование барузера для тестирования файла

    редактирование файла в текстовом редакторе (при необходимости)

Советы по созданию геометрии, камер и освещения а также материалов и анимации были даны выше, дальше мы рассмотрим собственно процесс экспорта и подготовку к нему.

Вставка вспомогательных VRML-объектов


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

Первый шаг является общим по созданию любого вспомогательного объекта (helper object):

Откройте панель Creation и выберите вкладку Helpers.

В выпадающем меню выберите VRML 97.

Выберите тип объекта (Anchor, AudioClip, Background и т.д.) нажав на соответствующую кнопку.

Во вьюпорте Max кликните мышкой, чтобы создать объект. Если вы не уверенны в своих действиях - создавайте объект в Top viewport.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    заголовок;

    описание прототипов;

    описание сцены;

    маршруты событий.

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

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

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

#VRML V2.0 utf8

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

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

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

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

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

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

0 0 0, 0 0.5 0, 0 1 0

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

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

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

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

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

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

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

0 0 0 - черный

1 1 1 - белый

1 0 0 - красный

0 1 0 - зеленый

0 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 . Посетите виртуальный Мавзолей и обратите внимание, как выглядит надпись над входом. И это при том, что изображение заведомо рассматривается в “родном” ПО!

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

Очень важно для нас сейчас, что существуют такие разновидности полей, в которых хранится ссылка на следующий узел (узлы) . Именно такой тип имеют поля appearance, material и geometry; с их помощью происходит “соединение” узлов между собой. Таким образом, неуклюжая запись Shape{appearance Appearance вдруг неожиданно обретает весьма важный структурный смысл. Ее следует понимать так: объект типа Shape имеет поле appearance, с помощью которого к нему присоединен объект типа Appearance, описывающий особенности изображения всего объекта. Рекомендуем читателям самостоятельно поупражняться в расшифровке структуры изучаемого фрагмента, используя приведенный ниже рисунок.

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

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

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

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

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

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

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

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

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

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

eventIn set_X

field X

eventOut X_changed,

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

Примечание. Интересно подчеркнуть, что похожую структуру (поле, метод чтения и метод записи) имеют свойства объектов в Delphi . Например, когда вы пишете 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.
В конце файла помещаются строки следующего вида:

ROUTE <Имя узла>.<Имя исходящего события> TO <Имя узла>.<Имя входящего события>

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

Примеры

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

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

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

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

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

#VRML V2.0 utf8
Shape
{appearance Appearance
{material Material
{transparency 0.7}
} # end Appearance
geometry Box{ }
} # end Shape

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

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

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

# Этот текст надо добавить к примеру 6.1.2!
Shape
{appearance Appearance
{material Material
{diffuseColor 1 0 0}
} # end Appearance
geometry IndexedFaceSet
{coord Coordinate
{point [-1 1 -1, 1 1 -1, 1 -1 1, -1 -1 1]}
coordIndex
solid FALSE
} # end IndexedFaceSet
} # end Shape

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

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

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

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

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

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

SpotLight {location 0 0 3}

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

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

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

#VRML V2.0 utf8
DEF Spin_Timer TimeSensor
{cycleInterval 4
loop TRUE
} # end TimeSensor

DEF Spin_Interpolator OrientationInterpolator
{key
keyValue
} # end OrientationInterpolator
DEF Rotating_Cube Transform
{children
[
# 6.1.3
Shape
{appearance Appearance
{material Material
{transparency 0.7}
} # end Appearance
geometry Box{ }
} # end Shape
Shape
{appearance Appearance
{material Material
{diffuseColor 1 0 0}
} # end Appearance
geometry IndexedFaceSet
{coord Coordinate
{point [-1 1 -1, 1 1 -1, 1 -1 1,
-1 -1 1]}
coordIndex
solid FALSE
} # end IndexedFaceSet
} # end Shape
# end 6.1.3
] # end children
} # end Tranform

# 6.1.4
SpotLight {location 0 0 3}
# 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 ) подачу сигналов для очередного поворота. Скорость вращения можно регулировать значением поля 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. Самое первое решение. На первом этапе создадим изображение, руководствуясь исключительно простотой действий и не обращая пока внимание на оптимальность результатов. “Платой” за такой подход всегда является хотя и легко читаемая, но чрезвычайно громоздкая программа. Тем не менее в обучении такой подход часто бывает оправдан, поскольку можно быстро увидеть результат. А оптимизацией займемся в следующем разделе.

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

#VRML V2.0 utf8 Transform # bottom {children # end children } # end Transform Transform # middle {translation 0 1.7 0 children # end children } # end Transform Transform # top {translation 0 2.8 0 children # end children } # end Transform Transform # right {translation 0.9 1.7 0 children # end children } # end Transform Transform # left {translation -0.9 1.7 0 children # end children } # end Transform Transform # red nose {rotation 1 0 0 1.57 translation 0 2.65 0.4 children # end children } # end Transform Transform # right eye {rotation 1 0 0 1.57 translation 0.1 2.8 0.38 children # end children } # end Transform Transform # left eye {rotation 1 0 0 1.57 translation -0.1 2.8 0.38 children # end children } # end Transform

Нетрудно видеть, что снеговик состоит из 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) цвета.

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

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

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

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

PROTO KOM
{
Transform
{translation IS p
children
# end children
} # end Transform
} # end KOM
KOM {}
KOM {p 0 1.7 0 r 0.7}
KOM {p 0 2.8 0 r 0.4}
KOM {p 0.9 1.7 0 r 0.3}
KOM {p -0.9 1.7 0 r 0.3}

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

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

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

translation IS p

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

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

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

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

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

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

#VRML V2.0 utf8
Anchor
{url "http://inf.1september.ru"
children
}

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

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

#VRML V2.0 utf8
DEF SphereWithSound Collision
{children
}
ROUTE SphereWithSound.collideTime TO BoomSound.startTime

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

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

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

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

Ссылки

1. Teaching Teaching & Understanding Understanding. http://www.daimi.au.dk/~brabrand/short-film/ .

2. Авдуевский А. По следам газонокосильщика. LAN, 1997, № 1. http://www.osp.ru/lan/1997/01/132452/ .

3. Медведев А. Реальная Виртуальность. http://www.ixbt.com/peripheral/real-vrml.html Loop по-английски означает “петля”; в компьютерной терминологии это общепринятое название цикла.

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

Теперь о программах. При создании мира Вам понадобятся разные программы для разных целей:

Программы для создания 3D объектов и миров

Я не касаюсь программ типа 3DS, которые хотя и могут экспортировать в VRML код, все-таки специально на эти цели не ориентированы, посему создают ОЧЕНЬ НЕоптимальный код (см пример в разделе Extrusion). Советую такие программы при создании миров не использовать вообще!

Программы для проверки и оптимизации VRML кода

Существуют программы, которые проверяют готовый код на соответствие VRML спецификации, а также на совпадение значений параметров с принятыми в спецификации по умолчанию (удаление такого излишнего текста позволяет сильно сократить объем файла!) Можете забрать две программки и (vorlon более солидная вещица).

В этом же классе есть и свои "тяжеловесы" - профессионаьные программы со множеством разнообразных возможностей. Можете посмотреть в сети chisel (), и flamingo (). Обе программы - это нечто!

Программы для создания текстур

Более универсально - научиться или, если Вы уже умеете, продолжать работать с Photoshop"ом. Уж по этому продукту в русской сети великое множество документов, конференций и т.д.

Но есть и более специализированные вещицы, такие как Infinity textures

Программы для создания звука

Звук пока плохо прижился в интернете в целом, и в создании виртуальной реальности, в частности. Спецификацией VRML97 строго предписано поддерживать формат WAV и рекомендовано поддерживать MIDI. У меня не возникало потребности специально для создания миров записывать и редактировать звуковые файлы. Если задумать что-нибудь прилично-качественно-звучащее, то получится очень большого размера, что не есть хорошо. Так что это отпадает, а простенькие звуки типа скрипа, звона и т.д. всегда можно найти в сети.

Но если у Вас другое мнение/опыт, мыльте - обсудим.

Броузеры

Броузеров для VRML файлов есть довольно много (больше, чем редакторов). Я остановлюсь на четырех, поддерживающих VRML97 (Microsoft VRML 2.0 Viewer, Cosmoplayer, GLView, Cortona), хотя если Вы собираетесь часто просматривать файлы VRML1.0, то можно еще посоветовать Chaco VRScout (очень быстрый!) и VRWeb.

Так вот, впечатление от работы с броузерами довольно смешанное, у каждого есть плюсы и минусы. Самый быстрый - Cosmoplayer (хотя некоторые склоняются к Cortona. Может быть, я ведь статистику по fps не вел. Если интересно, подробнее , да и в comp.lang.vrml периодически этот вопрос поднимают).

Здесь таблица, в которой я постепенно накапливаю свои недовольства разными броузерами. Желающих опровергнуть или просветить милости прошу в мыло.

Недостатки или то, что мне кажется неудачным
Cosmoplayer 2.1 - неверное отображение некоторых сложных объектов, созданных с помощью Extrusion
Cortona (ver. 2.0 release 20) - VRML сцена, загруженная из другой VRML сцены (например с помощью anchor"а) не рассматривается, как новый документ, поэтому к предыдущей сцене Вы не вернетесь кнопкой "Back"
MS VRML2.0 Viewer (ver. 1.0) куча недостатков, все сюда не влезут... :
- проблемы при отображении PointSet
- не учитывает размеры аватара из NavigationInfo
- не поддерживает обращение к viewpoint"ам через #имя_viewpoint
- вылетает на файлах с интерполяторами, созданными в CosmoWorlds
GLView - не распознает значение "ru" поля language узла FontStyle

Если Вы только просматриваете VRML файлы, то лучше не ставить MS VRML Viewer, но а если Вы их и создаете, то наоборот старайтесь протестировать в нем свои файлы, как он их исковеркает.