Yes Second Life

セカンドライフ向けWebサービスを作ってました。このブログではVR・メタバースのことを書いていきます

High Fidelityのスクリプト

この記事は、セカンドライフ技術系アドベントカレンダー2016向けの記事です。

www.adventar.org

去年に引き続き、誰にも望まれていないHighFidelityの記事になっております。HighFidelityはオープンソースだし、自鯖に入れて遊べるし、自由度が高いから個人的に広まってほしいです。

High Fidelity

さて今回のお題はスクリプト。まずはざっくりとした説明から。

言語はJavascriptです。なのでセカンドライフみたいなState構文とかはありません。作成したスクリプトは、勝手にサーバ上に保存されたりしないので、ローカルマシンのディスクに保存したり、Webサーバ上に置いたりして、インワールドからファイルパスやURLを指定して読み込みます。

そしてHighFidelityには3タイプのスクリプトがあります。

  • Interface Scripts
  • Assignment Client Scripts
  • Entity Scripts

それぞれ役割が違うので詳しく説明していきます。

Interface Scripts

これを説明する前にまずはHighFidelityのアーキテクチャについて、ちょっと知っておく必要があります。簡単に言うとセカンドライフでいうところのシムにあたるのがドメインサーバ、ビューワにあたるのがインターフェースです。Interface Scriptsは、名前の通りインターフェース上で動作するスクリプトです。メニューから「Edit → Running Scriipts」と進むと、インターフェースで動作しているスクリプトを確認したり、新しくスクリプトをロードしたりできます。
f:id:sabro:20161129010307p:plain:h600
たとえば、こんなスクリプトを書いてローカルのディスクに保存して、FROM DISKボタンからロードすると

Window.alert("ウィンドウ テスト!");

こんなダイアログを出せます。
f:id:sabro:20161129012809p:plain:w480
Interface Scriptの主な役割は、メニュー等のUI構築や、インターフェースが起動している間だけ使用する一時的なタスクの実行などになります。ちなみに、Interface Scriptはインターフェース上で動作しますが、そのスクリプトが与えた影響は他のユーザにも反映されます。例えば、スクリプトからオブジェクトの色を変えると他のユーザのディスプレイ上でも同じく色が変わります。

Assignment Client Scripts

Interface Scriptでも大体のことができるんですが、インターフェース上で動くという性質上、ログアウトすると処理が中断してしまうという欠点があります。例えばオブジェクトをアニメーションさせるスクリプトを動かしてからログアウトすると、アニメーションが止まってしまいます。

こういうときに使えるのがAssignment Client Scriptです。名前にClientと入ってますが、これはサーバ側で動作するスクリプトです。なんでこんな名前になってるかを理解するには、HighFidelityのアーキテクチャをもう少し知る必要があります。
f:id:sabro:20161129220409p:plain:w480
↑公式サイトより引用

Domain Serverの下に、AudioMixer、AvatarMixer、EntityServerが動的に割り当てられている感じになってるのが分かります。スクリプトはこれらの割り当てられたサーバで動作します。これらのサーバはDomain Serverから見たら割り当てられたクライアントなので、スクリプトもAssignment Client Scriptと呼ばれるわけです。ちなみに、これらのDomain Serverに紐ついたサーバ群は、Domain Serverと別のマシンで動かすこともできますが、基本的には同一のマシン上で動かすことが多いみたいです。なので、スクリプトはDomain Server上で動いてるくらいの認識で大体合ってると思います。

さて、Interface Scriptsはインターフェースのメニューからロードしましたが、Assignment Client Scriptは、Domain Serverの設定メニューから指定します。
f:id:sabro:20161129222549p:plain:w480
Scriptメニューで、URL、インスタンス数を入力します。Poolはブランクでいいみたいです。

Entity Scripts

Entity Scriptは名前から大体わかると思いますが、インワールドで生成されたオブジェクトに紐付けられているスクリプトです。主にタッチや衝突検知などのイベントをトリガーにして何かしたいときに使用します。

Entity Scriptはオブジェクト編集メニューのScriptURLでオブジェクトと紐つけることができます。Entity Scriptは他のインターフェースからもロードできる必要があるので、ローカルディスクのパスは指定できません。httpのURLを指定しましょう。
f:id:sabro:20161129233242p:plain:h600
Entity Scriptsは、ちょっと書き方が特殊で、匿名関数でイベントを定義するみたいな書き方になります。こんな感じのスクリプトを書いてやると

(function() {
	this.clickDownOnEntity = function(entityID, mouseEvent) {
		Window.alert("クリック テスト!");
	};
})

オブジェクトをタッチでダイアログがでます。
f:id:sabro:20161129235422p:plain:w480

さて、一通り説明できましたけど、少しでも興味を持ってもらえたでしょうか?基本がJavascriptなのでLSLよりとっつきやすく、多くの人がすんなり書き始められるんじゃないかと思います。関数一覧は下のリンクから見れるので、気になった人は覗いてみてくださいね( ̄∇  ̄ )
Category:JavaScript API - High Fidelity Documentation

セカンドライフのおすすめスポット

この記事は、セカンドライフ非技術系アドベントカレンダー2016向けの記事です。

セカンドライフ非技術系 Advent Calendar 2016 - Adventar

ぼくは、ものすごい出不精でホームのTrinityシムから1年近く出てないのですが、せっかくなのでこれを期にどこか新しいところへ行ってみることにしました。

どこから行ってみたものかと考えてた時、ふと最近プレミアムアカウント向けのサンドボックスが追加されたみたいなニュースがあったと思い出して、行ってみることにしました。

f:id:sabro:20161209224003j:plain

Second Life Maps | Main Channel Sandbox A

プレミアム向けのサンドボックスは確かにすいてました。まあ、今はどこへ行ってもわりとすいてるんですけどね・・・。

プレミアムサンドボックスの中にはRC向けの機能を試せるシムもありました(一般ユーザ向けのRCサンドボックスもあります)

f:id:sabro:20161209224257p:plain

Second Life Maps | Magnum Sandbox A

Second Life Maps | BlueSteel Sandbox A

Second Life Maps | LeTigre Sandbox A

Magnumは草原ですが、BluSteelは青っぽい金属、LeTigreは虎皮模様と、地図で見た時若干わかりやすくなっています。

RCサンドボックスは新しいもの好きには便利ですね。どこもすいていたのでプレミアム会員の方は何か作りたいときの選択肢として覚えておくといいかもしれません。

以上、久々のおでかけなのに結局サンドボックスへ行ってしまう友達の少ないさぶろーのおすすめでした( ̄□  ̄ ||

仮想世界でぼくがつくりたいもの

www.adventar.org

この記事は、セカンドライフ非技術系のアドベントカレンダー向けの記事です。

自分は、これまでセカンドライフとWebを連携させるというコンセプトで、3つほどサービスを作ってきました。

でも、3つのサービス全てにおいて達成できてないことがあります。それは、「日常的につかってもらえるもの」にすることです。一応、今でも1年に1回くらいのペースでなんらかの投稿があったりしますが、「すりんく」みたいに日常的に使ってもらえるものになっていません。

これは、ユーザのニーズからサービスを作っていないからだと自分は考えています。

いまユーザが不便におもっていることがあって、それを解決するという方向ではなくて、ユーザが思ってもいなくて、リリースされた時に驚いてしまうようなものが作りたいという思いが自分にはあります。

たぶん優しい人はユーザが困っている時に助けてあげようみたいな発想で、なにか作ると思うんですが、自分の場合は、クリエイターとして認められたいみたいな気持ちが優先してしまって、それが驚き重視や変わった技術偏重みたいなサービスにつながっています。

でも自分はあまりこの性格を直すつもりもないんですよね。そもそも性格というのは、なにか自分に重大なことがあったときに自然と変わるものであって直そうと思って直るものでもないと思います。

なので、リリースした時に驚いてもらえて、なおかつ、たくさんの人に使っていただける。そんなサービスを作れるよう頑張っていきたいとおもいます( ̄∇  ̄ )

High Fidelityの基本的な操作

この記事は「セカンドライフ技術系 Advent Calendar 2015」向けの記事です。

www.adventar.org

前回の記事、High Fidelityを、ローカルマシンにインストールして接続する - Yes Second Lifeで、無事インストールが完了したので、今日はHigh Fidelityの基本的な使い方を見ていきます。

まずは画面右側のメニュー構成

f:id:sabro:20151203024448p:plain

見慣れたものと、そうでないものが並んでいます。1個1個見ていきましょう。

ディレクトリ

f:id:sabro:20151203024729p:plain
ディレクトリは、他のドメインへ移動するときに使います。ドメインセカンドライフでいうところのSimみたいなものだと思っておけば大体だいじょうぶです。

マーケット

f:id:sabro:20151203024956p:plain
こちらは、セカンドライフでいうところのマーケットプレイスだと思っておけばオッケー。ただ、今はテスト段階ということもあり、どの商品も無料でゲットできます。また商品のオブジェクト自体も、クリエイター、所有者の情報や権限みたいなものは実装されていません。

メニュー開閉ボタン

下のボタン群の表示、非表示を切り替えます

アップロード

f:id:sabro:20151203025557p:plain
自作のメッシュをアップロードできます。といっても、High Fidelityにアップロードするのではなく、別途適当なクラウドストレージ等にモデルを置いて、そのURLを入力します。アップロードできるのは、FBXかOBJ形式です。

Box作成

f:id:sabro:20151203025952p:plain
単純なBoxを作成します。オブジェクトの周りにでる矢印をドラッグすると、移動、回転。オブジェクトの端点をドラッグすると拡大縮小できます。ちなみに移動の矢印は上下しかありません。オブジェクトを左右に動かしたい場合は、オブジェクトをドラッグしてマウスを左右に動かします。奥へやったり手前に持ってきたりしたい場合は、マウスを奥や手前に動かします。若干操作に慣れが必要ですが、セカンドライフで3軸の矢印をいったりきたりして位置を調整していた煩わしさはないです。

Sphere作成

f:id:sabro:20151203030552p:plain
単純な球の作成。操作はBoxとだいたい同じ。

ライト作成

f:id:sabro:20151203030702p:plain
セカンドライフでは、適当に作ったオブジェクトを発光させて明かりにしていましたが、High Fidelityでは単独でLightという種類のオブジェクトが用意されています。

テキスト表示作成

f:id:sabro:20151203030914p:plain
セカンドライフが苦手だった文字の表示です。看板みたいなのが簡単に作れます。

Web表示作成

f:id:sabro:20151203031045p:plain
セカンドライフではオブジェクトの面にWebを表示していましたが、こっちではWebという種類のオブジェクトがあります。

Zone作成

f:id:sabro:20151203031155p:plain
High Fidelityでは、Zoneという特徴を持った空間を作成できます。Zoneでは光の当たり方や、遠景画像(空とか地平線とか辿りつけない部分を表現した画像)などを設定できます。Zoneに入るといきなり景色が変わったり、太陽の位置が違ったりと不思議な感覚ですが、色々工夫次第で使いどころがありそうです。

Voxel作成

f:id:sabro:20151203032131p:plain
Voxelを作成してみたら、こんな感じのオブジェクトができました。Voxelについては、公式のドキュメントが整備されてなかったのでよくわかりませんが、小さい負荷で大きなオブジェクトを作れるようになっているぽいです。

セカンドライフと似ている部分もあれば、違っている部分もあって面白いです( ̄∇  ̄ )

High Fidelityを、ローカルマシンにインストールして接続する

1年ぶりですね。

毎年アドベントカレンダーの季節になると、更新されるこのブログ。
お察しの通り、この記事は「セカンドライフ技術系 Advent Calendar 2015」向けの記事です。

www.adventar.org

しかも、セカンドライフ技術系のアドベントカレンダーなのに、今回はHigh Fidelityというまだテスト段階のメタバースについて書いていきます。High Fidelityの創業者が、元リンデンCEOのフィリップさんということで一応セカンドライフとの関連も深いので、その辺は大目に見てくださいね。

f:id:sabro:20151124023137p:plain

High Fidelity

トップサイトに書いてあるとおり、High Fidelityは、サーバ、クライアントともにオープンソースで開発されているメタバースです。リンデンラボの次期メタバース「SANSAR」は、少なくとも最初はクローズに開発される予定であり、はじめからオープンであることはHigh Fidelityの際立った特徴です。

github.com
ソースは、GitHubで管理されてます。

f:id:sabro:20151124024429p:plain

Download - High Fidelity

High Fidelityのダウンロードページに行くと、Stack ManagerとInterfaceの2つがあることが分かります。サーバ側がStack Manager、クライアントのビューワがInterfaceです。ダウンロードしたインストーラを実行し、普通に進めていけば簡単にインストールできます。

f:id:sabro:20151124025118p:plain

インストールが終わって、Stack Managerを実行してみたところ、何回かエラーダイアログがでましたが、無視して進めていきました。

f:id:sabro:20151124025153p:plain

そしたらちゃんと、サーバが起動したので良しとします。
右上に「hifi://localhost」みたいなURLがあって、こちらをクリックするとInterfaceが起動します。

f:id:sabro:20151129222306p:plain

なぜかアバターはロボでした。とにかくこれで、ローカルマシンでサーバを立ち上げ接続できました。もっと大変かと思っていたので、割りと拍子抜けです。

f:id:sabro:20151129224633p:plain

適当にオブジェクトを作ってみましたが、セカンドライフとそんなには変わらない操作でつくれました。この辺はまた機会があれば、書いてみようとおもいます。

Pathfindingで、複数箇所を巡回させる

これは、セカンドライフ技術系アドベントカレンダーの記事です。

セカンドライフ技術系 Advent Calendar 2014 - Adventar
今回は、Pathfindingで複数箇所を巡回させてみます。

Secondlife Pathfinding機能 - llPatrolPoints - YouTube
複数箇所を巡回させたいときは、llPatrolPoints関数を使います。

次の例では、"target"という名前のオブジェクトを周りからさがして、複数見つかった場合に、そのポイントを巡回させます。

default {
    
    state_entry()
    {
        // オブジェクトをPathfindingのキャラクターに設定
        llCreateCharacter([]);
    }

    touch_start(integer num)
    {
        // タッチされたら、targetという名前のオブジェクトを探す
        llSensor("target", "", PASSIVE, 25.0, PI);
    }
    
    sensor(integer num)
    {
        // オブジェクトが1つの場合、パトロールできないので処理続行しない
        if(num<=1) return;
        
        integer i;
        list l;
        
        // targetというオブジェクト郡の位置をリストに格納
        for(i=0; i<num; i++)
        {
            l += llDetectedPos(i);
        }
        
        // オブジェクト郡を巡視する
        llPatrolPoints(l, []);
    }

    no_sensor()
    {
        // targetというオブジェクトが見つからなかったら何もしない
        llOwnerSay("No target in range.");
    }
}

巡回ポイントを1つしか指定しないとエラーになるので気をつけてください。llPatrolPoints関数には、リストで1つ引数を指定できます。

オプション 説明 デフォルト値
PATROL_PAUSE_AT_WAYPOINTS 巡回ポイントに到達した時、一瞬止まるようにする FALSE

前回の追跡に続いて、巡回を紹介しましたが、Pathfindingにはまだまだ色んな動作があります。気になったら調べてみると面白いですよ( ̄∇  ̄ )

PathFindingで、自分についてくるオブジェクトをつくる

これは、セカンドライフ技術系アドベントカレンダー向けの記事です。

自分についてくるオブジェクトは、今までも力技でつくれたんですが、最近追加されたPathFindingを使うと、とても簡単に実装できます。


Secondlife Pathfinding機能 - llPursue - YouTube

PathFindingは、直訳すると経路探索ですが、色んな動きができるNPC(ノンプレイヤーキャラクター)を作れる機能になっています。自分についてくる他にも、何かから逃げる動きをさせたり、特定の場所を徘徊させたりもできます。

何かについてくるようにしたい場合は、次のようにすればできます。

default
{
    state_entry()
    {
        // オブジェクトをPathfindingのキャラクターに設定
        // 実際には引数には色んなパラメータが渡せます
        llCreateCharacter([]);
    }
 
    touch_start(integer total_number)
    {
        // タッチした人の2m後ろを追跡する
        llPursue(llDetectedKey(0), [PURSUIT_OFFSET, <-2.0, 0.0, 0.0>]);
    }
}

たったこれだけ、llCreateCharacter関数で、Pathfindingのキャラクターとして設定し、llPursue関数で追跡させるように命令すればOKです。llPursue関数にもリストでいくつかの引数が渡せます。

オプション 説明 デフォルト値
PURSUIT_OFFSET 追跡対象からの距離 ZERO_VECTOR
REQUIRE_LINE_OF_SIGHT 動作するのに物理的に到達可能である必要があるか FALSE
PURSUIT_FUZZ_FACTOR PURSUIT_OFFSETからランダムで位置をずらす、0.0~1.0で指定 0.0
PURSUIT_INTERCEPT ターゲットの未来の位置を予測して動くか FALSE
PURSUIT_GOAL_TOLERANCE 実際のゴールからどれくらい離れてるのを許容するか 追跡者の大きさに比例

とても簡単に高度な動きが実装できるので、試してみると面白いとおもいますよ( ̄∇  ̄ )