Сетевой VRML

Что такое сетевой (многопользовательский) VRML - мир и чем он отличается от обычного VRML - мира?
Обычную VRML - сцену могут одновременно посещать несколько пользователей. Они перемещаются, изменяют сцену (если, конечно, сцена интерактивная), но, при этом, каждый из них видит свою копию виртуального мира. Пользователь не знает, что, он не одинок в этом виртуальном мире, он не видит действий других обитателей мира.
Многопользовательская VRML - сцена лишена этих недостатков. В ней каждый посетитель представлен специальным сетевым объектом - аватаром. Именно этот аватар и видят другие пользователи. Действия, производимые посетителями над виртуальным миром, также синхронизируются и видны всем.

Как это делается?

Обширный список ресурсов посвящённых сетевым технологиям VRML можно найти на web3d.about.com:
http://web3d.about.com/compute/web3d/cs/multiuser/index.htm
Ключевым понятием многопользовательских миров является синхронизация. Т.е. объекты в сцене должны обладать свойством сетевого взаимодействия. К сожалению, в стандарте VRML97 таких специальных сетевых узлов не предусмотрено. Однако, создание сетевых сцен возможно несколькими обходными путями:

Использование нестандартных расширений

Технологии blaxxun interactive и ParallelGraphics предоставляют широкие возможности для организации сложных многопользовательских сервисов.
Вот примеры таких виртуальных сообществ:
За столь богатые возможности приходится платить жёстким привязыванием к одному из VRML - клиентов и обязательным наличием специализированного сервера.
Более подробно можно почитать здесь:

Реализация сетевой части проекта на Java

Всё сетевое взаимодействие программируется на языке JAVA. Связь JAVA с VRML - сценой осуществляется:
  1. через VRML - объект Script,
  2. либо через EAI.
Теоретически, первое решение должно работать везде, где установлен VRML - клиент и Java VM. Реально же, отсутствие поддержки Java в объекте Script для blaxxun Contact, и "медленная смерть" CosmoPlayer, фактически, не оставляют выбора кроме Cortona VRML client.
Второй вариант, похоже, более жизнеспособен. Примером успешной реализации данного подхода служит проект VNet. Клиентская и серверная часть написаны на Java. Взаимодействие с VRML - через EAI. Доступны дистрибутивы для MS Windows и Unix.
Как это работает, можно посмотреть здесь:
Однако, поддержка EAI в VRML - клиентах имеет существенные различия. Поэтому использование EAI, несмотря на кажущуюся универсальность решения, тоже может привести к выбору одного из VRML-клиентов и WEB-браузеров.
Более подробно можно почитать здесь:

Реализация сетевой части проекта на JavaScript

Поддержка JavaScript (ECMAScript) в VRML - клиентах является требованием стандарта VRML97. Это хорошая предпосылка для того, чтобы скрипт заработал во всех трёх клиентах и под любым WEB браузером (имеется ввиду MS Internet Explorer и Netscape Communicator).
Для обмена данными с серверным скриптом используется функция createVrmlFromURL объекта Browser. В её первом параметре (URL скрипта) можно передать любые параметры от клиента к серверу. Второй и третий параметр содержит VRML - узел и имя поля этого узла, в которые сервер вернёт данные. Обычно это объект Script и имя одного из его входных полей.
#VRML V2.0 utf8
DEF	main_SCR Script {
 eventIn MFNode get_wrl_from_server
 field SFNode myself USE	main_SCR
 field MFString server_url ["http://your.site.ru/your.asp"]
 url	"javascript:
  function initialize(){
    var param1 = 'some_param';
    var param2 = 'one_more_param';
    server_url[0] +='?param1='+param1+'&'+'param2='+param2;
    Browser.createVrmlFromURL(urla,myself,'get_wrl_from_server');
  }
  function get_wrl_from_server(val){
    trace('server response' + val.response1);
  }
  "
}
					
Получив данные от VRML - клиента серверный скрипт может "прикопать" их и сделать доступными для других. В MS IIS (PWS) для этих целей можно использовать встроенный объект Application.
К клиенту должен вернуться синтаксически правильный VRML - код. Поэтому серверный скрипт (в данном случае, это your.asp) передаёт параметры VRML-клиенту, как значения полей некоего пустого PROTO:
Response.Expires = 0;
Response.ContentType = "x-world/x-vrml";
Response.Write("#VRML V2.0 utf8");
Response.Write("\n");
Response.Write("PROTO _element_ [");
Response.Write("\n");
Response.Write(" exposedField SFString response1 \"Welcome\" ");
Response.Write("\n");
Response.Write("]{Group{}}");
Response.Write("\n");
				
Это - наиболее простой вариант организации сетевого взаимодействия. Однако, и возможности его не велики. Добиться хорошей синхронизации объектов достаточно проблематично.
Как это работает, можно посмотреть здесь:
VRML CHESS
VRML WARS
Вобщем, как обычно, выбор путей решения, зависит от условий поставленной задачи.
Сложные многопользовательские системы, рассчитанные на большое число посетителей, видимо, имеет смысл делать на фирменных нестандартных (пока) технологиях.
В остальных случаях можно выбирать между JAVA и JavaScript. Причём, чем меньше требования к синхронизации, тем больше смысла в использовании JavaScript.
дата обновления документа: