リファレンス【L】

Miz

2007年08月28日 13:54


llL・・・の関数リファレンスです。
L
llList2CSV
llList2Float
llList2Integer
llList2Key
llList2List
llList2ListStrided
llList2Rot
llList2String
llList2Vector
llListFindList
llListInsertList
llListRandomize
llListReplaceList
llListSort
llListStatistics
llListen
llListenControl
llListenRemove
llLoadURL
llLog
llLog10
llLookAt
llLoopSound
llLoopSoundMaster
llLoopSoundSlave



llList2CSV

string llList2CSV(list src)

リスト型変数srcの中身をCSV形式の文字列にして返す。
CSVとはComma Separated Valuesの略で、Excel好きな方にはお馴染みのアレである。

つまりリストに格納された値をカンマ区切りの文字列に変換する関数である。
  ["a","b","c","d"] → "a,b,c,d"
  [1,2,4,8] → "1,2,4,8"
  [, , ]→",,"

この関数によってCSVに変換した文字列を再びリスト型に展開するにはllCSV2Listを使う。
また、要素の区切りをカンマ(,)以外にしたい場合はllDumpList2String関数を使うと良い。



llList2Float

float llList2Float(list src, integer index)

リストsrcのindex番目の要素をfloat型として取り出す。
先頭要素は0番目と数えるので注意すること。

指定した要素がfloat型として取り出せないような要素だった場合(例えば"string"とか<10.0, 0.0, 12.5>など)は0.0が返る/またはエラーとなる。



llList2Integer

integer llList2Integer(list src, integer index)

リストsrcのindex番目の要素をinteger型として取り出す。
先頭要素は0番目と数えるので注意すること。

指定した要素がinteger型として取り出せないような要素だった場合(例えば"string"とか<10.0, 0.0, 12.5>など)は0が返る/またはエラーとなる。



llList2Key

key llList2Key(list src, integer index)

リストsrcのindex番目の要素をkey型として取り出す。
先頭要素は0番目と数えるので注意すること。

指定した要素がkey型として取り出せないような要素だった場合(例えば0.27とか<10.0, 0.0, 12.5>など)はNULL_KEYが返る/またはエラーとなる。



llList2List

list llList2List(list src, integer start, integer end)

リストsrcのstart番目の要素からend番目の要素までを別のリストとして取り出す。
先頭要素は0番目と数えるので注意すること。
  llList2List(["a","b","c","d","e"], 2, 4) → ["c","d","e"]

例によってマイナスのインデックス値は後ろからの逆順を意味する。
  llList2List(["a","b","c","d","e"], 0, -1) → ["a","b","c","d","e"]
上記は0番目~後ろから1番目=最後尾ということなのでリスト全体を返す。
  llList2List(["a","b","c","d","e"], 0, -2) → ["a","b","c","d"]
-2であれば後ろから2番目まで、つまり最後の要素のみが除かれたリストが返る。

例によってさらにややこしい話だが、startとendの引数の大小を入れ替えると、start以上、end以下の要素が返る。
  llList2List(["a","b","c","d","e"], 4, 1) → ["a","b","e"]
4以上、1以下すなわち、"e"と"a","b"の部分が返る。



llList2ListStrided

list llList2ListStrided(list src, integer start, integer end, integer stride)

リストsrcのstart番目の要素からend番目の要素に関して、stride個ごとに要素を抜き出した別のリストを返す。
ストライダーとは馳夫のことであるが、ここでは意識しなくて良い。
しかしながら、気になる方のために簡単に説明しておくと、
「馳夫」→「大股でスタスタ歩く」→「階段とかも何段か飛ばしで登る」→「リストの要素を何個か飛ばしにする」
こんなイメージ。

一定間隔でリストを抜き出すメリットは、リスト上のデータ管理を以下のように行うことが可能になるからだ。
  [key1, value1, key2, value2, key3, value3....]
時々見かけるかと思うが、キーと値を繰り返して管理するようなリストである。
要素のパターンの繰り返しが、3つや4つになることもあるだろう。
  [item_no1, item_name1, texture1, price1, object_name1,
   item_no2, item_name2, texture2, price2, object_name2....]
ベンダーなどではありがちな管理方式だ。

こうしたリストから、例えば2番目のtextureのデータだけを抜き出したいような場合、
list items = [
  item_no1, item_name1, texture1, price1, object_name1,
  item_no2, item_name2, texture2, price2, object_name2....
];
integer i;
list texture_list=[];
for (i = 2; i < llGetListLength(items); i+= 5){
  texture_list += [llList2String(items.i)];
}

これでももちろん可能であるが、手間だし冗長だ。
llList2ListStrided関数を使うと、上記の処理は一行で可能となる。
list items = [
  item_no1, item_name1, texture1, price1, object_name1,
  item_no2, item_name2, texture2, price2, object_name2....
];
texture_list = llList2ListStrided(llDeleteSubList(items, 0, 1), 0, -1, 5);

llList2ListStrided関数は常に先頭からの「段飛ばし」になるので、2番目の要素であるtextureを先頭に持ってくるために、llDeleteSubList関数で最初の2要素を削除している。
この点、LSLの実装の仕方がとても頭悪いと思うが、こうなってるから仕方ない。
そして要素は5つ1セットになっているため、llList2ListStrided関数の最後の引数には5を指定し、5個飛ばしに要素を抜き出す。



llList2Rot

rotation llList2Rot(list src, integer index)

リストsrcのindex番目の要素をrotation型として取り出す。
先頭要素は0番目と数えるので注意すること。

指定した要素がrotation型として取り出せないような要素だった場合(例えば0.27とか"yah-yah"など)はZERO_ROTATIONが返る。
仮に文字列で"<10.0, 0.0, 12.5, 1.0>"などと入っていた場合でも、戻り値はZERO_ROTATIONになるようだ。

ただしこの場合、一旦文字列で要素を取り出し、それからrotation型にキャストすると正しく読み込めるっていうから困ったものだ。
  rotation r = (rotation)llList2String(rot,0);



llList2String

string llList2String(list src, integer index)

リストsrcのindex番目の要素をstring型として取り出す。
先頭要素は0番目と数えるので注意すること。

他の型とは異なり、指定した要素がstring型として取り出せないという事態は起こらない。
どんなものが入っていようが、とりあえずstring型で取り出してくれる。
よく言えば臨機応変、悪く言えば節操が無い。



llList2Vector

vector llList2Vector(list src, integer index)

リストsrcのindex番目の要素をvector型として取り出す。
先頭要素は0番目と数えるので注意すること。

指定した要素がvector型として取り出せないような要素だった場合(例えば0.27とか"yah-yah"など)はZERO_VECTORが返る。
仮に文字列で"<10.0, 0.0, 12.5>"などと入っていた場合でも、戻り値はZERO_VECTORになるようだ。

ただしこの場合、一旦文字列で要素を取り出し、それからvector型にキャストすると正しく読み込める。
  vector p = (vector)llList2String(pos,0);



llListFindList

integer llListFindList(list src, list test)

リストsrcの中からリストtestを探し、見つかった個所のインデックスを返す。
見つからなければ-1を返す。

しばしば、リストsrcの中に特定の要素があるかどうかを調べるのに使われる。

list commands = ["Red", "Blue", "Green"];
if (llListFindList(commands, ["Red"]) != -1){
  // リストcommands内に"Red"がある場合の処理
}else{
  // リストcommands内に"Red"がない場合の処理
}


初級スクリプト「prim間通信(スクリプト初級第十五回)」あたりでダイアログから入力された内容を判定する際の例が載っている。



llListInsertList

list llListInsertList(list dest, list src, integer pos)

リストsrcをリストdestの位置posに挿入した結果を返す。
もしposに指定する値がリストdestの最大要素数よりも大きい場合は、単純にdestの後ろにsrcが連結されたリストが返る。



llListRandomize

list llListRandomize(list src, integer stride)

リストsrcをランダムに並べ替えた結果を返す。
引数strideには1以上を指定する。
strideはいくつ毎の要素をランダムに並べ替えかの指定である。
1であれば1毎(つまり全ての要素)の並べ替えになる。
2であれば2つ毎の要素(偶数の要素)だけがランダムに並べ替り、奇数の要素は動かない。



llListReplaceList

list llListReplaceList(list dest, list src, integer start, integer end)

リストdestのstart番目からend番目の要素をリストsrcに置き換えた後のリストを返す。
先頭要素は0番目と数えるので注意すること。
  llListReplaceList(["0", "1", "2", "3"], ["a","b","c"], 1, 2) → ["0","a","b","c","3"]

例によってマイナスのインデックス値は後ろからの逆順を意味する。
  llListReplaceList(["0", "1", "2", "3"], ["a","b","c"], -2, -2) → ["0","1","a","b","c","3"]
上記は後ろから2番目ということなので"2"が置き換わる。
  llList2List(["0", "1", "2", "3"], ["a","b","c"], 0, -1) → ["a","b","c"]
上記は先頭~後ろから1番目(=最後尾)ということなのでリスト全体が置き換わる。

例によってさらにややこしい話だが、startとendの引数の大小を入れ替えると、start以上、end以下の要素が置き換わる。
  llList2List(["0", "1", "2", "3", "4"], ["a","b","c"], 3, 1) → ["2","a","b","c"]
3以上、1以下すなわち、"3","4"と"0","1"の部分が消えた残りの"2"に["a","b","c"]が追加される。



llListSort

list llListSort(list src, integer stride, integer ascending)

リストsrcを並び替える。
引数ascendingがTRUEだった場合は降順、FALSEだった場合は昇順に並ぶ。
strideは「リストのグルーピング」を指定する引数である。
llList2ListStrided関数の説明を見ていただくと、ストライドのイメージが多少なりともわかるかと思う。

リスト型というのは通常、一列にデータが並んでいる構造であるが、ストライドを使うことで行列的に扱うことができる。
・通常のリスト
  [1,2,3,4,5,6,7,8,9....]
・ストライド(3つずつの場合)
  [1,2,3,
   4,5,6,
   7,8,9
   ....]

上記のように、ストライドに3を指定した場合、リストの要素は3つ区切りで1グループとして扱われる。
これがどんなときに役立つかと言うと、例えばベンダーなどの作成時に、商品の名前、テクスチャ、価格をリストにまとめて管理したい場合がある。
  list items = ["guiter", "texture1", 600,
   "drum", "texture2", 650,
   "bass", "texture3", 550
   ];
このようなリストを商品の名前順に並べ替えたいとき、ストライドに3を指定すると良い。
  list srt = llListSort(items, 3, TRUE);
結果は以下のようになる(商品名のアルファベット順に3つの要素が1セットで並び替えられる)。
  ["bass", "texture3", 550,
   "drum", "texture2", 650,
   "guiter", "texture1", 600
   ]



llListStatistics

float llListStatistics(integer operation, list input)

リストinput内のデータに関して統計的な計算を行った結果を返す。
例えば、平均値、最小・最大値、分散、合計値等。
当然ながら、リストinput内の要素は数値型(integer/float)である必要がある。
なお、戻り値はfloat型の数値である。

引数operationには以下の値を指定する。これによって計算内容が決まる。
定数値計算内容LIST_STAT_RANGE 0値の範囲(最大-最小)を返すLIST_STAT_MIN 1最小値を返すLIST_STAT_MAX 2最大値を返すLIST_STAT_MEAN 3平均値を返すLIST_STAT_MEDIAN 4中間値を返すLIST_STAT_STD_DEV 5標準偏差を返すLIST_STAT_SUM 6合計値を返すLIST_STAT_SUM_SQUARES 7各値の2乗の合計値を返すLIST_STAT_NUM_COUNT 8リスト内の数値型要素の数を返すLIST_STAT_GEOMETRIC_MEAN 9幾何平均。各値を全部乗じた結果の累乗根

正直なところ、リストに格納できるデータ量を考えると、統計的に分析するだけの意味はあまりない。
ハック的に、リスト内の数値データと数値以外のデータの数を調べたいときなどにはLIST_STAT_NUM_COUNTを使うことがある程度か。

・数値以外のデータの数:
  llGetListLength(src) - llListStatistics(LIST_STAT_NUM_COUNT, src);



llListen

integer llListen(integer channel, string name, key id, string msg)

チャットチャンネルchannel番にて、名前がnameでUUIDがidのアバター/オブジェクトの発言msgをモニターする。
ある意味、キングオブLSLとも言える関数の一つ。
高機能なスクリプトを実現するには必ずと言ってもいいくらい必要になる関数である。

詳細は「聞き耳を立てる(初級スクリプト第七回)」を参照。



llListenControl

llListenControl(integer number, integer active)

ハンドルnumberのリッスンを停止または開始する。
引数activeにTRUEを指定した場合はリッスンを開始、FALSEであれば停止である。

ハンドルとはllListen関数の戻り値のことを言う。

この関数はリッスンの一時停止に使われる。
llListenRemove関数のようにリッスンを削除するわけではない。



llListenRemove

llListenRemove(integer number)

ハンドルnumberのリッスンを終了させる(削除される)。

詳細は「聞き耳を立てる(初級スクリプト第七回)」を参照。



llLoadURL

llLoadURL(key avatar_id, string message, string url)

urlに指定したwebページを表示してもよいかどうか、引数avatar_idのUUIDを持つアバターにダイアログで確認する。
アバターが「OK」を選べば、Webブラウザが立ち上がってページが表示される。

例えば以下のコードはタッチした人のPC上で当blogを表示させる。
default{
  touch_start(integer total_number){
    llLoadURL(llDetectedKey(0), "Makapu", "http://miz.slmame.com/");
  }
}




llLog

float llLog(float val)

引数valの自然対数を返す。



llLog10

float llLog10(float val)

引数valの常用対数を返す。



llLookAt

llLookAt(vector target, float strength, float damping)

オブジェクトのZ方向を座標targetに向ける。
その際の回転の強さをstrengthに指定し、緩衝力・・・とでも言うのか、回転を和らげる力をdampingに指定する。
一説によれば、適切なstrengthはオブジェクトの質量の半分(llGetMass関数の半分)で、dampingはstrengthの10%以下だとか。
まぁ、そのあたりは用途によっても変わってくるので、微調整は必須になる。
llStopLookAt関数を使うと、方向転換を中止することが可能。
物理ではないオブジェクトでも使うことができるが、その場合はもちろん回転の速度は指定できない。

以下はタッチした人のほうに頭(上面)を向けるオブジェクトの例。
default {
  touch_start(integer detected) {
    llLookAt(llDetectedPos(0), llGetMass() / 2.0, llGetMass() / 20.0);
  }
}




llLoopSound

llLoopSound(string sound, float volume)

引数soundで指定した名前またはUUIDのサウンドをループ再生する。
引数volumeは音量である。
0.0~1.0の間で指定し、0.0は無音、0.5ならオリジナルの半分の音量、1.0はオリジナルの音量である。

この関数を使って再生しているサウンドを止めるにはllStopSound関数を使えばよい。
また、llAdjustSoundVolume関数を使うと音量をコントロールできるので、フェードアウトのような演出も不可能ではない。



llLoopSoundMaster

llLoopSoundMaster(string sound, float volume)

llLoopSound関数と同様、引数soundで指定した名前またはUUIDのサウンドを音量volumeでループ再生するが、同期再生に対応する点が異なる。

同期再生とは、異なる複数のサウンドを同一タイミングで再生するための仕組みである。
再生のタイミングのベースとなるサウンドを「マスター」と言い、マスターのタイミングに合わせて鳴るサウンドを「スレーブ」と言う。
このllLoopSoundMaster関数を使って再生したサウンドは「マスター」となる。

マスターサウンドを二つ以上鳴らす意味はほとんど無い。
強いて言うならば日本の祭りにおけるリズムの釣り合いのような遊びに用いるくらいか。



llLoopSoundSlave

llLoopSoundSlave(string sound, float volume)

llLoopSound関数と同様、引数soundで指定した名前またはUUIDのサウンドを音量volumeでループ再生するが、同期再生に対応する点が異なる。

同期再生とは、異なる複数のサウンドを同一タイミングで再生するための仕組みである。
再生のタイミングのベースとなるサウンドを「マスター」と言い、マスターのタイミングに合わせて鳴るサウンドを「スレーブ」と言う。
このllLoopSoundSlave関数を使って再生したサウンドは「スレーブ」となる。

つまり、この関数で再生したサウンドは「マスターサウンド」のループと同期する。
マスターサウンドがループの先頭に戻ったタイミングで、同時に再生が行われる。



リファレンス