Реальная виртуальность
АрхивБлуждая по просторам Интернета, постоянно рискуешь напороться на некий объект, способный легко уничтожить уйму столь дефицитного личного и пока еще столь дорогого сетевого времени. Подобные черные дыры виртуальных закоулков, без сомнения, известны любому пользователю, сделавшему хотя бы несколько ходок по Сети, не говоря уже о профессиональных серферах и сталкерах. Странные существа люди - они даже составляют специальные хит-парады, посвященные подобным местам периодического времяубийства. Да вы и сами хорошо знаете всяческие "Рэмблеры" и прочие "Топ 1000". С другой стороны, еще никто не пытался создать хит-парад Интернет-технологий, способных качественно и масштабно уничтожать личное время. Пожалуй, HTML, mp3 и... и запишите VRML в первую пятерку!
Как это все случилось, в какие вечера...
Все началось 27 октября 1969 года, с первого TCP пакета. Затем были telnet 1.0.0.2 и ftp 1.0.0.2. Еще позже появился ftp.cc.mil и прочие DNS. В 1989 году начал развиваться WWW. Впрочем, все это события глубоко довиртуальной эры.
В январе 1994 года Mark Pesce и Tony Parsi придумывают концепцию трехмерного 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 формат файлов программной библиотеки Open Inventor. Gavin Bell, инженер SGI, модифицировал этот формат, создав первый вариант языка VRML, анонсированный в октябре 1994 года на Второй всемирной конференции по WWW. 5 ноября предложенный Беллом вариант превратился в официальный проект стандарта VRML 1.0. Его коллега, Paul Strauss, написал первый VRML-клиент, назвав его труднопроизносимым именем 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. Первоначальный проект забит и затоптан в ходе обсуждения, но присланы шесть новых вариантов от ведущих компьютерных фирм:
А - Active VRML от Microsoft,
Б - Dynamic Worlds от GMD со товарищи,
В - HoloWeb от Sun,
Г - Moving Worlds от Silicon Graphics со товарищи,
Д - Out of this World от Apple,
Е - Reactive Virtual Environment от IBM Japan.
В ходе обсуждений выявляется лидер - Moving Worlds. Вскоре благородная Apple отказывается от своего проекта в пользу Moving Worlds, остальные гиганты продолжают настаивать на своих вариантах. Постепенно Moving Worlds становится проектом стандарта VRML 2.0 и передается в ISO. В июне 1996 года представители VAG договариваются, подписывая окончательное соглашение считать работы над VRML 2.0 завершенными. Кстати, несмотря на поиск консенсуса, работа по созданию и принятию стандарта продвигается невероятно быстро. В декабре 1996 года стандарт ISO/IEC DIS 14772-1 (VRML 2.0) принят ISO окончательно. А в октябре 1997 года был создан проект стандарта новой расширенной версии языка, названной, в соответствии с последними веяниями, VRML 97. Следует отметить, что VRML - абсолютный рекордсмен по скорости разработки и принятия официального стандарта среди всех компьютерных языков.
Из чего сделаны мальчики?
Это я, разумеется, хватил через край. Из чего сделаны мальчики и девочки - известно всем еще со времен счастливого детства и ненавязчивой детской поэзии. Компьютерные же мальчики и девочки, как известно, сделаны из закрашенных треугольников. А вот из чего состоит VRML, мы сейчас попытаемся узнать.
Итак, нам необходимо обеспечить выполнение двух основных действий:
А - описать виртуальный мир,
Б - предъявить этот мир пользователю, позволив ему взаимодействовать с ним.
Решим эти задачи, попробовав себя в непростой роли создателей VRML. В первую очередь необходимо создать информационную структуру, описывающую мир [1]. Для этого используется чрезвычайно гибкая и удобная (для пользователя или математика, но не для реализующего ее обработку программиста) структура: граф, то есть набор узлов (в терминологии VRML - node), дополненный информацией о связях между ними. Узлы содержат поля (fields) и события (events). Cвязи между узлами графа реализуются с помощью полей, имеющих тип указателя на другой узел. Фактически события также представляют собою указатель на объект, способный эти события либо генерировать, либо воспринимать. Отсюда возникает разделение событий на два типа: выходящие (EventOut) и входящие (EventIn) соответственно.
Благодаря подобной концепции, VRML, несомненно, относится к объектно-ориентированным языкам. Итак, вся эта красота, схематически изображенная на рис. 1, и описывает мир, разумеется, в VRML-понимании. Поля Field1 и 2 представляют собою первичные параметры (например, цвет или точка в трехмерном пространстве), Field3 является набором указателей на другие узлы, а Event1 - событием, поступающим от двух узлов.
Структура есть. Предположим, что основные типы узлов, событий и полей также определены. Но пока это лишь на бумаге и в мыслях, нам же необходимо создать синтаксис языка - формальное описание возможного содержимого файла, в рамках которого наш мир будет формулироваться человеком или редактором. А затем, возможно, он будет интерпретироваться и демонстрироваться программой-клиентом (браузером). Разумеется, браузер также необходимо разработать и написать, хотя, формально, рамки стандарта заканчиваются уже на этапе формулировки синтаксиса и описания функционирования определенных заранее узлов. Конкретная реализация программы, то, как она будет представлять информацию пользователю, и то, как она будет обеспечивать его взаимодействие с виртуальным миром, остаются на совести разработчиков.
Впрочем, этот факт совершенно не спасает от стойкого ощущения дежавю во время работы с большинством распространенных на данный момент клиентов. Достаточное ограничение в простор реализации вносят четкие правила относительно генерации событий и строго фиксированный набор параметров, определяющих визуальное (геометрия, материал и освещение) описание объектов. Подводя итоги, составим табличку (см. ниже).
Стратегия | Описание трехмерного виртуального мира, возможность взаимодействия с объектами. |
Понятийный уровень | Понятие узла, набора, поля, события. |
Событийный уровень | Правила генерации событий. |
Структурный уровень | Конкретные типы полей и событий (точка, число, цвет, URL...). Конкретные типы узлов, их структура (источник...). Синтаксис описания структур ([], {}, ROUTE, DEF...). |
Языковой уровень | Синтаксис описания узлов (Field, EventIn...). Имена предопределенных типов полей (SFColor, SFBool...). Имена предопределенных типов событий (addChildren...). Имена предопределенных типов узлов (Anchor, Material...). |
Клиентский уровень | Среда распространения VRML-описаний (файлы, HTTP...). Среда визуализации (OpenGL-устройства, принтер...). |
Немного об устройстве мира
VRML представляет собой строго структурированный язык, и для понимания того, как устроен мир VRML, необходимо хотя бы минимальное знакомство с его синтаксисом. Любители формальных грамматик и полных описаний, а также просто заинтересованные читатели могут заглянуть на www.arch.soton.ac.uk/Manuals/VRML/spec/index.html, где и обнаружат исчерпывающее описание синтаксиса и концепций VRML 2.0, мы же здесь лишь вкратце рассмотрим основные лингвистические конструкции.
Основными строительными кирпичиками языка VRML, его атомами являются первичные типы. Все типы полей делятся на два класса: содержащие одно значение (так называемые SF типы) и наборы (MF). Для пущей простоты имена первых всегда начинаются с букв SF, а вторых - с MF. Например, если у нас есть поле, набор целого типа MFInt32 под названием MyIntegerSet, мы можем описать его следующим образом:
MFInt32 MyIntegerSet
Кстати, VRML болезненно чувствителен к разнице между заглавными и строчными буквами. Поэтому sfint32 и SFInt32 - два различных идентификатора. Некоторые первичные типы имеют как SF, так и MF разновидность. Так, если тип называется Color, то соответствующие имена записываются как SFColor и MFColor. Всего первичных типов девятнадцать.
Пойдем дальше. Основным объектом языка является узел. VRML-файл (программа) состоит из некоторого количества прототипов (определений новых типов узлов), некоторого количества узлов, заполненных конкретной информацией, и некоторого количества событийных связей между узлами. Все эти элементы могут быть расположены в произвольном порядке.
Специальное слово ROUTE позволяет установить автоматическую отправку конкретного исходящего события одного узла в конкретное входящее событие другого. Можно создавать именованные экземпляры узлов с возможностью их одновременного использования в нескольких местах программы с помощью команды DEF. Подобный именованный узел может быть далее использован с помощью другого ключевого слова - USE.
Заполним для примера узел предопределенного типа 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
}
}
]
}
В данном примере мы определяем ссылку на сайт всеми любимой компании, которая (ссылка, не компания) содержит объект, содержащий, в свою очередь, геометрическую информацию (сфера) и описание материала, имеющего красный цвет в рассеянном свете. Уф... Вот такая вложенная структура данных понадобилась ради одного маленького красненького шарика! Не правда ли, VRML - достаточно эффективное средство убийства времени набирающего подобные программы человека?
Но вернемся к примеру. Для того чтобы получить полноценный VRML-файл, нам осталось добавить в начало такую вот строчку:
#VRML V2.0 utf8
Теперь этот файл можно назвать "КакВамУгодно.wrl", открыть в соответствующем обозревателе и даже кликнуть по красному шарику, после чего, естественно, попасть в гости к Биллу.
До сих пор мы имели дело с заранее определенными в языке типами узлов Anchor, Shape, Sphere и Material. Но если мы того пожелаем, можно легко определить и новый тип узла, а связав события, происходящие в узлах, с помощью оператора ROUTE, мы сможем выстроить сложные иерархии объектов, в которых изменение каких либо параметров одного узла вызывает незамедлительную реакцию всей системы. Толкнул кубик, а с ним двинулся и шарик, и все такое...
К сожалению, места для того, чтобы привести какую-либо VRML-программу, демонстрирующую возможности языка, в журнале просто не хватит: благодаря особенностям синтаксиса VRML, даже простенький код, описывающий изображенную на рис. 2 табуретку и дающий ей возможность реагировать на внешние раздражители, занимает более 60 строк. Так что, набив всего полтора килобайта кода, можно легко получить табуретку синего цвета с красными ножками, способную повернуться вокруг себя за две секунды, если к ней прикоснулись. Избушка, избушка, встань к монитору... Если же мы добавим поддержку Java Script (точнее, ECMA Script), заставив нашу табуретку циклически менять размер (дышать), пока над ней находится курсор обозревателя, вне зависимости от того, прикоснулись мы к ней или нет, то код разрастется еще на полкилобайта. А представьте себе, сколько займет мало-мальски серьезная сцена со сложными моделированными объектами! Таким образом, VRML при практически неограниченных возможностях создания сложных интерактивных миров страдает ха-арошей избыточностью.
Клиенты всегда правы
Создав мир, мы, скорее всего, не удовлетворимся рассматриванием десятиметровых "простыней" кода, а захотим все же взглянуть на творение рук своих в трехмерном, виртуально-реальном виде. И тут нам понадобится VRML-клиент.
Все клиенты обладают достаточно схожим интерфейсом. Как правило, навигация осуществляется манипулятором, например мышкой, причем есть несколько легко переключаемых режимов:
- движение вперед-назад и повороты вправо-влево,
- движение вверх-вниз и вправо-влево,
- повороты вверх-вниз и вправо-влево,
- автоматическое движение до указанного объекта,
- переход на заранее определенную точку зрения,
- возможность "потрогать" объект.
Эти действия являются стандартными практически для любой клиентской программы.
Опишу два самых успешных, распространенных и самозабвенно конкурирующих обозревателя, соответствующих стандарту 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 (рис. 3). Отличные скоростные качества. Данный клиент всячески рекомендуется мною к использованию.
Поддерживаются различные платформы, в том числе: SGI, Windows (9x/NT/3.11) и Mac OS. Последнюю версию (Cosmo Player 2.1), море информации и отлично оформленный сайт с VRML-афишками вы найдете по адресу cosmosoftware.com.
Microsoft VRML 2.0 viewer
Разработка... понятно чья. Основан на коде упомянутого ранее WorldView. Представляет собою plug-in для браузера, интегрируется в Microsoft Internet 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) также не забыта разработчиками: OS/2 VRML viewer можно поискать, например, по адресу INDY.EAGEN.com/WarpSpace.
|
Скальпель, пинцет... огурец...
Существует огромное множество инструментария для работы с VRML. Сформулируем, вкратце, основные категории подобных продуктов:
- конвертеры - преобразуют файлы других трехмерных форматов в VRML,
- валидаторы - проверяют VRML-файлы на наличие синтаксических и структурных ошибок,
- интерактивные редакторы - позволяют редактировать VRML-миры без непосредственного программирования, как это делается в большинстве трехмерных студий. Все эти продукты можно поискать в Сети по нижеприведенным ссылкам.
Где красиво убить время
- http://iis.kaist.ac.kr/~leekj/VR/vrsite.html - лучший набор ссылок на имеющие какое-либо отношение к VRML места в Сети. Библиография по статьям про VRML. Интересно, толково, хорошо систематизировано, большой охват и много, много, много... И, хотя две трети ссылок безнадежно устарели, этот сайт строжайше рекомендован к посещению.
- www.hitl.washington.edu/projects/knowledge_base/vrml.html - огромный каталог VRML-проектов и сайтов.
- www.tcp.ca/gsb/VRML/vrml-resources.htm - список VRML-ресурсов Сети.
- www.it.dtu.dk/~hahl/3dmed/index_old.html - медицинский проект с использованием VRML, на странице которого море полезных ссылок.
- www.digitalwizards.com.au/vrml - виртуальные VRML-шахматы и другие интересные вещи.Заключение
На данный момент VRML - лишь игрушка, пусть и очень многообещающая. Пройдут годы, прежде чем трехмерный интерфейс станет реальностью как для Сети, так и для операционных систем. Ничего не поделаешь, люди слишком консервативны. Да, технологии развиваются. Но это технологии. Люди развиваются медленнее...
1 (обратно к тексту) - С точки зрения функционального подхода правильно говорить: описание сцены или мир, но когда мы займемся программированием на языке VRML, будем использовать процессуальное название программа.