2008年12月14日
LMから情報を抜き取る方法 関数編
LMから位置情報を抜き出し、シム内シム外どちらにも飛べるマルチテレポーターを作るという研究開発中のさかぷんです。
そのテレポーターは次の仕様を満たしたいと考えています。
・設定はLMを入れるだけ
・シム内はマップテレポではなく移動型テレポート
・4000mまでの移動が可能
・12箇所以上追加可能
マップテレポートは個人的にシム外とのコネクトに使うものだと思っています。
と、いうのも自分のビューアーのせいかシム内でマップテレポすると「距離が近すぎます」と出て飛べないのです。
さて、LMから「説明」の情報を抜き出すにはどうするんだろうという悩みでしたが意外とあっさり答えが出てしまいましたw
ただ、悩んでいたことをまず話してから解説します。
LMはオブジェクトではないので次のようなことはできません。
llGetInventoryKey(INVENTORY_LANDMARK,LMの名前)でLMのkeyを取得
↓
llGetObjectDetails(LMKey, [OBJECT_DESC])でLMの詳細を抜き出そうと試みた
こうやって抜き出せれば名前を変更していてもいなくても、LMが作成された「場所、シム名、番地」を取得することができたのです。
しかし、前述のようにこれではうまくいきません。
さて、ここで昔は悩んでしまったのですが、再研究してみたら関数を見つけることができました。
llRequestInventoryData(string LMname)
しかもこの関数、現在LMの情報しか抜き取ることができず、思いっきりそのための関数じゃないですかw
http://wiki.secondlife.com/wiki/LlRequestInventoryData/ja
ただし、この関数注意が必要なことに、同一シム内でないとトンでもない値が返ってきます。
なぜならその位置情報はSL全世界の相対位置なのです。
vector dest =<63223.21100, -42212.34200, 23.00000>;
こんな値が還ってきて、どうやってテレポーターに使うんだと、最初は思いました。
でもこれ、llMapDestinationの値にそのまま使ってやればいいのですね。
llMapDestinationは指定したシムの中にしか飛べないと思ってましたが、グローバル座標という位置情報との相対位置で指定できるようです。
さて、以上はLMが同一シムじゃなかった時にマップテレポにすることを目的としたものです。
同一シムであること検出するには、ということで一度悩みました。
そしてある関数を発見したのですが、どうもうまくいきません。
integer llEdgeOfWorld(vector pos, vector dir)
これ、今だに使いどころがわかりませんw
始点(pos)からみて目的地(dir)がシムを出るかどうかを検出するらしいですが、同一シムの判定にはどうにもうまくいきませんでした^^;
しかし、シム内かどうかを判別する方法は次のようなことで簡単にできました。
とっても単純ですw
if(dest.x>0 && dest.x <255 && dest.y > 0 && dest.y <255)
という条件を使えばいいのですね。
ということでllEdgeOfWorldの使いどころは未だにわかりませんwww
・今回のいいたかったこと。(記事が長くなり、文章もうまくないので一応記述w)
llRequestInventoryData
…LMから情報を抜き取るための関数。値は現在位置からの相対グローバル位置で返ってくる。
llMapDestination
…現在位置からの相対グローバル位置を指定できる
…ex. llMapDestination(llGetRegionName(), dest(llRequestInventoryDataで返ってきたvector), ZERO_VECTOR);
llEdgeOfWorld
…あることさえ知らない人も多いと思うような関数w
…使用意図→今回の作成には必要なかったのでわかりませんw
…座らせる位置がシムの外であったりすると、異常な挙動をしたときがあったのでそれを判定したりするのでしょうか…。
そのテレポーターは次の仕様を満たしたいと考えています。
・設定はLMを入れるだけ
・シム内はマップテレポではなく移動型テレポート
・4000mまでの移動が可能
・12箇所以上追加可能
マップテレポートは個人的にシム外とのコネクトに使うものだと思っています。
と、いうのも自分のビューアーのせいかシム内でマップテレポすると「距離が近すぎます」と出て飛べないのです。
さて、LMから「説明」の情報を抜き出すにはどうするんだろうという悩みでしたが意外とあっさり答えが出てしまいましたw
ただ、悩んでいたことをまず話してから解説します。
LMはオブジェクトではないので次のようなことはできません。
llGetInventoryKey(INVENTORY_LANDMARK,LMの名前)でLMのkeyを取得
↓
llGetObjectDetails(LMKey, [OBJECT_DESC])でLMの詳細を抜き出そうと試みた
こうやって抜き出せれば名前を変更していてもいなくても、LMが作成された「場所、シム名、番地」を取得することができたのです。
しかし、前述のようにこれではうまくいきません。
さて、ここで昔は悩んでしまったのですが、再研究してみたら関数を見つけることができました。
llRequestInventoryData(string LMname)
しかもこの関数、現在LMの情報しか抜き取ることができず、思いっきりそのための関数じゃないですかw
http://wiki.secondlife.com/wiki/LlRequestInventoryData/ja
ただし、この関数注意が必要なことに、同一シム内でないとトンでもない値が返ってきます。
なぜならその位置情報はSL全世界の相対位置なのです。
vector dest =<63223.21100, -42212.34200, 23.00000>;
こんな値が還ってきて、どうやってテレポーターに使うんだと、最初は思いました。
でもこれ、llMapDestinationの値にそのまま使ってやればいいのですね。
llMapDestinationは指定したシムの中にしか飛べないと思ってましたが、グローバル座標という位置情報との相対位置で指定できるようです。
さて、以上はLMが同一シムじゃなかった時にマップテレポにすることを目的としたものです。
同一シムであること検出するには、ということで一度悩みました。
そしてある関数を発見したのですが、どうもうまくいきません。
integer llEdgeOfWorld(vector pos, vector dir)
これ、今だに使いどころがわかりませんw
始点(pos)からみて目的地(dir)がシムを出るかどうかを検出するらしいですが、同一シムの判定にはどうにもうまくいきませんでした^^;
しかし、シム内かどうかを判別する方法は次のようなことで簡単にできました。
とっても単純ですw
if(dest.x>0 && dest.x <255 && dest.y > 0 && dest.y <255)
という条件を使えばいいのですね。
ということでllEdgeOfWorldの使いどころは未だにわかりませんwww
・今回のいいたかったこと。(記事が長くなり、文章もうまくないので一応記述w)
llRequestInventoryData
…LMから情報を抜き取るための関数。値は現在位置からの相対グローバル位置で返ってくる。
llMapDestination
…現在位置からの相対グローバル位置を指定できる
…ex. llMapDestination(llGetRegionName(), dest(llRequestInventoryDataで返ってきたvector), ZERO_VECTOR);
llEdgeOfWorld
…あることさえ知らない人も多いと思うような関数w
…使用意図→今回の作成には必要なかったのでわかりませんw
…座らせる位置がシムの外であったりすると、異常な挙動をしたときがあったのでそれを判定したりするのでしょうか…。
Posted by さかぷん at 00:45│Comments(0)
│LSL, スクリプト