ソラマメブログ

2007年06月26日

リファレンス【B~C】

llB・・・~llC・・・の関数リファレンスです。
B
llBase64ToInteger
llBase64ToString
llBreakAllLinks
llBreakLink

C
llCeil
llClearCameraParams
llCloseRemoteDataChannel
llCloud
llCollisionFilter
llCollisionSound
llCollisionSprite
llCos
llCreateLink
llCSV2List




llBase64ToInteger

integer llBase64ToInteger(string str)

Base64変換されたデータstrをinteger型にデコードする。

Base64というのは電子メールなどに使われるエンコードの方式である。
漢字や生データを英数字に変換する方式なので、漢字を扱えない環境などでもデータをやり取りすることができる。

例えば
"隣の客はよく柿食う客だ"
という文字列をBase64変換すると
"ztmkzrXSpM+k6KSvs8G/qaSmtdKkwA=="
のようなデータになる。

Base64変換を行うことを「Base64でエンコードする」と言い、逆にBase64変換されたデータを元に戻すことを「Base64でデコードする」と言う。

LSLにおいては
「ll*ToBase64」がエンコード系の関数、
「llBase64To*」がデコード系の関数である。

llBase64ToString、llStringToBase64、llIntegerToBase64も参照のこと。





llBase64ToString

string llBase64ToString(string str)

Base64変換されたデータstrをstring型にデコードする。

Base64についてはllBase64ToIntegerを参照のこと。





llBreakAllLinks

llBreakAllLinks()

オブジェクトのリンクを全て解除する。
この関数を実行するにはPERMISSION_CHANGE_LINKSパーミッションを取得していなければならない。

バラバラ関数の例。
オブジェクトを物理にしてたりすると崩壊が楽しめる。
default {
  touch_start(integer num_detected) {
    if (llDetectedKey(0) == llGetOwner()){
      llRequestPermissions(llDetectedKey(0), PERMISSION_CHANGE_LINKS);
    }
  }

  run_time_permissions(integer perm) {
    if (perm & PERMISSION_CHANGE_LINKS) {
      llBreakAllLinks();
    }
  }
}


なお、この関数はアタッチメントにおいては効果が無い。
全てのリンクを解除するのではなく、一つのprimだけを外したい場合はllBreakLinkを使用すること。





llBreakLink

llBreakLink(integer linknum)

指定したリンクナンバーのprimのリンクを解除する。
通称、縁切り関数。
この関数を実行するにはPERMISSION_CHANGE_LINKSパーミッションを取得していなければならない。

タッチしたprimのリンクを外す例。
integer link_number;

default {
  touch_start(integer num_detected) {
    if (llDetectedKey(0) == llGetOwner()){
      link_number = llDetectedLinkNumber(0);
      llRequestPermissions(llDetectedKey(0), PERMISSION_CHANGE_LINKS);
    }
  }

  run_time_permissions(integer perm) {
    if (perm & PERMISSION_CHANGE_LINKS) {
      llBreakLink(link_number);
    }
  }
}


なお、この関数はアタッチメントにおいては効果が無い。
全てのリンクを解除すにはllBreakAllLinksを使用すること。






llCeil

integer llCeil(float val)

引数val以上の最も小さい整数を返す。
つまり小数以下を切り上げる。

  llCeil(1.5) → 2
  llCeil(0.1) → 1
  llCeil(4.02) → 5
  llCeil(2.82) → 3

小数以下の切り捨てにはllFloor、四捨五入にはllRoundを使う。





llClearCameraParams

llClearCameraParams()

スクリプトで制御していたカメラのパラメータを全てリセットしてデフォルト状態に戻す。
使用する際にはPERMISSION_CONTROL_CAMERAパーミッションが必要である。

スクリプトからカメラを制御するにはllSetCameraParams関数を使う。





llCloseRemoteDataChannel

llCloseRemoteDataChannel(key channel)

XML-RPCチャンネルをクローズする。
この関数は実行時に1.0秒ディレイする。





llCloud

float llCloud(vector offset)

オブジェクトの現在位置+offsetの場所の曇り具合を取得する。
llCloud(ZERO_VECTOR)であればオブジェクトの上空の雲の密度を得ることができる。

戻り値は0.0~2.0で、0.0は快晴を意味する。
数字が大きくなるほど曇天で、1.0超の場合は雨らしいのだが、雨が降るシステムは未実装なため、実際にはただ曇っているだけである。

雲は通常高度200m付近に漂っている。
offsetを指定するときにはZ軸の値は無視されるので、高度を意識して引数を指定する必要は無い。





llCollisionFilter

llCollisionFilter(string name, key id, integer accept)

衝突判定にフィルターを設定する。
フィルターとは、特定のアバターやオブジェクトの衝突判定を有効にしたり無効にしたりすることを言う。

引数name及びidにはフィルター対象となるアバター/オブジェクトの名前/UUIDを指定する。
引数acceptがTRUEの場合は衝突判定を有効とし、FALSEの場合は無効とする。

以下のようにすると"Miz Cremorne"の衝突判定を無効とし、無敵状態にする。
llCollisionFilter("Miz Cremorne", "xxxx...xxxxx", FALSE);

(注:UUIDは適当に書いてあるので実際には効果なし)

nameに""を指定した場合はあらゆる名前のアバター/オブジェクトが対象である。
idにNULL_KEYを指定した場合はあらゆるUUIDのアバター/オブジェクトが対象である。

つまり、以下は全アバター/オブジェクトの衝突判定を有効とする(=フィルターを解除する)。
llCollisionFilter("", NULL_KEY, TRUE);

逆に、以下のようにすると全アバター/オブジェクトの衝突判定を無効化する。
llCollisionFilter("", NULL_KEY, FALSE);


なお、衝突フィルターはステートを変更するとリセットされる。
ステートをまたがってフィルターを使用したい場合はstate_entryイベント内で再設定する必要がある。





llCollisionSound

llCollisionSound(string impact_sound, float impact_volume)

衝突時の音を設定する。
引数impact_soundにはサウンド名またはUUIDを指定する。
サウンド名で指定する場合、オブジェクトのコンテンツ内にサウンドが入っていなければならない。
impact_volumeは音量である。0.0~1.0の間で指定する。

音量に0.0を指定した場合、何故か衝突時のパーティクルがデフォルトに戻るというバグがあるらしいが未確認。
衝突時のパーティクルを設定するにはllCollisionSpriteを使う。





llCollisionSprite

llCollisionSprite(string impact_sprite)

衝突時のパーティクルを設定する。
物理オブジェクトを地面に落としたときなど、何やら火花っぽいものが飛び散ったりするが、あれが衝突時のパーティクルである。
この関数を使うと、衝突したときにハートが飛び散る矢とか、なんか変なものを作ることができる。

引数impact_spriteにはパーティクルに使用するテクスチャ名またはUUIDを指定する。
テクスチャ名で指定する場合、オブジェクトのコンテンツ内にテクスチャが入っていなければならない。

impact_spriteに""(空文字)を指定した場合はデフォルトのパーティクルに戻る。

衝突時のサウンドを設定するにはllCollisionSoundを使う。





llCos

float llCos(float theta)

引数thetaのコサインを得る。

コサインについては高校の教科書を参照のこと。

コサインの値から角thetaを求めるにはllAcosを使う。





llCreateLink

llCreateLink(key target, integer parent)

オブジェクトをリンクさせる。
引数targetにはリンク相手のUUIDを指定する。
parentにTRUEを指定した場合は自分(スクリプトを含むオブジェクト)が親となり、FALSEを指定した場合はtargetのオブジェクトが親となる。

この関数を実行するにはPERMISSION_CHANGE_LINKSパーミッションを取得する必要がある。
相手先のオブジェクトにはパーミッションがなくても良いが、双方のオブジェクトのオーナーが同一で、かつmodify権限を持っていなければならない。
アタッチメントやsit中のオブジェクトはリンク/リンク解除を行うことはできないという制限もある。

リンクが実行されるとchangedイベントが発生するが、このときのフラグはCHANGED_LINKとなっている。
なお、この関数は実行時に1秒間ディレイする。

リンクされるとprimのリンクナンバーは振り直される。
LSLWikiによれば、以下のようになるようだ。

オブジェクトAが3つのprim[A1, A2, A3]で構成されており、同様にオブジェクトBの構成が[B1, B2, B3]だったとする。
Aを親としてBとリンクすると、リンクナンバーは以下の順序になる。
  [A1, B1, B2, B3, A2, A3]
つまりルートprimの次に新たにリンクされたprimがつながり、その後ろに元からリンクされていたprimがつながる。

スクリプトからリンクを解除する際にはllBreakAllLinks及びllBreakLinkを使用する。





llCSV2List

list llCSV2List(string src)

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

つまりカンマ区切りの文字列をリストに変換する関数である。
ただし変換された要素は全て文字列型になることに注意。
  "a","b","c","d" → ["a","b","c","d"]
  1,2,4,8 → ["1","2","4","8"]
  <1,2,3>,<4,5,6>,<7,8,9> → ["<1,2,3>", "<4,5,6>", "<7,8,9>"]

この関数はリンクメッセージなどで複数のデータをやり取りしたい場合に便利である。
リンクメッセージで送れるデータは、整数値、文字列値、キー値の3通り各1つずつだが、時としてベクタ値とローテーション値を送りたい場合もある。
そのようなときにはベクタ値とローテーション値をCSV形式の文字列に変換し、文字列値としてリンクメッセージに乗せる方法がある。

default {
  touch_start(integer num_detected) {
    if (llDetectedKey(0) == llGetOwner()){
      llMessageLinked(LINK_SET, 0, llList2CSV([llGetPos(), llGetRot()]), NULL_KEY);
    }
  }

  link_message(integer sender, integer num, string str, key id){
    list v = llCSV2List(str);
    vector p = (vector)llList2String(v, 0);
    rotation r = (rotation)llList2String(v, 1);
    llSay(0, "Pos = " + (string)p + ", Rot = " + (string)r);
  }
}


llCSV2List関数とは逆に、リストをCSV形式の文字列値に変換するにはllList2CSV関数を使う。



タグ :衝突判定

同じカテゴリー(リファレンス)の記事
 リファレンス【M-P】 (2007-09-21 12:15)
 リファレンス【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)
この記事へのコメント
関数リファレンス・・・

いずれ公開しようかなと思いつつ、
人の投稿を集めただけで確認してなかったり・・・
もちろん英文を訳したり、自分でテストしたものもあるのですが、
今一詰めが甘い状態なのです。

まっ、部分的にこれはと言うのは載せてきましたので、
当面 自分としてはこのスタンスでいいかと思ってます。(^_^;

人魂~とか、灯台~とかのパーティクル集もできたし。
んじゃ、リファレンスのLとSあたりを載せるかな。
Posted by VtWin at 2007年06月26日 19:39
す、すげぇ、、。
lsl wikiを読んだだけではわからない事、実際にやってみないとわからない事が
網羅されていて、特に物理系が単語からして良くわからなかったので、
ほんと助かります・・
これで、アイテムつくりの幅が広がります、、!!
Posted by Ichioka Jun at 2007年06月26日 22:58
>VtWinさん

LはともかくSは大変そうですね(^^;

>Ichioka Junさん

物理系はまとまった情報があったほうがいいかなとは思っています。
Posted by Miz at 2007年06月27日 10:25
 
<ご注意>
書き込まれた内容は公開され、ブログの持ち主だけが削除できます。