ソラマメブログ

2007年09月21日

リファレンス【M-P】

llM・・・からllP・・・の関数リファレンスです。
M
llMapDestination
llMD5String
llMessageLinked
llMinEventDelay
llModifyLand
llModPow
llMoveToTarget

O
llOffsetTexture
llOpenRemoteDataChannel
llOverMyLand
llOwnerSay

P
llParcelMediaCommandList
llParcelMediaQuery
llParseString2List
llParseStringKeepNulls
llParticleSystem
llPassCollisions
llPassTouches
llPlaySound
llPlaySoundSlave
llPointAt
llPow
llPreloadSound
llPushObject




llMapDestination

llMapDestination(string simname, vector position, vector lookat)

SIM名simnameの位置positionへのテレポート準備が完了したマップを表示する。
あくまでもマップを表示するだけなので、実際にテレポートするかどうかはアバター次第である。

なお、引数lookatは現在使われておりません。

この関数には「誰に」対してマップを表示するかを指定する引数が無い。
あらまぁ、困ったわ。

実はこの関数、タッチイベント内、もしくはアタッチメントでしか使えないことになっている。
つまりマップ表示はタッチした人、もしくはアタッチしているオーナーに対して行われる。

具体的にどうやって使うかは、看板を作ろう(初級スクリプト第九回)を参照。




llMD5String

string llMD5String(string src, integer nonce)

文字列srcをMD5(Message Digest Algorithm 5)でハッシュ値に変換する。
MD5とはハッシュ値を作成するためのある処理方式の名前。
しばしば、ダウンロードデータ等が改ざんされて無いかどうかを判定するために使われる。
詳しいことをここで説明するのは少々筋違いなので興味のある方は調べてみて下さい。

あくまでも関数の機能として述べるなら、llMD5String関数は文字列srcを"2cfa746974210d68e96ee620bf842fb6"のようなデータ(ハッシュ値)に変換する。
変換後のデータ(ハッシュ値)から元の文字列を求めることは出来ない。




llMessageLinked

llMessageLinked(integer linknum, integer num, string str, key id)

リンクオブジェクトにおいてprim間メッセージを送信する。
引数linknumは送信先primのリンクナンバーである。
num、str、idの引数には任意のデータを指定することができる。

リンクメッセージが受信されるとlink_messageイベントが起こる。
link_messageイベントの引数には、llMessageLinked関数によって送信されたnum、str、idの各引数が渡される。
つまり、
  1, "test", NULL_KEY
という3つのデータを送信すれば、
  1, "test", NULL_KEY
という3つの値がlink_messageイベントの引数に渡って来る。

この関数の利用方法については、prim間通信(スクリプト初級第十五回)及びHUDを作ろう(スクリプト初級第十六回)あたりの記事を参照のこと。
有用な利用方法としてモジュール化も挙げられる。

送信先を指定する引数linknumにはリンクナンバーを直接指定する他、以下の定数が使える。
定数意味
LINK_ROOT 1 ルートプリムに送信
LINK_SET -1 全プリムに送信
LINK_ALL_OTHERS -2 自分以外の全プリムに送信
LINK_ALL_CHILDREN -3 全子プリムに送信
LINK_THIS -4 自分自身に送信





llMinEventDelay

llMinEventDelay(float delay)

イベント発生の間隔をdelay秒にする。
と言ってもイベント発生の間隔を早くするのには限界である(0.05秒間隔が最速)。
この関数は主にイベント発生の間隔を遅くするために使われる。

例えば、touchイベントはアバターがオブジェクトにタッチしている間(マウスキーをホールドしている間)、繰り返し発生するイベントである。
デフォルトでは、touchイベントの繰り返し間隔は約0.1秒。
llMinEventDelay関数を使って、イベント発生間隔を1秒にしたとすると、オブジェクトにタッチしている間、1秒ごとにイベントが発生するようになる。
これを応用すると何か使えそうな・・・気になる。

lslWikiを読む限り、イベントによって最低間隔が違ったりするようなのだが、実際に試していないので割愛しておく。




llModifyLand

llModifyLand(integer action, integer size)

土地を編集する。
編集内容は引数actionで指定する。
引数sizeは編集範囲(小・中・大)の指定である。

編集内容として引数actin指定できるのは以下の通り。
定数編集内容
定数編集内容
LAND_LEVEL 0平らにする
LAND_RAISE 1隆起させる
LAND_LOWER 2陥没させる
LAND_SMOOTH 3なだらかにする
LAND_NOISE 4でこぼこにする
LAND_REVERT 5元に戻す


引数sizeには以下の値を指定する。
定数編集内容
LAND_SMALL_BRUSH 1小(2m x 2m)
LAND_MEDIUM_BRUSH 2中(4m x 4m)
LAND_LARGE_BRUSH 3大(8m x 8m)





llModPow

integer llModPow(integer a, integer b, integer c)

aとbの排他的論理和をcで除算した余りを返す。
RSA暗号を扱う際に利用するらしい。




llMoveToTarget

llMoveToTarget(vector target, float tau)

物理オブジェクトを位置targetまでtau秒間で移動させる。
tauを調整することで移動速度をコントロールすることが可能であるが、速度は均一にはならない。

llStopMoveToTarget関数によって移動をキャンセルすることができる。
また、目標値点targetに到達したかどうかはat_targetイベント及びnot_at_targetイベントで判別可能。

この関数は物理オブジェクトのエネルギーを消費するため、必ずしも常に動かし続けられるわけではない。
エネルギーについてはllGetEnergy関数を参照。




llOffsetTexture

llOffsetTexture(float horizontal, float vertical, integer side)

テクスチャーのオフセットを設定する。
horizontalは横方向、verticalは縦方向のオフセット値で、どちらも-1.0~1.0の範囲で設定する。
引数sideには面を指定する。面として設定可能な値はllGetColorを参照。

この関数の実行には0,2秒を要する。




llOpenRemoteDataChannel

llOpenRemoteDataChannel()

XML-RPC用のチャンネルを開く。
この関数を使うとXML-RPCを受信したときにremote_dataイベントが発生するようになる。




llOverMyLand

integer llOverMyLand(key id)

スクリプトオーナーの土地上にいるかどうかを調べる。
戻り値がTRUEならばオーナーの土地、FALSEならば違う土地である。

スクリプトがグループ所有であれば、グループ所有の土地上でTRUEを返す。




llOwnerSay

llOwnerSay(string message)

スクリプトオーナーのみに聞こえるメッセージを送信する。

主にデバッグ用である。
LSLのコーディング中は、変数の中身やスクリプトの状態などをチェックしたい場合が多いが、llSayやllWhisperを使ってデバッグメッセージを送信すると、周囲にも聞こえてしまう。
かと言ってllInstantMessageを使うとメッセージの送信に2秒かかる。
llOwnerSayであれば、オーナー以外には聞こえないし、メッセージが即座に送られる。

デバッグ用にこの関数を各所に埋め込んだ場合、完成後はコメントアウトするか削除することをお忘れなく。




llParcelMediaCommandList

llParcelMediaCommandList(list command_list)

土地に設定可能なムービーメディアのコントロールを行う。
要するにQuickTime制御用の関数である。
この関数の実行には2秒かかる。

lslWikiに従い、土地にムービーを設置する手順から説明する。

1.土地を所有すること。自分に権限のある土地でなければムービーの設置はできない。
2.ムービー用テクスチャ(メディアテクスチャ)の設定。何でもいいが、ムービー再生画面となるテクスチャを用意する。このテクスチャを貼ったオブジェクト(の面)は全てムービー再生用画面になる。
3.再生するムービーのURLを設定。ムービーはインターネット上で閲覧可能な状態でなければSL内で再生できない。自分で作ったムービーであればレンタルHPスペース等にアップする必要がある。
4.メディアテクスチャ及びメディアURLが設定されていれば、土地を訪れた人がSLクライアントのムービー再生ボタンを押すことでムービーを見ることができる(要QuickTime)。

llParcelMediaCommandList関数は、上記手順のうち、2のメディアテクスチャの設定及び3のメディアURLの設定を可能にする他、ムービーメディアの停止、一時停止、開始位置(途中からの再生とか)等のコントロールができる。

引数command_listには以下のようなコマンドを羅列して指定する。
コマンド定数パラメータ説明
PARCEL_MEDIA_COMMAND_STOP0 - ムービーメディアを停止し先頭に戻る
PARCEL_MEDIA_COMMAND_PAUSE1 - ムービーメディアを一時停止する
PARCEL_MEDIA_COMMAND_PLAY2 - ムービーメディアを再生する
PARCEL_MEDIA_COMMAND_LOOP3 - ムービーメディアをループ再生する
PARCEL_MEDIA_COMMAND_TEXTURE4 key texture メディアテクスチャをUUIDで指定する
PARCEL_MEDIA_COMMAND_URL5 string url メディアURLを指定する
PARCEL_MEDIA_COMMAND_TIME6 float time メディアの再生位置を指定する
PARCEL_MEDIA_COMMAND_AGENT7 key agent メディアコマンドを実行する対象アバターのUUIDを指定する
PARCEL_MEDIA_COMMAND_UNLOAD8 - ムービーを停止しメディアテクスチャを表示する
PARCEL_MEDIA_COMMAND_AUTO_ALIGN9 integer enable オートアライン機能のON/OFF


例えばムービーメディアの設定を行うには以下のようにする。

default {
   state_entry(){
     llParcelMediaCommandList([
       PARCEL_MEDIA_COMMAND_URL, "http://enter_your.url/here",
       PARCEL_MEDIA_COMMAND_TEXTURE, (key)llGetTexture(0)
     ]);
   }
}


タッチした人にムービーメディアを再生して見せる場合は以下のようになる。


default {
   touch_start(integer d){
     llParcelMediaCommandList([
       PARCEL_MEDIA_COMMAND_AGENT, llDetectedKey(0),
       PARCEL_MEDIA_COMMAND_PLAY
     ]);
   }
}


なお、土地がグループ所有の場合、スクリプトもグループ所有・グループ共有になっている必要がある。

現在設定されているメディアテクスチャ及びメディアURLを調べるにはllParcelMediaQuery関数を使用する。




llParcelMediaQuery

list llParcelMediaQuery(list query_list)

土地に設定されているメディアテクスチャ及びメディアURLを取得する。
引数query_listには以下の値を設定する。

定数説明
PARCEL_MEDIA_COMMAND_TEXTURE 4 メディアテクスチャのUUIDを要求
PARCEL_MEDIA_COMMAND_URL 5 メディアURLを要求


query_listが[PARCEL_MEDIA_COMMAND_TEXTURE]であればメディアテクスチャのUUIDが返るし、[PARCEL_MEDIA_COMMAND_URL]であればメディアURLが返る。
[PARCEL_MEDIA_COMMAND_TEXTURE, PARCEL_MEDIA_COMMAND_URL]を指定すれば両方を取得することができる。

メディアテクスチャ及びメディアURLの設定、再生・停止などのコントロールを行うにはllParcelMediaCommandList関数を使う。




llParseString2List

list llParseString2List(string src, list separators, list spacers)

文字列srcをseparators/spacersを区切りとしてリスト型データに展開する。

separatorsとspacersの違いは、区切り文字自体を結果のリストに含めるかどうかである。
separatorsは結果リストに含まれず、spacersは含まれる。

具体的に見るのが手っ取り早いと思うのでいくつか例を示す。

llParseString2List("A,B,C,D,E", [","], []);
結果:["A","B","C","D","E"];

llParseString2List("A/B/C/D/E", ["/"], []);
結果:["A","B","C","D","E"];

llParseString2List("A,B/C,D/E", ["/",","], []);
結果:["A","B","C","D","E"];

llParseString2List("A:B::C:D::", [":"], []);
結果:["A","B","C","D"];

llParseString2List("I am a pen.", [" "], []);
結果:["I","am","a","pen."];

llParseString2List("A1B2C3", ["1","2","3"], []); // セパレータ
結果:["A","B","C"]; // セパレータは結果に含まれない

llParseString2List("A1B2C3", [], ["1","2","3"]); // スペーサー
結果:["A","1","B","2","C","3"]; // スペーサーは結果に含まれる

llCSV2List関数はllParseString2List(src, [","], [])と同等である。
また、リストから逆に文字列への変換には、llDumpList2String関数を使用する。




llParseStringKeepNulls

list llParseStringKeepNulls(string src, list separators, list spacers)

文字列srcをseparators/spacersを区切りとしてリスト型データに展開する。
基本的にはllParseString2List関数と同様であるが、文字列srcの中にseparators/spacersの区切り文字が2文字以上連続して存在した場合、llParseStringKeepNulls関数は空白文字をリスト型データに展開する点が異なる。

両関数の結果の違いを例示する。

llParseString2List("A:B::C:D", [":"], []);
結果:["A","B","C","D"];

llParseStringKeepNulls("A:B::C:D", [":"], []);
結果:["A","B","","C","D"];




llParticleSystem

llParticleSystem(list parameters)

パーティクルを発生させる。
詳細な使用方法は「スクリプト小技」カテゴリの「パーティクル」を参照。

なお、パーティクルはクライアントサイドで実行される効果である。
パーティクルが設定されたオブジェクトがクライアントの視界に入ったタイミングで、どのような動きのパーティクルを発生させるかがクライアントに通知される。
あとはクライアントがそのパラメータに基づき、勝手にパーティクルを表示する仕組みになっている。
従って、パーティクルの見え方は厳密に言えばクライアントごとに異なる(例えば10秒ごとに噴射するパーティクルがあったとして、全てのクライアントで同じタイミングで噴射されているとは限らない)。

描画処理はあくまでもクライアント側であるので、サーバーの負荷は比較的軽微であるが、大量の粒子の動きを計算・描画するパーティクルの性質上、クライアント側の負荷には成り得る。
SIMそのものが不安定になることはなくても、パーティクルを目にしたクライアントが重くなる可能性は残る。

なお、パーティクルはHUDにて発生させることはできない。




llPassCollisions

llPassCollisions(integer pass)

子primで発生した衝突イベントをルートprimにも通知するかどうかを設定する。
引数passにTRUEを指定した場合はルートprimにも通知され、FALSEは通知されない。

通常、リンクオブジェクトにおける衝突イベント(collision_start、collision、collision_end)はprimごとに発生する。
しかしながら子prim内に衝突イベントを処理するスクリプトが存在しない場合、代わりにルートprimで衝突イベントが処理される。
ルートprimにも衝突イベントを処理するスクリプトがなければ、そのオブジェクトは衝突に関しては何も処理を行わない。

従って、もしも子primでのみ衝突イベントを処理し、ルートprimではタッチイベントを処理したくない場合は、子prim内に衝突イベントを処理するスクリプトを入れれば良い。

llPassCollisions関数を使うのは、子prim及びルートprim両方で衝突イベントを処理したい場合である。
子prim内のスクリプトで、

llPassCollisions(TRUE);

を実行しておけば、子prim内の衝突イベントを処理するコードの有無に関わらず、ルートprimで衝突イベントが発生する。




llPassTouches

llPassTouches(integer pass)

子primで発生したタッチイベントをルートprimにも通知するかどうかを設定する。
引数passにTRUEを指定した場合はルートprimにも通知され、FALSEは通知されない。

通常、リンクオブジェクトにおけるタッチイベント(touch_start、touch、touch_end)はprimごとに発生する。
しかしながら子prim内にタッチイベントを処理するスクリプトが存在しない場合、代わりにルートprimでタッチイベントが処理される。
ルートprimにもタッチイベントを処理するスクリプトがなければ、そのオブジェクトはタッチに関しては何も処理を行わない。

従って、もしも子primだけでタッチイベントを処理し、ルートprimではタッチイベントを処理したくない場合は、子prim内にタッチイベントを処理するスクリプトを入れれば良い。

llPassTouches関数を使うのは、子prim及びルートprim両方でタッチイベントを処理したい場合である。
子prim内のスクリプトで、

llPassTouches(TRUE);

を実行しておけば、子prim内のタッチイベントを処理するコードの有無に関わらず、ルートprimでタッチイベントが発生する。




llPlaySound

llPlaySound(string sound, float volume)

サウンドsoundをボリュームvolumeで再生する。
詳しくは「初級スクリプト」カテゴリの「音を鳴らそう」を参照。




llPlaySoundSlave

llPlaySoundSlave(string sound, float volume)

サウンドsoundをボリュームvolumeで再生する。
ただし、llLoopSoundMaster関数を使って再生中のサウンドがある場合、ループのタイミングに合わせて再生が開始される。




llPointAt

llPointAt(vector pos)

オブジェクトのオーナーをposで指定した場所に向けさせる関数らしいが、現在動作しない。




llPow

float llPow(float base, float exp)

baseのexp乗を返す。
例えばllPow(2.0, 3.0)であれば2の3乗で8を返す。




llPreloadSound

llPreloadSound(string sound)

引数soundで指定されたサウンドをプレロード(再生準備)する。
あくまでもサウンドを準備するだけであって再生は行われない。
サウンドがオブジェクトコンテンツ内にあれば引数soundは名前を使って指定可能。
コンテンツにないならUUIDを指定する。

この関数の実行には1秒かかる。

詳細な仕組みは知らないが、SLにおいてサウンドを耳にする場合、クライアントはサウンドデータをダウンロードしてくることになる。
これは裏方作業なので、ユーザーが通常意識することはない。
一つのサウンドが10秒までに制限されているのは、クライアントがサウンドをダウンロードする際の時間が比較的短時間で済むという理由もあるだろう。

しかしながら、10秒に制限されているとは言ってもサウンドデータは決して軽量なデータではない。
ネットワーク状況によってはサウンドのロードが遅延する可能性も十分にある。
LSLからサウンドを再生した場合、クライアントが即座にダウンロードを完了できれば良いが、ダウンロードが遅延した場合、当然サウンドの再生も即座には行われない。
初めて目にするジェスチャーで、アニメーションは見えているのにサウンドだけ後から聞こえてきた、なんていう経験は珍しいことではない。

llPreloadSound関数はこうしたサウンドダウンロードの遅延を回避するために利用される。
サウンドを再生する前に、あらかじめこの関数を実行し、クライアントにサウンドデータを事前にロードさせる。

もちろん、llPreloadSound関数を使ってプレロードしたからと言って、絶対にサウンド再生の遅延がなくなるわけではない。
プレロード自体が遅延していたら、再生までにダウンロードが終わっていないこともあるだろう。




llPushObject

llPushObject(key id, vector impulse, vector angular_impulse, integer local)

引数idのUUIDで示されるオブジェクトまたはアバターを、impulse、angular_impulseに指定した強さでプッシュする。
impulseは直線方向に働く力、angular_impulseは回転を与える力になる。
引数localがTRUEだった場合、impulse、angular_impulseの数値はローカル座標系に対する向きと解釈される。

この関数はllPushObjectが"restricted"に設定されている土地上ではオーナーにのみ有効である。





同じカテゴリー(リファレンス)の記事
 リファレンス【L】 (2007-08-28 13:54)
 リファレンス【GetU-K】 (2007-08-24 15:06)
 リファレンス【GetS-GetT】 (2007-08-13 13:49)
 リファレンス【GetP-GetR】 (2007-07-25 16:52)
 リファレンス【GetM-GetO】 (2007-07-14 12:15)
 リファレンス【GetG-GetL】 (2007-07-12 12:15)
 
<ご注意>
書き込まれた内容は公開され、ブログの持ち主だけが削除できます。