ソラマメブログ

2007年08月24日

リファレンス【GetU-K】

llGetU・・・からllK・・・の関数リファレンスです。
GetU
llGetUnixTime
llGetVel
llGetWallclock
llGiveInventory
llGiveInventoryList
llGiveMoney
llGround
llGroundContour
llGroundNormal
llGroundRepel
llGroundSlope

H
llHTTPRequest

I
llInsertString
llInstantMessage
llIntegerToBase64

K
llKey2Name




llGetUnixTime

integer llGetUnixTime()

1970年1月1日午前0時0分0秒からの経過秒数を返す。
UNIXでいうところのtime_tに相当。




llGetVel

vector llGetVel()

オブジェクトの速度(m/s)を得る。
戻り値はvectorであるので、当然ながらオブジェクトが移動している方向を知ることも可能である。

単純にオブジェクトの速度を得たいなら、
  float speed = llVecMag(llGetVel());
とすると純粋な速度(m/s)がfloat型で得られる。
llVecMag関数はvectorの長さを得る関数。

オブジェクトの移動方向を知りたいなら、
  vector normal = llVecNorm(llGetVel());
このようにすると長さ1mのvectorを得ることができる。
長さ1mのvectorのことを単位ベクトルと言い、何かと便利な代物である。

何が便利かって、例えば、オブジェクトの進行方向5m先の座標を得たいと思ったら、
  vector pos = llGetPos() + llVecNorm(llGetVel()) * 5.0;
単位ベクトルは1mなので、5倍すれば5mの長さになる。
これを現在位置に足してやれば、進行方向5m先の座標になる。

なお、オブジェクトの速度は一定ではないので注意。
SLの世界には重力も働いているし、生意気にもエネルギーの概念があるため、永久に同じ速度で動き続けるオブジェクトは基本的には存在しない。

速度ではなく加速度を得るにはllGetAccel関数を、オブジェクトに加えられている力を得るにはllGetForce関数を使う。
言うまでもないが、加速度も力も、速度に影響を与えている。




llGetWallclock

float llGetWallclock()

サーバーのローカル時刻(0時からの経過秒数)を得る。
この関数で得られる時間は、SLクライアントに表示されているPST/PDTに等しいようだ。

取得できるのは0時からの経過秒数なので、これを時分秒に直すには、
integer t;

integer hours;
integer minutes;
integer seconds;

t = (integer)llGetWallclock();
hours = t / 3600;
minutes = (t % 3600) / 60;
seconds = t % 60;

こんな感じにするのが良いそうである。




llGiveInventory

llGiveInventory(key destination, string inventory)

オブジェクトのコンテンツから引数destinationに指定したUUIDの対象にアイテムinventoryを渡す。
渡す先のUUIDには、アバターまたはオブジェクトを指定できるが、オブジェクトに対してモノを渡す場合には、同一SIM内にあるオブジェクトでなければならない。
アバターに渡す場合は、どこにいようと結構です。オフラインでも結構です。

権限さえ問題なければ、基本的には何でもかんでも渡すことが可能。
オブジェクトに渡すときには、渡す先がllAllowInventoryDrop(TRUE)になっているとか、mod権限持っているとかすれば良い。
ただしスクリプトを渡しても、勝手にスクリプトが実行されることはない。
渡したあとでスクリプトを動かしたい場合は、llRemoteLoadScriptPin関数を使う。

具体的な使い方は以下の記事を参照のこと。

お金を扱う(初級スクリプト第十一回)http://miz.slmame.com/e2381.html
ノートを使おう(初級スクリプト第十二回)http://miz.slmame.com/e2400.html




llGiveInventoryList

llGiveInventoryList(key destination, string category, list inventory)

オブジェクトのコンテンツから引数destinationに指定したUUIDの対象にアイテムを渡す。
引数inventoryには渡したいアイテムのリストを指定する。
categoryは渡した先に作成されるフォルダの名前である。渡したアイテムは全てこのフォルダ内に入る。

具体的な使い方は以下の記事を参照のこと。

ノートを使おう(初級スクリプト第十二回)http://miz.slmame.com/e2400.html




llGiveMoney

llGiveMoney(key destination, integer amount)

destinationに指定したUUIDの相手にお金(amountL$)を渡す。
パーミッションPERMISSION_DEBITを取得しなければ使えない。
このパーミッションPERMISSION_DEBITはオブジェクトのオーナーでなければ取得できないため、実質的にオーナーから他のアバターへの支払のみが実行可能ということになる(他のアバターからお金を巻き上げるようなことはできない)。

詳細は以下の記事を参照のこと。

お金を扱う(初級スクリプト第十一回)http://miz.slmame.com/e2381.html




llGround

float llGround(vector offset)

offsetで指定した位置の地面の高さを返す。
offsetはオブジェクトからの相対距離である。
仮にoffsetがZERO_VECTORであれば、オブジェクトの存在する位置の地面の高さを返す。
offsetが<1.0, 0.0, 0.0>であれば、オブジェクトの位置からX方向に1mずれた位置の地面の高さを返す。

賢明なるスクリプター諸君ならお判りのことと思うが、offsetのZ値を変えても、返される地面の高さは変わらない。

なお、同様の関数にllWater関数がある。
水面の高さを返す関数である。

同一地点の地面の高さと水面の高さを比較し、もしも地面の高さのほうが上であれば、水面は地下(=陸上)である。
水面のほうが高ければ、地面は水底(=海上)である。

指定座標が海ならTRUE、陸ならFALSEを返すユーザー関数。
integer isSea(vector p){
  if (llGround(p - llGetPos()) - llWater(p - llGetPos()) < 0.0) {
    return TRUE;
  }else{
    return FALSE;
  }
}

しかしながら、オブジェクトで陸地が作られていた場合はこの限りではない。




llGroundContour

vector llGroundContour(vector offset);

offsetで指定した位置の等高線を返す。
等高線ということは、地面の高さが変わらない方向、すなわち起伏のない方向である。
offsetはオブジェクトからの相対距離である。
仮にoffsetがZERO_VECTORであれば、オブジェクトの存在する位置の地面に対して、起伏が最も少ない方向を返す。
offsetが<1.0, 0.0, 0.0>であれば、オブジェクトの位置からX方向に1mずれた位置の地面に対して、起伏が最も少ない方向を返す。

これが何に利用できるかというと、実際に使ったことがないのでアレだが、例えば川に沿って動く船なんかが出来るかもしれない。
川底の高さが一定であれば、llGroundContour関数の戻り値は常に川の向きに等しい。
従って、llGroundContour関数の戻り値の方向に船を向け、動かせば、川に沿って動くことになる(多分実際にはさらなる工夫が必要だと思うけどw)。




llGroundNormal

vector llGroundNormal(vector offset)

offsetで指定した位置の地面の垂直方向を返す。
平らな地面であれば、垂直方向は当然真上になる。坂道なら、地面に垂直な方向は傾斜によって変わって来る。
offsetはオブジェクトからの相対距離である。
仮にoffsetがZERO_VECTORであれば、オブジェクトの存在する位置の地面に関して、垂直な方向を返す。




llGroundRepel

llGroundRepel(float height, integer water, float tau)

heightに指定した高度で物理オブジェクトが浮遊するようにする。
waterにTRUEを指定した場合は、地面及び海面からの高さである。
waterがFALSEであれば、あくまでも地面(及び水底)からの高さになる。
tauは弾み具合を調整する引数である。




llGroundSlope

vector llGroundSlope(vector offset)

offsetで指定した位置の地面の傾斜方向を返す。
offsetはオブジェクトからの相対距離である。
仮にoffsetがZERO_VECTORであれば、オブジェクトの存在する位置の地の傾斜方向を返す。




llHTTPRequest

key llHTTPRequest(string url, list parameters, string body)

引数urlのアドレスに対してparametersとbodyを使ってHTTPリクエストを送る。
いわゆるWeb連携を行うための関数である。

urlに指定するのは、Webブラウザでお馴染みの、"http://"で始まるURLアドレスである。

parametersには以下のようなキーと値のセットをリストとして指定する。
  [キー1, 値1, キー2, 値2...]
必要な数だけキーと値のセットを繰り返す。

指定できるキーは以下の通り。
キーキーの値値の型値の初期値説明
HTTP_METHOD 0string "GET" "GET","POST","PUT","DELETE"のいずれか。
HTTP_MIMETYPE 1string "text/plain;charset=utf-8" MIMEタイプ。フォーム入力をエミュレートするには"application/x-www-form-urlencoded"を使う。
HTTP_VERIFY_CERT 3integer TRUE SSL証明の厳密さを指定する・・・らしい。FALSEだとどんなSSL証明でもOKになる


llHTTPRequest関数はkey型の戻り値を返す。
これはhttp_responseイベントで返って来るリクエストのIDである。
仮に戻り値がNULL_KEYだった場合は、HTTPリクエストはコケている。

この関数によるHTTPリクエストには、以下のヘッダーが自動的に付加される。
ヘッダ・キーヘッダ・値 意味
Accept text/* 受け入れ可能なMIMEタイプ
Accept-Charset utf-8;q=1.0, *;q=0.5 受け入れ可能なコードセット
User-Agent Second Life LSL/VERSION (http://secondlife.com/) リクエスト送信アプリケーションとそのバージョン
X-SecondLife-Shard "Production"通常固定値。
X-SecondLife-Object-Name NAME リクエストを送信したオブジェクト名
X-SecondLife-Object-Key KEY リクエストを送信したオブジェクトのUUID
X-SecondLife-Region NAME(X,Y) リクエスト送信時の土地名及び位置(グリッド座標)
X-SecondLife-Local-Position (X,Y,Z) リクエストを送信したオブジェクトの位置
X-SecondLife-Local-Rotation (X,Y,Z, W) リクエストを送信したオブジェクトの回転値
X-SecondLife-Local-Velocity (X,Y,Z) リクエストを送信したオブジェクトの速度
X-SecondLife-Owner-Name NAME リクエストを送信したオブジェクトのオーナー名
X-SecondLife-Owner-Key KEY リクエストを送信したオブジェクトのオーナーのUUID

要するにこれらの情報については、いちいち別途送信しなくてもWebサーバー側で取得可能ということである。
便利な世の中だ。

さて、例を示しておこうと思うが、実際に動かせるサンプルとなるとWebサーバー側の実装が不可欠になる。
わざわざそこまで用意する暇がないので、LSL-Wikiからサンプルを紹介させていただく。

以下のコードはアバターの名前からUUIDを取得する。
UUIDから名前を得る関数は存在するが(llKey2Name関数)、その逆は存在しない。
それが納得いかず、名前からUUIDを検索する外部Webサービスを作った人たちがいる。

そのサービスを利用することで、名前からUUIDを調べることが可能だ。
以下がそのためのスクリプトである。
key requestid;
string resident;

default
{
state_entry()
{
llListen(1,"","","");
}
listen( integer chan, string name, key id, string msg )
{
list names = llParseString2List(msg,[" "],[]);
resident = llDumpList2String(names," ");
requestid = llHTTPRequest("http://w-hat.com/name2key?name="+llDumpList2String(names,"+"),[HTTP_METHOD,"GET"],"");
}
http_response(key request_id, integer status, list metadata, string body)
{
if (request_id == requestid)
{
integer i = llSubStringIndex(body,resident);
if ( i != -1 )
llSay(0,llGetSubString(body,i,i+llStringLength(resident)+36));
else
llSay(0,"No resident named \""+resident+"\" found in the w-hat name2key database");
} else
llSay(0,(string)status+" error");
}
}





llInsertString

string llInsertString(string dst, integer position, string src)

文字列dstのposition位置に別の文字列srcを挿入した結果を返す。
例えば、
  llInsertString("Kagawa", 2, "na");
の結果は、
  "Kanagawa"
となる。
別に私は香川県にも神奈川県にも何ら屈託を抱いていないので念のため。




llInstantMessage

llInstantMessage(key user, string message)

userに指定したUUIDのアバターにIMにてmessageを送信する。
この関数は2秒かかる。

何度か質問されたことがあるが、IMを送れるのはアバターのみである。
オブジェクトに対してIMを送ることはできない。
なお、IMできる文字列の上限は1,023Byte(日本語だと約500文字)までである。




llIntegerToBase64

string llIntegerToBase64(integer number)

integer型の数値をBase64データへエンコードする。
この関数でエンコードしたデータをデコードするには、llBase64ToInteger関数を使う。




llKey2Name

string llKey2Name(key id)

引数idに指定したUUIDのアバター/オブジェクトの名前を返す。
しかしながら、調べるアバター/オブジェクトは同一SIMに存在しなければならない(隣接SIMでもOKらしいが)。

この関数の逆(名前からUUIDを調べる関数)は存在しない。
しかしながら、代替手段がある。
llHTTPRequestのサンプルコードを参照のこと。




これでようやく半分くらいだろうか(^^;
この分だとまだまだ終わりそうもないですなぁ・・・www




同じカテゴリー(リファレンス)の記事
 リファレンス【M-P】 (2007-09-21 12:15)
 リファレンス【L】 (2007-08-28 13:54)
 リファレンス【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)
この記事へのコメント
ゴルフクラブ最安値ショップと 最高のゴルフクラブを入手できることを目指しています。全品激安ゴルフ用品、2013ゴルフクラブセット新発製品大集合!全国送料無料、ご安心購入してください
Posted by タイトリスト ボーケイ sm5 at 2014年08月08日 10:47
 
<ご注意>
書き込まれた内容は公開され、ブログの持ち主だけが削除できます。