ハイパーグリッド
From OpenSimulator
OpenSim のハイパーグリッド(HyperGrid)
こちらもご覧ください Grider; Virtual World Model; HyperGrid Team
ハイパーグリッドとは何ですか?
ハイパーグリッドは OpenSim の拡張機能で、これを使うことでインターネット上の他の OpenSim へリンクし、エージェント (Agent) をシームレスにこれらの OpenSim へ移動させることができるようになります。この機能はスタンドアロンモードでもグリッドモードでも使用できます。ハイパーグリッドは仮想空間がウェブへ登場するために大きく貢献しています。
ハイパーグリッドの基本的な概念は、地域/グリッドの管理者が他人が運営するハイパーグリッド地域のハイパーリンクを自分のマップ上に作成する、というものです。ハイパーリンクが作成されると、ユーザは自分の地域と同じようにリンク先の地域とも交流できます。具体的にいうと、ユーザはその地域へテレポートすることができます。ユーザがハイパーリンク先の地域に到着すると、元々いた空間からログアウトせずにそのまま他の仮想空間に触れることになります。また、自分のインベントリには今まで通りアクセスできます。
ハイパーグリッドは GForge プロジェクトとして始まりましたが、今では OpenSim の標準パッケージに組み込まれています。OpenSim をハイパーグリッドモードで運用したい場合は、Installing and Running を参照してください。
仮想空間のハイパーリンク
ウェブのハイパーリンクはみなさんおなじみです。しかし、仮想空間のハイパーリンクとは何でしょうか?
ハイパーグリッド・モデルでは、仮想空間の 2D マップをウェブページと同じように考えます。仮想空間のハイパーリンク自体は、マップ上の1つの地域を指します。
OpenSim をベースとした仮想空間の基本モデルでは、既にハイパーグリッドの概念をいくらか取り入れています。マップを使って別の地域にテレポートすると、自分のエージェントが他の OpenSim サーバに移動する可能性があります。この移動は「エージェント転送 (Agent Transfer)」という立派な名前で、既に稚拙ながらウェブに存在しているものです。ハイパーリンクが参照されたときに発生します。ただし、基本モデルでは、ハイパーリンクには2つの厳しい制約が課せられています。
- 地域のマップ全体をグリッドサービス(Grid Service)として知られるセントラルサービス(Central Service)で管理すること。このサービスで、空間の全体像を全ての地域に提供すること。
- 転送可能なエージェントは、ユーザサービス(User Service)と呼ばれる他のセントラルサービスが知っているユーザのものであること。入ってくるユーザの情報がユーザサービスのデータベースに存在しなければ、エージェントの転送を行わない。
ハイパーグリッドは、単にこれらの2つの制約を取り払ったものです。
最初に、マップのコントロール機能をグリッドサーバからそれぞれの OpenSim インスタンスに移すことで、それぞれの OpenSim のローカルマップに「隣の地域 (Neightbers)」を追加できるようになっています(ただし、グリッド管理者が希望すれば、ハイパーリンクはグリッドサーバから提供するようにもできます)。こうすると、仮想空間はもっと面白く変化に富んだものになります。ある OpenSim で見ることのできるマップは、ハイパーリンクでテレポートすると、全く違うものになってしまいます。OpenSim の管理者として、マップに表示したい他の OpenSim を自由に設定することができます。
次に、知らないユーザ、例えば、他の仮想空間で登録したユーザなどのエージェントを転送できるようになっています。ハイパーグリッドでは、1つの中央集権的なユーザサービスを前提としたものではなく、世界中に無数に散らばったサービスで動作するようになっています。ハイパーグリッドに対応した OpenSim 間でエージェントが転送されると、ユーザに関する多くの詳細情報が渡ります。この情報の中には、転送を行うユーザが必要とする、サーバの一覧が含まれています。
利用シナリオ
ここに利用シナリオを一部紹介します。これらのシナリオの間に明確な区別はなく、だいぶ重なっています。これは排他的なリストではありません。この説明がハイパーグリッドを使ってみる際のヒントになればと思います。うまいシナリオがありましたら、どうぞこのリストに追加していってください。
Personal Worlds (個人空間) 最初のシナリオは、スタンドアロンの OpenSim でのものです。通常、スタンドアロンはインターネットからは完全に切り離されています。しかし、ハイパーグリッドモードで動作させると、スタンドアロンはネットワークに接続することができます。こうすると、仮想空間を自分のマシンで動かしながら、好きなところにリンクすることができます。例えば、友達のハイパーグリッド対応 OpenSim にリンクしたり、OSGrid のような公共グリッドのハイパーグリッド・ゲートウェイにリンクしたりすることができます。 このシナリオのいいところは、自分のアセットは全て自分のマシンに格納され、他のサーバーに格納されないことです。どこにでもあるようなバックエンド・ツールをつかってバックアップをとることができます。そんなによくないところは、自分のアセットが全部自分のマシンにあることです!ハードディスクがやられると吹っ飛びます(このため、常日頃からこまめにバックアップをとるようにしましょう)。 | |
Communities (コミュニティ) 2番目のシナリオは、広義のコミュニティに関するものです。人々が集まって、グループで小さなコミュニティ・グリッド(例: 集団活動を行う共通の仮想空間)を運営するといったものです。しかし同時に、コミュニティのメンバーが自分のスタンドアロンの仮想空間をメンテナンスすることになります。スタンドアロン OpenSim はコミュニティ・グリッドにリンクし、コミュニティ・グリッドは各メンバーの仮想空間に逆リンクを貼り、他の興味のある場所へリンクします。 メンバーの個人情報は各自のスタンドアロン OpenSim 上にあり、各自のアセットもそこに格納されるでしょう。ただし、コミュニティ地域で表示されるアセットは、グリッドのアセットサーバに格納されます。 | |
Grid Public Regions (グリッド公共地域) 箱庭(Walled-Garden、閉鎖グリッド)は広く普及し、役に立つさまざまな機能を提供しています。箱庭グリッドの管理者が運営に興味を示しそうな、ハイパーグリッドのハイブリッド・モード(Hybrid Mode)があります。ハイブリッド・モードでは、グリッド上のほとんどの OpenSim インスタンスは箱庭モードとして今まで通り動作するため、外部からの訪問は受け付けません - 物理的にアクセス不可能です。しかし、グリッド上の一部の OpenSim はハイパーグリッド・モードで動作することができるため、外部からの訪問を受け付けることができます。このやり方では、当該グリッドのローカルユーザと登録されていないユーザが出会うゲートウェイ(Gateway)が存在します。事前にアカウント登録することなく誰でもゲートウェイ地域を訪れることができることから、グリッドに新しいユーザを呼び込む良い戦略ともなります。 ハイブリッドモードはウェブで起きることとよく似ています。例えば、Facebook の公開ページは誰でもアクセスできますが、Facebook のユーザだけが内部のページにアクセスできます。 | |
Level Games(レベルゲーム) OpenSim の通常のバージョンでは、グリッドの全ての地域が必ず世界地図に掲載されます。ハイパーグリッドではその制約がなくなります。このため、プレイヤーの居場所によって、仮想空間の様子が異なるバーチャルゲームを簡単に制作できるようになります。 |
ハイパーグリッドの実装
ハイパーリンクとエージェント転送
OpenSim から他へリンクを作成すると、情報のリクエスト先であるリンク先の OpenSim にメッセージが送信されます。取得する情報には、OpenSim をホストしているネットワークの情報、ローカルグリッドでの最初の地域の座標がリージョン・ハンドル形式で含まれます。例えば、ノード x.com:9000 をリンクして、それを自分のローカルマップの 900, 900 に置こうとしているとします。向こうの OpenSim では1つ以上の地域が稼働していて、それらの座標は向こうのローカルマップでは 900, 900 ではなく、最初の地域が 1100, 1100 にあるとします。こちらからすると、向こうの座標がどうなっていようと関係なく、知る必要もありません -- これに気づけば、2D マップで提供された「空間」の中心はどうでもいいということがわかります。自分は 900, 900 に置きたいのですから。向こうのシミュレータの「実際の」位置というのは、自分の空間から他の OpenSim へテレポートするときに、LindenLab ビューアが使用するだけです。この異なる座標間のマッピングが OpenSim のハイパーリンクの要となります。ハイパーグリッドの実装において、簡単だけど重要なことです。このマッピングは TeleportFinish イベントで発生します。ビューアにローカル座標を送信する代わりに、ハイパーグリッド・テレポート・ラッパーはリモート座標を送信します。
エージェントがハイパーリンクを使ってテレポートすると、次のようなことが起こります。まず、 InformRegionOfChildAgent の前に、"expect_hg_user" メソッドで、ローカルの OpenSim が当該ユーザが外部からやってくる旨をリモートの OpenSim に通知します。このメッセージは、ユーザサーバ、インベントリサーバ、アセットサーバなど、このユーザが使用する全てのサーバに行き渡ります。リモートの OpenSim はローカルのユーザ・プロフィール・キャッシュにそのユーザのエントリを作成しますが、ユーザ・データベースには作成しません。外部ユーザの情報は永続させません。これが終わったら、通常のテレポートと全く同じようにテレポート処理されます。唯一の違いは、リージョン・ハンドルが、リモート地域のローカルグリッドでのハイパーリンク座標を指すか、ローカルグリッドでの実際の座標を指すかが切り替わるぐらいです。
要約すると、ハイパーグリッドは新しい概念を2つ導入しました。ハイパーリンクという概念と、「ローカルユーザ(Local User)」「外部ユーザ(Foreign User)」という概念です。
インベントリへのアクセス
外部からのインベントリへのアクセスは従来のシーン・インベントリ会話処理 (Scene-Inventory Interactions) にコードを追加して、ユーザのアセットサーバからインベントリ・アセットを出し入れするようにラップすることで実現しています。インベントリにアクセスすると、ハイパーグリッド・ラッパーはユーザが外部ユーザかを判定し、そうであれば、ラッパーはユーザのアセットサーバから必要なアセットを取得して、ローカルのアセットキャッシュやサーバに格納します。その後、ラッパーは従来のインベントリアクセス関数に制御を引き継ぎます。インベントリに何か追加されると、ハイパーグリッド・ラッパーはイベントを起こして通知し、アセットをユーザのアセットサーバに入れます。やりとりされたアイテムの識別情報はキャッシュで管理されるため、アイテムの転送が繰り返し発生することはありません。
ハイパーグリッドに対応した OpenSim は結果として複数のアセットサーバとやりとりすることとなります。このやりとりは、複数の GridAssetClient インスタンスを作成することでわかりやすく実装されています。
ハイパーグリッドのクラス
現在、ハイパーグリッドは OpenSim 名前空間の外で実装されています。このため、従来の挙動と新しい挙動の間に明確な区別がついています。HyperGrid という独自の名前空間で実装されています。この中には、OpenSim のソフトウェア構成にならって、4つのサブの名前空間があります。これから、具体的に説明します。
- OpenSim.Framework:
- ForeignUserProfileData が UserProfileData を拡張し、ユーザの「ホーム」の情報を追加しています。具体的には、ホームのアドレス、ポート、リモートのポートです。ユーザのホームはユーザのユーザサービスにおけるホームではありません。ユーザが自分でホームと決めた OpenSim になります。ホームへ戻る (Ctrl-Shift-H) を実現するために必要な処理です。
- HGNetworkServersInfo は NetworkServersInfo の考え方を受け継ぎますが、継承や包含の関係ではありません。今のところ、これはユーティリティクラスです。主要な2つの機能で、サーバのドメイン名から IP アドレスを解決し、整形したものを bool IsLocalUser(...) に回答しています。
- OpenSim.Region.Framework.Scenes.Hypergrid:
- HGSceneCommunicationService は SceneCommunicationService を拡張し、RequestTeleportToLocation をオーバーライドしています。基底メソッドに対して2つの非常に小さな、しかし重要な変更を行っています。(a) TeleportFinish イベントで、テレポート先地域がハイパーリンクの場合に、リージョン・ハンドルを切り替えています。(b) ハイパーリンクのテレポートに備え、終了時に必ずコネクションをクローズしています。
- HGScene は Scene を拡張し、TeleportClientHome(...) をオーバーライドしています。基底メソッドに対する唯一の変更は、ユーザサービスはまだ完全に外部ユーザのためにラップされていないため、暫定的にユーザサーバとの関係を切ったことです。ユーザサービスが適切にラップされれば、このクラスは不要となります。
- HGScene.Inventory は HGScene の内部クラスです。このような実装は OpenSim フレームワークでよく見かけます。この HGScene の内部クラスでは、一部のインベントリ・シーン会話処理メソッドをオーバーライドし、ユーザのアセットサーバからの出し入れができるようになっています。出し入れが完了したら、このメソッドは基底メソッドに制御を引き継ぎます。
- HGAssetMapper: このクラスはハイパーグリッド専用で、ユーザがいる外部の地域とユーザのアセットサーバの間でアセットの出し入れの管理をします。
- OpenSim.Region.Communications.HyperGrid は OpenSim.Region.Communications.* の寄せ集めです。ここにほとんどのハイパーグリッドの拡張機能が入っています。ハイパーグリッドのコミュニケーション処理で1つ余分な処理をしているのがその理由の1つです。その処理で、スタンドアロンをネットワーク接続可能にしています。
- HGCommunicationsStandalone は CommuniationsLocal を拡張しています。基底クラスと同じように、複数のネットワークを収容するハブとなっており、これはスタンドアロンモードで利用できます。主な違いは、これらのサービスは OpenSim にあるサービスの拡張であることです。
- HGCommunicationsGridMode は直接 CommunicationsManager を継承しています。これはグリッドモードで使用できるネットワークサービスのハブです。OpenSim の拡張となっています。
- HGGridServices (基底クラス), HGGridServicesStandalone, HGGridServicesGridMode (サブクラス) は OpenSim のインターフェースである IGridServices と IInterRegionCommunications を実装しています。サブクラスの2つはそれぞれ LocalBackEndServices と OGS1GridServices のラッパーとなっています。3つのクラスを通して、共通のパターンで実装されています。これから会話をする地域がハイパーリンクかを判定し、そうでなければ処理を LocalBackEndServices/OGS1GridServices に引き継ぎます。ハイパーリンクであれば、HGGridServices に処理を押し上げます。HGGridServices では、代わりに、ハイパーリンク地域の管理を行い、地域間連携プロトコルの2つの追加項目を指定します。
- region_uuid: 地域をリンクする際に必要
- expect_hg_user: expect_user インターフェースに似ていますが、転送するユーザに関するより詳細な情報が含まれます。 具体的には、ユーザの全てのサーバです(インベントリ、アセット、ユーザ、ホームなど)。
- HGInventoryService は LocalInventoryService を拡張し、ISecureInventoryService を実装ています。このクラスはまさに野良処理の寄せ集めのようなクラスで、スタンドアロンユーザ向けのローカルのサービスアクセスと、外に出て行ったときのためのリモートのインベントリアクセスが混ざっています。今のところは、OGS1InventoryService と OGS1SecureInventoryService を巻き込んで見苦しくなるのを避けるために、コピペを乱発しています。HGInventoryService はいつでも ISecureInventoryService です。全てのメソッドは同じパターンになっています。ユーザがローカルのスタンドアロンユーザであるかを判定し、もしそうなら、(LocalInventoryService の)基底メソッドに処理を引き継ぎます。そうでないなら、セキュアなリモートアクセスを実施します。
- HGUserServices は OSG1UserServices をラップしていますが、まだ動作しません。
- OpenSim.Region.CoreModules.HyperGrid は3つの地域モジュールの集合です。
- HGWorldMapModule は WorldMapModule を拡張しています。基底クラスのものをほとんど再利用しています。唯一の小さな変更は RequestMapBlocks で、オフラインのマップ閉塞信号をクライアントに送信しようとします。
- HGStandaloneInventoryService と HGStandaloneAssetService は名前通りの処理を行います。これらはスタンドアロンのインベントリとアセットにアクセスする地域モジュールで、スタンドアロンユーザが出かけるときに動作します。考え方としては、これらのモジュールと REST のインベントリ/アセットプラグインには多くの共通点があります。残念ながら、プラグインは使えませんでした。プラグインは従来のインベントリ/アセットサーバで使用されていたインターフェースと完全に異なっていたからです。ハイパーグリッドへのアクセスは一貫したインターフェースでなければなりません。
インストールと実行
Installing and Running Hypergrid を参照してください。
ハイパーグリッドとセキュリティ
Hypergrid Security を参照してください。
外部ユーザの BAN
Banning Foreign Users in Hypergrid を参照してください。
ハイパーグリッドの公開ノード
Public Hypergrid Nodes を参照してください。
ハイパーグリッドのリスト
Hypergrid Lists を参照してください。