ソラマメブログ

2007年07月04日

リファレンス【E-F】

llD・・・からllF・・・の関数リファレンスです。
E
llEdgeOfWorld
llEjectFromLand
llEmail
llEscapeURL
llEuler2Rot

F
llFabs
llFloor
llForceMouselook
llFrand




llEdgeOfWorld

integer llEdgeOfWorld(vector pos, vector dir)

位置posからdirで示される方向・距離に移動した際に、現在のSIMから出るかどうかを判定する。
pos+dirの位置が現在と同一のSIMだった場合はTRUE、他SIMまたは世界の果てだった場合はFALSEを返す。




llEjectFromLand

llEjectFromLand(key user)

userに指定されたUUIDを持つアバターを土地から吹き飛ばす。
スクリプトのオーナーの土地に限り有効。

この関数の餌食になったアバターは文字通り「吹き飛ば」される。
バシルーラみたいなものである。
sitしていても防御することはできない。
建物内などに居た場合でも、屋根を突き抜けて吹き飛ばされてしまう。

lslWiki等を参照すると、この関数の使用時には事前に「警告」をすることが推奨されている。
いきなり吹き飛ばすのでは迷惑行為と見なされかねないからである。
高速で吹き飛ばされると、人によってはクライアントがクラッシュする可能性もある。

単に侵入者を排除したいのであれば、まずllTeleportAgentHome関数の使用を検討すべきであろう。
とか言いつつ、半径5m以内に近づく者をことごとく吹き飛ばすツイスターオブジェクトとか、そういうの好き。




llEmail

llEmail(string address, string subject, string message)

addressに指定したメールアドレス宛てに、タイトルsubject、本文messageのEメールを送信する。
この関数の使い方についてはEmailの送受信を参照。




llEscapeURL

string llEscapeURL(string url)

文字列urlをURLエスケープした文字列を返す。
URLエスケープとは、2バイト文字やスペースなど、URLとして使えない文字を変換することを言う。
この変換を行うことで、漢字などの情報をURLに含めることができるようになる。
なお、この変換はURLエンコードとも言う。

変換の方式には文字コードに応じていくつか種類があるが、LSLにおける変換方法はUTF8を使った変換である。

本来はWebサービス等の呼び出し時にパラメータとして2バイト文字情報を含めるための関数であるが、これを利用して日本語処理を行うことが可能である。
詳細は日本語を使うを参照。

なお、MacにおいてはLSLから直接日本語を扱えるという情報があるが、私はWindows環境しか持っていないため検証できていない(^^;




llEuler2Rot

rotation llEuler2Rot(vector vec)

Euler形式の回転値をクォータニオン形式に変換する。
Eulerはオイラーと読む。
偉い人の名前である。

オイラー形式の回転値とは、X,Y,Zの回転角度をラジアンで指定したもののことで、LSLではvector型の変数で扱う。
クォータニオン形式の回転値とはLSLのrotation型のデータのことである。

回転を扱う際にクォータニオンが便利である理由について詳細には説明しないが、LSLにおいては回転は全てクォータニオンで扱われる。
しかしながら、一般的に回転値を指定するときにはクォータニオン形式はわかりにくく、オイラー形式のほうが比較的イメージしやすい。
そのため、我々人類が回転値をコーディングするときにはオイラー形式を使用し、LSLの回転関数を使うときにはこのllEuler2Rot関数を使ってクォータニオンに変換するというのが一般的な手法である。

さらに言うならラジアンという単位も我々日本人には少々馴染みが薄い。
ラジアンは180度をπ(パイ=3.141592...)とする単位で、1度=約0.017453ラジアンである。
「45度回転させたい」というときに、とっさにラジアンがわかる人ならいいのだが、そんな人ばかりではないので、LSLでは便利な定数が用意されている。

DEG_TO_RAD(度数からラジアン)という名の定数で、この定数の値は約0.017453である。
つまり、45度をラジアンに変換したいときには、
  45 * DEG_TO_RAD
と書いてやれば良い。

例えば、あるオブジェクトをX軸周囲45度、Y軸周囲120度、Z軸周囲10度回転させたい場合、
vector rot=<45.0, 120.0, 10.0>

default {
  touch_start(integer num_detected) {
    llSetRot(llEuler2Rot(rot * DEG_TO_RAG));
  }
}

このような記述にすると、回転値の定義がわかりやすい。




llFabs

float llFabs(float num)

小数値numの絶対値を返す。

llAbs関数のfloat型版。




llFloor

integer llFloor(float val)

小数値val以下で最も大きい整数値を返す。
要するに小数部分を切り捨てる。

  llFloor(1.5) → 1
  llFloor(0.1) → 0
  llFloor(4.02) → 4
  llFloor(2.82) → 2

小数以下の切り上げにはllCeil、四捨五入にはllRoundを使う。




llForceMouselook

llForceMouselook(integer mouselook)

primに座ったアバターが強制的にマウスルックモードになるよう設定/設定解除する。
引数mouselookにTRUEを指定すると、そのprimに座ったアバターは強制的にマウスルックモードになる。
FALSEであればマウスルックモードにはならない(マウスルックモードの変更は行わない)。

すでに座っているアバターの視界をコントロールすることはできない。
座ったアバターをマウスルックモードにしたい場合は、あらかじめllForceMouselook(TRUE);を実行しておく必要がある。
一度この関数を使って強制マウスルックをONにした場合は、llForceMouselook(FALSE);を実行するまでその設定は有効である。

なお、この関数を使ったからといって、アバターの視界を常にマウスルックモードにできるわけではない。
ユーザーが自分でカメラを操作し、マウスルックモードを抜けることは可能なので注意すること。




llFrand

float llFrand(float max)

max未満のランダムな小数値を返す。
小数値は必ず0.0以上である。
例えばllFrand(1.0)であれば、0.0~0.9999999....の範囲の値をランダムに返す。

ランダムな整数を取りたい場合は単にキャストすれば良い。
例えば以下の例は6面サイコロをシミュレートしたユーザー関数の例である。
integer dice(){
  return ((integer)llFrand(6.0) + 1);
}

default {
  touch_start(integer num_detected) {
    llSay(0, (string)dice());
  }
}


0からではなく、10~20の間の範囲でランダムな値を取りたいような場合は、
  llFrand(最大値 - 最小値) + 最低値
のようにすれば良い。
integer rand(integer min, integer max){
  return ((integer)llFrand(max - min) + min);
}

default {
  touch_start(integer num_detected) {
    llSay(0, (string)rand());
  }
}







この記事へのトラックバックURL

http://miz.slmame.com/t13391
この記事へのコメント
このブログ、すごいですね。
かなり時間かかっているんでは。
これからも見させてもらいます。

感動して、おもわずコメントしちゃいました
Posted by 鉄 at 2007年07月05日 02:18
はじめまして。
LSLを使えるようになりたいので、よく拝見させてもらってます。
説明が的確で理解しやすいので、とても重宝しております。

当方、Macを使っているので、llEscapeURLにあったMacでの日本語の扱いを試してみました。

新規スクリプトの「 llSay(0, "Touched. "); 」を「 llSay(0, "Touched. こんにちは"); 」を変更。エディタでは文字化けするものの、チャットでは「Touched. こんにちは」と表示されます。

とりあえず、llSayではOKみたいです。
Posted by 月白 at 2007年07月07日 17:47
>月白さん

検証ありがとうございます。
やっぱりMacでは小細工せずに日本語出るようですね。

エディタ上で化けてしまうのは痛いところですが・・・。
Posted by Miz at 2007年07月09日 11:47