![]() |
Реальная Виртуальность.
Блуждая по просторам интернета, постоянно рискуешь напороться на некий объект, способный легко уничтожить уйму столь дефицитного личного и, пока еще, столь дорогого сетевого времени. Подобные Черные Дыры виртуальных закоулков без сомнения известны любому пользователю, сделавшему хотя бы несколько ходок, не говоря уже о профессиональных серферах и сталкерах сети. Странные существа люди - они даже составляют специальные хит-парады, посвященные подобным местам периодического времяубийства. Да, Вы и сами хорошо знаете всяческих Рэмблеров и прочие Топ 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. Первоначальный проект забит и затоптан в ходе обсуждения, но присланы шесть новых вариантов от ведущих компьютерных фирм:
Из чего сделаны мальчики? Это я, разумеется, хватил через край. Из чего сделаны мальчики и девочки известно всем, со времен счастливого детства и ненавязчивой детской поэзии. Компьютерные же мальчики и девочки, как известно, сделаны из закрашенных треугольников. А вот из чего состоит VRML, мы сейчас попытаемся узнать. Итак, нам необходимо обеспечить выполнение двух основных действий:
Решим эти задачи, попробовав себя в непростой роли создателей VRML. В первую очередь необходимо создать информационную структуру, описывающую мир. Чрезвычайно гибкая и удобная (для пользователя или математика, но не для реализующего ее обработку программиста) структура – граф. Т.е. набор узлов (в терминологии VRML - node) дополненный информацией о связях между ними. Узлы похожи на обычные структуры данных, они содержат поля (fields) и события (events). Cвязи между узлами реализуются с помощью полей, имеющих тип указателя (на узел). Фактически, события также представляют собою указатель на объект способный эти события генерировать, или воспринимать, что сразу разделяет их на два типа – исходящие (EventOut) и входящие (EvevnIn), соответственно. Благодаря подобной концепции, VRML, несомненно, может считаться объектно-ориентированным языком. Все это безобразие, схематически изображенное на рисунке 1, в сумме описывает мир, в VRML понимании этого слова. Поля Field 1 и 2 представляют собою первичные параметры (например, цвет или точка в трехмерном пространстве), Field 3 является набором указателей на другие узлы, а Event 1 событием, поступающим от двух узлов. NODE NODE 2 Field 1 Field 2 связь Field 3 [ Field 3.1 NODE 3 Field 3.2 связь … EventOut NODE 4 ] EventIn 1 EventOut события Рисунок 1. Структура есть, предположим, что основные типы узлов, событий и полей также определены. Но, пока, это лишь на бумаге и в мыслях, нам же необходимо создать синтаксис языка – формальное описание возможного содержимого файла, в рамках которого наш мир будет формулироваться человеком или редактором. А затем, возможно, он будет интерпретироваться и демонстрироваться программой клиентом (так "успешно" обозванной мною обозревателем). Разумеется, обозревателя также необходимо разработать и написать, хотя, формально, рамки стандарта заканчиваются уже на этапе формулировки синтаксиса и описания функционирования определенных заранее узлов. Конкретная реализация программы, то, как она будет представлять информацию пользователю и то, как она будет обеспечивать его взаимодействие с виртуальным миром, остаются на совести разработчиков. Впрочем, этот факт совершенно не спасает от стойкого ощущения дежавю во время работы с большинством распространенных на данный момент клиентов. Достаточное ограничение в простор реализации вносят четкие правила относительно генерации событий и строго фиксированный набор параметров, определяющих визуальное (геометрия, материал и освещение) описание объектов. Подводя итоги, составим следующую табличку:
Типы, странные и не очень. Разберемся с первичными типами, основными строительными кирпичиками языка VRML. Все типы полей делятся на два класса, содержащие одно значение (так называемые SF типы) и наборы (MF). Для пущей простоты, имена первых всегда начинаются с букв SF, а вторых, как Вы, наверное, уже догадались, с MF. Для записи элементов набора используются квадратные скобки. Например, если у нас есть поле, набор целого типа MFInt32, под названием MyIntegerSet, мы можем описать его следующим образом:
Кстати, VRML болезненно чувствителен к разнице между заглавными и строчными буквами. Поэтому, sfint32 и SFInt32 - два различных идентификатора. Это к слову, а теперь, попробуем заполнить наш набор значениями: MyIntegerSet [ 1, 0, 0, 1 ]В одной очень известной трехмерной игре, помнится, как раз подобной комбинацией и открывалась крайне важная дверь. Разумеется, еще мы можем оставить набор пустым или записать в него лишь одно значение:
И, даже, поступить так: MyIntegerSet [ 0, ] Некоторые первичные типы имеют как SF так и MF разновидность, например, если тип называется Color то соответствующие имена записываются как SFColor и MFColor,. Следующая таблица претендует на некоторую долю информативности:
Засим, первичные типы успешно закончились. Узлы, связи и все все все… А теперь посмотрим все остальное. Основной объект языка – узел. VRML файл (программа) состоит из некоторого количества прототипов (определений новых типов узлов), некоторого количества узлов, заполненных конкретной информацией, и не менее некоторого количества событийных связей между узлами. Все эти элементы могут быть расположены в произвольном порядке. Экземпляры узлов описываются и заполняются так: <Название существующего типа> { Где специальное слово ROUTE позволяет установить автоматическую отправку конкретного исходящего события одного узла в конкретное входящее событие другого. Также, можно создавать именованые экземпляры узлов, с возможностью их одновременного использования в нескольких местах программы: DEF <Имя узла> <Экземпляр узла> Подобный именованный узел может быть далее использован с помощью другого ключевого слова: USE <Имя узла> Заполним, для примера, узел предопределенного типа Anchor, попутно продемонстрировав использование неразлучной парочки DEF/USE: # Простой красный
материал Определяет ссылку на сайт всеми любимой компании, которая (ссылка, не компания) содержит объект, содержащий, в свою очередь, геометрическую информацию (сфера единичного радиуса) и описание материала имеющего красный цвет в рассеянном свете. Уф… Вот такая вложенная структура данных понадобилась ради одного маленького красненького шарика, неправда ли, это эффективное средство убийства времени набирающего подобные программы человека? Шутки в сторону, вернемся к примеру. Поле children является стандартным для всех узлов, содержащих подчиненные узлы (так называемые "дети") и представляет собою набор типа MFNode. Как правило, узел каким то образом влияет на всех своих детей, например, перемещая их в пространстве, масштабируя, или придавая им какие либо общие свойства. В действительности, узел типа Material имеет множество других параметров, но, в данном примере, мы полагаемся на их значения по умолчанию, определенные где-то в недрах языка. Обратите внимание на комментарий, который обозначается символом # и продолжается до конца строки включительно. Кстати, если добавить в предыдущий пример такую вот первую строчку: #VRML V2.0 utf8 Обязательную для всех VRML 2.0 программ, мы получим полноценный файл, который можно назвать "КакВамУгодно.wrl", открыть в соответствующем обозревателе и даже кликнуть (по красному шарику). До сих пор, мы имели дело с заранее определенными, в языке, типами узлов Anchor, Shape, Sphere и Material. Но, если мы того пожелаем, можно легко определить новый тип узла. Делается это следующим образом: PROTO <Название нового типа> [
Поле данных, реагирующее на события (exposedField) порождает исходящее событие <Имя поля>_changed, которое генерируется при изменении значения данного поля каким либо образом и входящее событие set_<Имя поля>, генерируя которое, значение поля можно менять. Разумеется, тип данных этих событий совпадает с типом обслуживаемого или поля. В квадратных скобках оператора PROTO задается интерфейс нового типа узла (доступные для использования поля и события), а в фигурных описывается его реализация. События представляют собою данные, какого либо типа, передаваемые от узла к узлу. Причем, настройка путей передачи происходит специальным ключевым словом ROUTE: ROUTE <Имя узла>.<Имя исходящего
события> Вот пример использования ROUTE – столь любимый мною красный шарик, издающий звук, когда с ним сталкивается наблюдатель: DEF SphereWithSound
Collision { Подобным образом можно легко строить сложно связанные иерархии
объектов, в которых изменение каких либо параметров одного узла вызывает
незамедлительную реакцию всей системы. Толкнул кубик, а с ним двинулся и
шарик, и все такое… #VRML V2.0 utf8 PROTO TwoColorStool
[ Это определение нового типа узла – двухцветной табуретки. У нее есть
два поля определяющие цвет сиденья и ножек соответственно. Давайте
внимательно посмотрим на использованные для ее создания узлы:
DEF XForm Transform {
children [ TwoColorStool { legColor 1 0
0 seatColor 0 0 1 } Здесь, мы определяем новый узел XForm типа Transform, который кроме уже
описанной нами табуретки (синего цвета с зелеными ножками, рисунок 2) DEF Sizer Script
{ Вот так, с помощью предопределенного узла Script мы получаем практически безграничные возможности в определении правил, по которым будет жить наш мир. В данном примере мы заставляем нашу табуретку циклически менять размер (дышать), пока над ней находится курсор обозревателя, вне зависимости от того, прикоснулись мы к ней или нет. Для этого используется событие isOver узла TouchSenser, реагирующее на описанную выше ситуацию с мышиным курсором, таймер генерирующий 20 раз в секунду событие cycleTime и небольшой скрипт, создающий масштабирование, которое затем применяется к объекту. Дополниловка. Все, что было написано ранее, ни в коем случае не претендует на роль руководства или описания. Это лишь попытка показать, что же в действительности стоит за весьма претенциозным термином VRML. Любители формальных грамматик и полных описаний, а также просто заинтересованные читатели могут заглянуть сюда: url "http://www.arch.soton.ac.uk/Manuals/VRML/spec/index.html" обнаружив исчерпывающее описание синтаксиса и концепций VRML 2.0. И множество прокомментированных примеров от SGI, послуживших отличной основой для написания приведенных выше VRML программ. Впрочем, будьте внимательны: в доступных по этому адресу примерах, к моему искреннему удивлению, практически сразу обнаружилось несколько грубых ошибок. Которые, разумеется, убили некое сверхплановое количество свободного времени, но были успешно опознаны и уничтожены. Предвидя возможные недостаток желания или нехватку сетевого времени, приведу список некоторых предопределенных узлов VRML 2.0, отметив, где и как их можно использовать:
Клиенты всегда правы. Все клиенты обладают достаточно схожим интерфейсом. Как правило, навигация осуществляется манипулятором, например мышкой, причем есть несколько легко переключаемых режимов:
Эти действия являются стандартными практически для любой клиентской программы. Опишу два самых успешных, распространенных и самозабвенно конкурирующих обозревателя, соответствующих стандарту VRML 2.0. Cosmo Software - Cosmo Player: Microsoft VRML 2.0 viewer: Редакторы, корректоры,
конверторы: Где красиво убить время. http://iis.kaist.ac.kr/~leekj/VR/vrsite.html
– лучший набор ссылок на имеющие какое либо отношение к VRML места в сети.
Библиография по статьям про VRML. Интересно, толково, хорошо
систематизировано, большой охват и много, много, много… И, хотя две трети
ссылок безнадежно устарели, этот сайт строжайше рекомендован к
посещению. Заключение. На данный момент VRML лишь игрушка, пускай и очень многообещающая. Пройдут годы, прежде чем трехмерный интерфейс станет реальностью как в случае сети, так и для операционных систем. Ничего не поделаешь, люди слишком консервативны. Да, технологии развиваются. Но это технологии. Люди развиваются медленнее…
|
![]() |
![]() |
©2000 ATInfo: A. Medvedev, S. Anohin. Поправки, дополнения, новости? Пишите нам письма! |