個々がユニークな空間となるバーチャルワールドとは違って空間は1つで各々が異なる位置に存在しているという仕組みの Second Life では、座標という数字での位置表記が不可欠です。Second Life をプレイしていると知らずのうちに慣れてしまいますが、しばしば混乱することもあるの座標系の種類についてスクリプトでの参照も合わせてみてみます。
Second Life での位置表示には Z (高さ) がある
画面に常時表示される現在地の座標を他のゲームなどと見比べてみる。Second Life では位置表示に X, Y と Z (高さ) の3軸で表記
MMORPG などゲームによっては現在地の地名表示のみだったり、地名の表示すらもなかったり
座標表示があったとしても XY座標であって 高さを示す要素はありません
Second Life では Z が上になる
おなじ XYZ座標の3軸表記でも軸の方向が違うものもある。MMORPG などのゲーム世界で XY座標に慣れていると、そこに高さの要素の Z軸が加わっても理解しやすい。けれども平面上での表現が元々 XYの2軸であるもの統計集計などのグラフ表示や設計図などの平面のものでは 「奥行き」としての Z軸を追加 という扱いになるので、縦横で XY軸であって奥行きに Z軸という感じ。X軸もこの画像のように横方向であるとは限りません。どれが正しいというものではなく、それぞれの環境でそのように扱われているという事実なのでそのまま受け入れるしかないです。Second Life では大別して XY座標と XYZ座標の2種
XY座標のもの
・グローバル (Global) 座標→ (注) システムとしてはXYZの3軸だがZは常に 0 (ゼロ)として扱われる
XYZ座標のもの
・リージョン (Region) 座標・ローカル (Local) 座標
・エージェント (Agent) 座標
グローバル (Global) 座標
グローバル座標は各SIM (Region)の世界地図上での位置を XY座標で示したもの。
最古のSIMの1つである "Da Boom" の位置 = (1000, 1000) を中心として 広がっていく形態を取っている。
リージョン (Region) 座標
リージョン (Region) 座標は各SIM (Region) 毎で原点 X, Y, Z = 0, 0, 0 を起点としての位置を示したもの。Second Life 外からでも WEBの世界地図やSLURLなどでも使われる。各軸とも制限値を超えたり負数となる場合がある。
【MAP表示の例】
https://maps.secondlife.com/secondlife/BelliDemo/92/167/22
https://maps.secondlife.com/secondlife/(region名)/X位置/Y位置/Z位置
各SIMの原点位置 (0, 0, 0)
ローカル (Local) 座標
ローカル (Local) 座標には2種類があるが何方もローカル座標と呼ばれる。
装着物でのローカル座標
上記画像のような装着物(アタッチメント)においては、装着箇所を原点として、そこからの相対位置として座標で示したもの。リンクした子プリムでのローカル座標
リンクしたオブジェクトにて、小プリムの位置をルートプリムの位置を原点として、そこからの相対位置として座標で示したもの。エージェント (Agent) 座標
エージェント (Agent) 座標は実態として実際には存在しません。アバターの位置を原点とすることへのたんなる表意です。多くの場合、アバター位置からのオフセットであるとして定義されエージェント座標という項目名は使われません。
エージェント (Agent) 座標は、その名が示すようにアバターの位置を原点とした座標系です。ようするにアバターに付随して一緒に動くってことですが、それなら装着物と同じくローカル座標じゃないの? と思ってしまいますが、あくまでもアバターの現在位置だけに追従する座標です。具体的には 「カメラの位置」 などで利用します。乗り物などのアイテムを作る際にカメラ位置を最適に変更したりすることがあります。普段では、どこを見ているか視線のフォーカス位置を見たりすることはありますが、カメラ位置はなかなかカメラそのものが、この Blender 画像のようにSecondLife内では見ることがないのでマイナーな座標系です。
スクリプトで座標を知る
SIM名からグローバル座標を得る(LSL)
llRequestSimulatorData(【座標を知りたいSIM名】, DATA_SIM_POS);→ dataserverイベントで座標が返却される
SIM名からグローバル座標を得る(公式WEB-API)
https://cap.secondlife.com/cap/0/d661249b-2b5a-4436-966a-3d3b8d7a574f?var=【変数名】&sim_name=【座標を知りたいSIM名】→ 指定した【変数名】に配列として記述された組み込み用スクリプトで座標が返却される
SIM名からグローバル座標を得る(BonnieBots API)
https://www.bonniebots.com/static-api/regions/【座標を知りたいSIM名】.json→ JSON形式で返却されるデータの中にグローバル座標もある
SIM名からグローバル座標を得る(Gridsurvey API)
https://api.gridsurvey.com/simquery.php?region=【座標を知りたいSIM名】→ Text文字列で返却されるデータの中にグローバル座標もある
https://api.gridsurvey.com/simquery.php?region=【座標を知りたいSIM名】&item=x
→ 座標の X だけ文字列で返却される
https://api.gridsurvey.com/simquery.php?region=【座標を知りたいSIM名】&item=y
→ 座標の Y だけ文字列で返却される
グローバル座標からSIM名を得る(LSL)
~該当なし~グローバル座標からSIM名を得る(公式WEB-API)
https://cap.secondlife.com/cap/0/b713fe80-283b-4585-af4d-a3b7d9a32492?var=【変数名】&grid_x=【X座標】&grid_y=【Y座標】→ 指定した【変数名】に文字列として記述された組み込み用スクリプトでSIM名が返却される
グローバル座標からSIM名を得る(BonnieBots API)
https://www.bonniebots.com/static-api/regions/【X座標】/【Y座標】/index.json→ JSON形式で返却されるデータの中にSIM名もある
グローバル座標からSIM名を得る(Gridsurvey API)
https://api.gridsurvey.com/simquery.php?xy=【X座標】,【Y座標】&item=name→ Text文字列でSIM名が返却される
リージョン座標を得る(LSL)
llGetPos()llGetRootPosition();
llGetPrimitiveParams([ PRIM_POSITION ]);
llGetLinkPrimitiveParams( Link番号, [ PRIM_POSITION ]);
llGetObjectDetails( ObjectのUUID, [ OBJECT_POS ] );
llDetectedPos(配列の添字);
リージョン座標に該当する区画名を得る(LSL)
llGetParcelDetails( <【X座標】,【Y座標】,0>, [ PARCEL_DETAILS_NAME ] );ローカル座標を得る(LSL)
llGetLocalPos();llGetPrimitiveParams([ PRIM_POS_LOCAL ]);
llGetLinkPrimitiveParams(Link番号, [ PRIM_POS_LOCAL ]);
0 件のコメント:
コメントを投稿