2007年07月10日
リファレンス【GetA-GetF】
llGetA・・・からllGetF・・・の関数リファレンスです。
llGetAccel
llGetAgentInfo
llGetAgentSize
llGetAlpha
llGetAndResetTime
llGetAnimation
llGetAnimationList
llGetAttached
llGetBoundingBox
llGetCameraPos
llGetCameraRot
llGetCenterOfMass
llGetCreator
llGetColor
llGetDate
llGetEnergy
llGetForce
llGetFreeMemory
llGetAccel
vector llGetAccel()
物理オブジェクトの加速度を得る。
戻り値はvectorなので加速の方向もわかる。
純粋な加速度を調べたい場合は戻り値のvectorをllVecMag関数に渡せば良い。
llGetAgentInfo
integer llGetAgentInfo(key id)
エージェントの情報を入手する。
腕利きのエージェントを調査する場合は報復を覚悟したりしなくても良い。
ここで言うエージェントというのは要するにアバターのことである。
この関数で調べることができるのは、主にアバターの動作である。
戻り値はビットフィールドになっているので以下の定数と&演算を行って判定する。
以下の例はアタッチメントを一切装備していない可哀想なアバターに葉っぱを与える。
なお、この関数はSIM内にいるアバターに対してでなければ使えない。
llGetAgentSize
vector llGetAgentSize(key id)
エージェントのサイズを得る。
つまりアバターの身長を調査する関数である。
戻り値はvectorなので、本来であればZ値=身長、X値=横幅、Y値=腹の出具合であっても良さそうなものだが、実際に測ることができるのはZ値のみである。
XとYは0.45と0.6に固定されている。
つまり横幅より腹のほうが飛び出している。
なお、Z値はアバターの見た目の身長ではない。
シークレットブーツなどを履いているアバターは、この関数の戻り値のZ値よりも実際には背が高く見える。
河童のように、頭部にでかい被り物を装着している人種に関しても同様に、Z値は正確な身長にはならない。
単純な身長測定スクリプト。
llGetAlpha
float llGetAlpha(integer face)
指定面の透明度を得る。
戻り値は基本的には0.0~1.0である。
0.0だと完全透明、1.0は完全不透明。
ただし、引数faceにALL_SIDESを指定した場合、戻り値はprimの全ての面の透明度を合計した値になる。
例えば初期状態のキューブで全ての面が完全不透明だった場合には6.0が返って来る。
意味があるかどうかはともかく、返って来た値を面数で割ってやると、primの平均透明度を得ることができる。
float alpha = llGetAlpha(ALL_SIDES) / ((float)llGetNumberOfSides());
なお、この関数によって得られる透明度はbuildツールのテクスチャ透明度と連動している。
buildツールでは0~90の値が設定可能だが、0は完全不透明、90は90%透明である。
例えばbuildツールで90%透明に設定された面の透明度をこの関数で取得すると、0.1が返る。
つまり、
buildツールの透明度 = 100 - llGetAlpha関数の透明度 * 100
である。
リンクオブジェクトの透明度を得るにはllGetLinkAlphaを使う。
透明度を設定するにはllSetAlpha、llSetLinkAlphaを使用する。
llGetAndResetTime
float llGetAndResetTime()
スクリプトの稼働秒数を取得し、かつ稼働秒数をリセット(ゼロに戻す)する。
稼動秒数を取得するだけの場合はllGetTimeを使う。
稼動秒数のリセットだけを行う場合はllResetTimeを使う。
以下の二つはほぼ同じ処理である。
llGetAnimation
string llGetAnimation(key id)
アバターが現在実行中のアニメーション状態名を返す。
アニメーション状態名とは、歩く、座る、飛ぶなどのアバターの基本動作を指す。
セカンドライフではアニメーション状態に応じて基本アニメーションが自動的に実行される。
例えば状態が「Walking」であれば「walk」アニメーションが実行される。
この関数の戻り値は以下のいずれかである。
この関数の最も有名な使い方はアニメーションオーバーライド(AO)である。
AOとは歩く、座るなどの基本動作アニメーションを独自のアニメーションに置き換えることを言う。
以下は簡単なAOのスクリプトである。
リストanimeに定義されている基本アニメーションが実行中の場合は、独自のアニメーションを再生する。
注:上記サンプルにおいてオリジナルのアニメーションが基本アニメーションの優先度よりも低い場合、AOは正しく動作しない。
llGetAnimationList
list llGetAnimationList(key id)
実行中のアニメーションのUUIDリストを返す。
アニメーションは複数同時に実行することが可能であるが、この関数を使うとアバターが現在実行している全てのアニメーションのUUIDを得ることができる。
以下の例はタッチしたアバターが実行中の全アニメーションを停止する。
踊りすぎて止まらなくなったあなたに。
llGetAttached
integer llGetAttached()
オブジェクトがアタッチされている位置を返す。
アタッチされていない場合の戻り値はゼロ。
アタッチ位置を示す戻り値は以下の通り。
アタッチ位置を調べられるのはスクリプトを実行しているオブジェクト自身についてのみである。
他のオブジェクトのアタッチ位置を取得することはできない。
llGetBoundingBox
list llGetBoundingBox(key object)
指定したUUIDのオブジェクト(またはアバター)の当たり判定領域を取得する。
当たり判定の領域のことをバウンディングボックスと言う。
通常バウンディングボックスはオブジェクトをすっぽり覆う立方体で示される。
この関数の戻り値は、vector型変数を二つ含むリストである。
二つのvectorは、バウンディングボックスの最小コーナー座標及び最大コーナー座標を示す。
以下の例はLSL-Wikiからそのまま持ってきたスクリプトであるが、バウンディングボックスを視覚化する。
半透明のキューブに以下のスクリプトを仕込み、チャンネル3で対象のオブジェクト名を指定する。
例えば「/3 Miz Cremorne」と発言すれば、私のアバターのバウンディングボックスを見ることができる(10m以内に存在するものじゃないと駄目)。
llGetCameraPos
vector llGetCameraPos()
カメラの位置を取得する。
この関数を実行するにはPERMISSION_TRACK_CAMERAの取得が必要。
llGetCameraRot関数と組み合わせて使うことで、アバターがどこを見ているかを調べることができる。
以下の例はカメラ位置と注目点を表示するアタッチメントである。
llSetCameraAtOffset関数やllSetCameraEyeOffset関数に指定する値を調べるのに有用。
llGetCameraRot
rotation llGetCameraRot()
カメラの角度を取得する。
この関数を実行するにはPERMISSION_TRACK_CAMERAの取得が必要。
llGetCameraPos関数と組み合わせて使うことで、アバターがどこを見ているかを調べることができる。
llGetCenterOfMass
vector llGetCenterOfMass()
オブジェクトの重心を得る。
パスカットなどで変形したprimの場合、重心=オブジェクトの位置ではない。
llGetCreator
key llGetCreator()
オブジェクトの製作者のUUIDを得る。
製作者とはオブジェクトを作成した人であり、オブジェクトのオーナーとは必ずしも一致しない。
llGetColor
vector llGetColor(integer face)
指定した面の色を得る。
faceにはprimの面を示す整数値を指定するが、例えばキューブタイプのprimであれば各面の値は以下のようになっている。
・通常時
・Hollow(くり抜き)の場合
・パスカットの場合
・くり抜いてパスカットしちゃったりした場合
パスカットの結果、特定の面が消失したような場合は値が繰り上がるので注意。
例えばパスカットして-X方向の面が完全に削れてしまっているような場合は、パスカット開始面が5、終了面が6になる。
faceに定数ALL_SIDESを指定すると、primの全面の平均色を返す。
戻り値のvectorは色を表すRGB値である。
各値の範囲は0.0~1.0となっている。
お馴染みの0~255の範囲に置き換えたい場合は単純に、* 255すれば良い。
なおこの関数とは逆に、色をセットしたい場合はllSetColorやllSetPrimitiveParamsを使う。
llGetDate
string llGetDate()
現在のUTC日付を返す。
戻り値の形式はYYYY-MM-DDである。
llGetEnergy
float llGetEnergy()
オブジェクトの残エネルギーを得る。
戻り値は0.0~1.0の範囲であり、残エネルギーの割合を示す。
0.0はエネルギーが完全に無いことを意味し、1.0は満タンである。
SLにおけるエネルギーとは、物理オブジェクトが持つ運動エネルギーのことで、以下の物理系関数を使ってオブジェクトを動かすと消費される。
llMoveToTarget
llApplyImpulse
llSetPos
llSetForce
llSetTorque
llApplyRotationalImpulse
llPushObject
エネルギーが減るとともに上記の関数は効果が弱くなっていき、ゼロになれば効果は無くなる。
つまり物理系関数を使ってオブジェクトを永久的に動かすことは不可能な仕様になっている。
しかしながら、エネルギーは時間とともに回復するため、オブジェクトを休ませてやれば再び動くようにはなる。
llGetForce
vector llGetForce()
フォースを得る。
主に惑星ダコパのマスター・ヨーダの元で修行を積むことで実現される機能である。
要するにオブジェクトに加えられている力(llSetForce関数による)を調べるのに使う。
llGetFreeMemory
integer llGetFreeMemory()
スクリプトが使用可能な残りメモリ容量(単位byte)を返す。
各スクリプトが利用可能なメモリ容量は一律16Kbyteである。
このメモリ容量の中にはスクリプトのバイトコード、スタックメモリ、ヒープメモリが含まれる。
極々簡単に言ってしまうなら、スクリプトのバイトコードとはスクリプト本体のことであり、スタックメモリは関数の呼び出し時に使われる領域、ヒープは変数の格納領域である。
すなわち、以下のような事柄がメモリを消費する要因になる。
・巨大なスクリプト
1スクリプト内に全ての処理を書くには限界がある。
スクリプトで実装する機能が膨大な場合はモジュール化(複数のスクリプトに分けてリンクメッセージ等でやり取りする方法)を考慮する。
・関数のネスト
大量のユーザー関数を用意し、関数の中から関数を呼び出し、さらに別の関数を・・・と次々に呼び出すとスタックメモリが消費される。
・巨大なリスト
リスト型変数は何でも格納できて便利だが、格納サイズには限界がある。
リストを多用し、いくつもの要素を格納していくとヒープメモリが足りなくなる場合がある。
かなりザックリな説明なので突っ込みどころではある(^^;
llGetAgentInfo
llGetAgentSize
llGetAlpha
llGetAndResetTime
llGetAnimation
llGetAnimationList
llGetAttached
llGetBoundingBox
llGetCameraPos
llGetCameraRot
llGetCenterOfMass
llGetCreator
llGetColor
llGetDate
llGetEnergy
llGetForce
llGetFreeMemory
llGetAccel
vector llGetAccel()
物理オブジェクトの加速度を得る。
戻り値はvectorなので加速の方向もわかる。
純粋な加速度を調べたい場合は戻り値のvectorをllVecMag関数に渡せば良い。
llGetAgentInfo
integer llGetAgentInfo(key id)
エージェントの情報を入手する。
腕利きのエージェントを調査する場合は報復を覚悟したりしなくても良い。
ここで言うエージェントというのは要するにアバターのことである。
この関数で調べることができるのは、主にアバターの動作である。
戻り値はビットフィールドになっているので以下の定数と&演算を行って判定する。
| 定数 | 説明 | 実際の値 |
|---|---|---|
| AGENT_FLYING | 飛行中もしくは落下中 | 1 |
| AGENT_ATTACHMENTS | アタッチメントを装備している | 2 |
| AGENT_SCRIPTED | スクリプト入りのアタッチメントを装備している | 4 |
| AGENT_MOUSELOOK | マウスルック状態 | 8 |
| AGENT_SITTING | 地面もしくはオブジェクトの上に座っている | 16 |
| AGENT_ON_OBJECT | 地面ではなく何かオブジェクトの上に座っている | 32 |
| AGENT_AWAY | AWAY状態 | 64 |
| AGENT_WALKING | 歩行中 | 128 |
| AGENT_IN_AIR | 飛行中ではなくジャンプ中 | 256 |
| AGENT_TYPING | チャット入力中 | 512 |
| AGENT_CROUCHING | しゃがんでいる | 1024 |
| AGENT_BUSY | BUSY状態 | 2048 |
| AGENT_ALWAYS_RUN | 常に走る状態になっている | 4096 |
以下の例はアタッチメントを一切装備していない可哀想なアバターに葉っぱを与える。
default {
touch_start(integer detected){
integer ai = llGetAgentInfo(llDetectedKey(0));
if (!(ai & AGENT_ATTACHMENTS)){
llGiveInventory(llDetectedKey(0), "happa");
}
}
}
なお、この関数はSIM内にいるアバターに対してでなければ使えない。
llGetAgentSize
vector llGetAgentSize(key id)
エージェントのサイズを得る。
つまりアバターの身長を調査する関数である。
戻り値はvectorなので、本来であればZ値=身長、X値=横幅、Y値=腹の出具合であっても良さそうなものだが、実際に測ることができるのはZ値のみである。
XとYは0.45と0.6に固定されている。
つまり横幅より腹のほうが飛び出している。
なお、Z値はアバターの見た目の身長ではない。
シークレットブーツなどを履いているアバターは、この関数の戻り値のZ値よりも実際には背が高く見える。
河童のように、頭部にでかい被り物を装着している人種に関しても同様に、Z値は正確な身長にはならない。
単純な身長測定スクリプト。
default {
touch_start(integer num_detected) {
vector size = llGetAgentSize(llDetectedKey(0));
llSay(0, "Height:" + (string)size.z) + "m";
}
}
llGetAlpha
float llGetAlpha(integer face)
指定面の透明度を得る。
戻り値は基本的には0.0~1.0である。
0.0だと完全透明、1.0は完全不透明。
ただし、引数faceにALL_SIDESを指定した場合、戻り値はprimの全ての面の透明度を合計した値になる。
例えば初期状態のキューブで全ての面が完全不透明だった場合には6.0が返って来る。
意味があるかどうかはともかく、返って来た値を面数で割ってやると、primの平均透明度を得ることができる。
float alpha = llGetAlpha(ALL_SIDES) / ((float)llGetNumberOfSides());
なお、この関数によって得られる透明度はbuildツールのテクスチャ透明度と連動している。
buildツールでは0~90の値が設定可能だが、0は完全不透明、90は90%透明である。
例えばbuildツールで90%透明に設定された面の透明度をこの関数で取得すると、0.1が返る。
つまり、
buildツールの透明度 = 100 - llGetAlpha関数の透明度 * 100
である。
リンクオブジェクトの透明度を得るにはllGetLinkAlphaを使う。
透明度を設定するにはllSetAlpha、llSetLinkAlphaを使用する。
llGetAndResetTime
float llGetAndResetTime()
スクリプトの稼働秒数を取得し、かつ稼働秒数をリセット(ゼロに戻す)する。
稼動秒数を取得するだけの場合はllGetTimeを使う。
稼動秒数のリセットだけを行う場合はllResetTimeを使う。
以下の二つはほぼ同じ処理である。
default {
touch_start(integer detected){
llSay(0, (string)llGetAndResetTime() + "seconds have passed.");
}
}
default {
touch_start(integer detected){
llSay(0, (string)llGetTime() + "seconds have passed.");
llResetTime();
}
}
llGetAnimation
string llGetAnimation(key id)
アバターが現在実行中のアニメーション状態名を返す。
アニメーション状態名とは、歩く、座る、飛ぶなどのアバターの基本動作を指す。
セカンドライフではアニメーション状態に応じて基本アニメーションが自動的に実行される。
例えば状態が「Walking」であれば「walk」アニメーションが実行される。
この関数の戻り値は以下のいずれかである。
| 戻り値 | 説明 | 基本アニメーション |
|---|---|---|
| Crouching | しゃがむ | crouch |
| Hovering | 浮遊 | hover |
| Hovering Down | 下降 | hover_down |
| Hovering Up | 上昇 | hover_up |
| Jumping | ジャンプ | jump |
| PreJumping | ジャンプ前の動作 | prejump |
| Running | 走る | run |
| Sitting | オブジェクトに座る | sit |
| Sitting on Ground | 地面に座る | sit_ground |
| Standing | 直立 | stand stand_1 stand_2 stand_3 stand_4 |
| Striding | 大股歩き。この戻り値が意味する動作が何なのか未確認 | stride |
| Flying | 飛行 | fly |
| FlyingSlow | ゆっくり飛行 | flyslow |
| Falling Down | 落下 | falldown |
| Standing Up | 立ち上がる(落下して倒れたあと) | standup |
| Landing | 着地 | land |
| Soft Landing | やんわり着地。普通の着地との違いは不明 | soft_land |
| CrouchWalking | しゃがみ歩き | crouchwalk |
| Turning Left | 左に回転 | turnleft |
| Turning Right | 右に回転 | turnright |
| Walking | 歩行 | walk |
この関数の最も有名な使い方はアニメーションオーバーライド(AO)である。
AOとは歩く、座るなどの基本動作アニメーションを独自のアニメーションに置き換えることを言う。
以下は簡単なAOのスクリプトである。
key actor=NULL_KEY;
list anime = [
"Sitting", "OrgSit",
"Standing", "OrgStand",
"Walking", "OrgWalk"
];
string cur_anim = "";
default {
run_time_permissions(integer perm){
if (! (perm & PERMISSION_TRIGGER_ANIMATION)) {
llRequestPermissions(actor, PERMISSION_TRIGGER_ANIMATION);
}else{
llSetTimerEvent(0.5);
}
}
attach(key id){
if (id != NULL_KEY){
actor = llGetOwner();
llRequestPermissions(actor, PERMISSION_TRIGGER_ANIMATION);
}else{
actor = NULL_KEY;
llSetTimerEvent(0.0);
}
}
timer(){
string now_anim = llGetAnimation(actor);
integer i = llListFindList(anime, [now_anim]);
if (i != -1){
string ao = llList2String(anime, i + 1);
if (ao == cur_anim) {
return;
}
llStartAnimation(ao);
if (cur_anim != ""){
llStopAnimation(cur_anim);
}
cur_anim = ao;
}else{
if (cur_anim != ""){
llStopAnimation(cur_anim);
cur_anim = "";
}
}
}
}
リストanimeに定義されている基本アニメーションが実行中の場合は、独自のアニメーションを再生する。
注:上記サンプルにおいてオリジナルのアニメーションが基本アニメーションの優先度よりも低い場合、AOは正しく動作しない。
llGetAnimationList
list llGetAnimationList(key id)
実行中のアニメーションのUUIDリストを返す。
アニメーションは複数同時に実行することが可能であるが、この関数を使うとアバターが現在実行している全てのアニメーションのUUIDを得ることができる。
以下の例はタッチしたアバターが実行中の全アニメーションを停止する。
踊りすぎて止まらなくなったあなたに。
default {
touch_start(integer num_detected) {
llRequestPermissions(llDetectedKey(0), PERMISSION_TRIGGER_ANIMATION);
}
run_time_permissions(integer perm) {
if(perm & PERMISSION_TRIGGER_ANIMATION){
list anims = llGetAnimationList(llGetPermissionsKey());
integer len = llGetListLength(anims);
integer i;
for (i = 0; i < len; i++){
llStopAnimation(llList2Key(anims, i));
}
}
}
}
llGetAttached
integer llGetAttached()
オブジェクトがアタッチされている位置を返す。
アタッチされていない場合の戻り値はゼロ。
アタッチ位置を示す戻り値は以下の通り。
| 定数名 | 値 | 説明 |
|---|---|---|
| なし | 0 | アタッチされていない |
| ATTACH_CHEST | 1 | 胸 |
| ATTACH_HEAD | 2 | 頭 |
| ATTACH_LSHOULDER | 3 | 左肩 |
| ATTACH_RSHOULDER | 4 | 右肩 |
| ATTACH_LHAND | 5 | 左手 |
| ATTACH_RHAND | 6 | 右手 |
| ATTACH_LFOOT | 7 | 左足 |
| ATTACH_RFOOT | 8 | 右足 |
| ATTACH_BACK | 9 | 背中 |
| ATTACH_PELVIS | 10 | 骨盤 |
| ATTACH_MOUTH | 11 | 口 |
| ATTACH_CHIN | 12 | あご |
| ATTACH_LEAR | 13 | 左耳 |
| ATTACH_REAR | 14 | 右耳 |
| ATTACH_LEYE | 15 | 左目 |
| ATTACH_REYE | 16 | 右目 |
| ATTACH_NOSE | 17 | 鼻 |
| ATTACH_RUARM | 18 | 右上腕部 |
| ATTACH_RLARM | 19 | 右下腕部 |
| ATTACH_LUARM | 20 | 左上腕部 |
| ATTACH_LLARM | 21 | 左下腕部 |
| ATTACH_RHIP | 22 | 右尻 |
| ATTACH_LHIP | 23 | 左尻 |
| ATTACH_RULEG | 24 | 右上脚部 |
| ATTACH_RLLEG | 25 | 右下脚部 |
| ATTACH_LULEG | 26 | 左上脚部 |
| ATTACH_LLLEG | 27 | 左下脚部 |
| ATTACH_BELLY | 28 | 腹/胃 |
| ATTACH_RPEC | 29 | 右胸部 |
| ATTACH_LPEC | 30 | 左胸部 |
| なし | 31 | HUD-中央2 |
| なし | 32 | HUD-右上 |
| なし | 33 | HUD-上 |
| なし | 34 | HUD-左上 |
| なし | 35 | HUD-中央 |
| なし | 36 | HUD-左下 |
| なし | 37 | HUD-下 |
| なし | 38 | HUD-右下 |
アタッチ位置を調べられるのはスクリプトを実行しているオブジェクト自身についてのみである。
他のオブジェクトのアタッチ位置を取得することはできない。
llGetBoundingBox
list llGetBoundingBox(key object)
指定したUUIDのオブジェクト(またはアバター)の当たり判定領域を取得する。
当たり判定の領域のことをバウンディングボックスと言う。
通常バウンディングボックスはオブジェクトをすっぽり覆う立方体で示される。
この関数の戻り値は、vector型変数を二つ含むリストである。
二つのvectorは、バウンディングボックスの最小コーナー座標及び最大コーナー座標を示す。
以下の例はLSL-Wikiからそのまま持ってきたスクリプトであるが、バウンディングボックスを視覚化する。
半透明のキューブに以下のスクリプトを仕込み、チャンネル3で対象のオブジェクト名を指定する。
例えば「/3 Miz Cremorne」と発言すれば、私のアバターのバウンディングボックスを見ることができる(10m以内に存在するものじゃないと駄目)。
default {
state_entry() {
llListen(3, "", llGetOwner(), "");
}
listen(integer channel, string name, key id, string message) {
llSensor(message, NULL_KEY, AGENT | ACTIVE | PASSIVE, 10, PI);
}
sensor(integer num_detected) {
list bb;
vector min;
vector max;
vector offset;
bb = llGetBoundingBox(llDetectedKey(0));
min = llList2Vector(bb, 0);
max = llList2Vector(bb, 1);
offset = (min + max) / 2;
offset *= llDetectedRot(0);
llSetText((string)min + "\n" + (string)max, <1, 1, 1>, 1.0);
llSetScale(-min + max);
llSetPos(llDetectedPos(0) + offset);
llSetRot(llDetectedRot(0));
}
}
llGetCameraPos
vector llGetCameraPos()
カメラの位置を取得する。
この関数を実行するにはPERMISSION_TRACK_CAMERAの取得が必要。
llGetCameraRot関数と組み合わせて使うことで、アバターがどこを見ているかを調べることができる。
以下の例はカメラ位置と注目点を表示するアタッチメントである。
llSetCameraAtOffset関数やllSetCameraEyeOffset関数に指定する値を調べるのに有用。
key avatar=NULL_KEY;
vector pos;
vector look;
get_permission(){
key permkey = llGetPermissionsKey();
if (permkey != avatar || avatar == NULL_KEY){
llRequestPermissions(avatar, PERMISSION_TRACK_CAMERA);
}else{
integer perm = llGetPermissions();
if (! (perm & PERMISSION_TRIGGER_ANIMATION)) {
llRequestPermissions(avatar, PERMISSION_TRACK_CAMERA);
}else{
llSetTimerEvent(1.0);
}
}
}
default {
state_entry(){
if (llGetAttached() != 0){
avatar = llGetOwner();
get_permission();
}
}
run_time_permissions(integer perm){
if (! (perm & PERMISSION_TRACK_CAMERA)) {
llRequestPermissions(avatar, PERMISSION_TRACK_CAMERA);
}else{
llSetTimerEvent(1.0);
}
}
attach(key id){
if (id != NULL_KEY){
avatar = llGetOwner();
get_permission();
}else{
llSetTimerEvent(0.0);
}
}
timer(){
vector p2 = llGetCameraPos();
vector l2 = <1.0, 0.0, 0.0> * llGetCameraRot();
if (p2 != pos || l2 != look){
llOwnerSay("EyeOffset=" + (string)p2 + "\n"
+ "CameraAtOffset=" + (string)(l2 + p2));
pos = p2;
look = l2;
}
}
}
llGetCameraRot
rotation llGetCameraRot()
カメラの角度を取得する。
この関数を実行するにはPERMISSION_TRACK_CAMERAの取得が必要。
llGetCameraPos関数と組み合わせて使うことで、アバターがどこを見ているかを調べることができる。
llGetCenterOfMass
vector llGetCenterOfMass()
オブジェクトの重心を得る。
パスカットなどで変形したprimの場合、重心=オブジェクトの位置ではない。
llGetCreator
key llGetCreator()
オブジェクトの製作者のUUIDを得る。
製作者とはオブジェクトを作成した人であり、オブジェクトのオーナーとは必ずしも一致しない。
llGetColor
vector llGetColor(integer face)
指定した面の色を得る。
faceにはprimの面を示す整数値を指定するが、例えばキューブタイプのprimであれば各面の値は以下のようになっている。
・通常時
| 面 | faceの値 |
|---|---|
| 上面 | 0 |
| -Y方向の面 | 1 |
| +X方向の面 | 2 |
| +Y方向の面 | 3 |
| -X方向の面 | 4 |
| 下面 | 5 |
・Hollow(くり抜き)の場合
| 面 | faceの値 |
|---|---|
| 上面 | 0 |
| -Y方向の面 | 1 |
| +X方向の面 | 2 |
| +Y方向の面 | 3 |
| -X方向の面 | 4 |
| hollow内部 | 5 |
| 下面 | 6 |
・パスカットの場合
| 面 | faceの値 |
|---|---|
| 上面 | 0 |
| -Y方向の面 | 1 |
| +X方向の面 | 2 |
| +Y方向の面 | 3 |
| -X方向の面 | 4 |
| 下面 | 5 |
| パスカット開始面 | 6 |
| パスカット終了面 | 7 |
・くり抜いてパスカットしちゃったりした場合
| 面 | faceの値 |
|---|---|
| 上面 | 0 |
| -Y方向の面 | 1 |
| +X方向の面 | 2 |
| +Y方向の面 | 3 |
| -X方向の面 | 4 |
| hollow内部 | 5 |
| 下面 | 6 |
| パスカット開始面 | 7 |
| パスカット終了面 | 8 |
パスカットの結果、特定の面が消失したような場合は値が繰り上がるので注意。
例えばパスカットして-X方向の面が完全に削れてしまっているような場合は、パスカット開始面が5、終了面が6になる。
faceに定数ALL_SIDESを指定すると、primの全面の平均色を返す。
戻り値のvectorは色を表すRGB値である。
各値の範囲は0.0~1.0となっている。
お馴染みの0~255の範囲に置き換えたい場合は単純に、* 255すれば良い。
なおこの関数とは逆に、色をセットしたい場合はllSetColorやllSetPrimitiveParamsを使う。
llGetDate
string llGetDate()
現在のUTC日付を返す。
戻り値の形式はYYYY-MM-DDである。
llGetEnergy
float llGetEnergy()
オブジェクトの残エネルギーを得る。
戻り値は0.0~1.0の範囲であり、残エネルギーの割合を示す。
0.0はエネルギーが完全に無いことを意味し、1.0は満タンである。
SLにおけるエネルギーとは、物理オブジェクトが持つ運動エネルギーのことで、以下の物理系関数を使ってオブジェクトを動かすと消費される。
llMoveToTarget
llApplyImpulse
llSetPos
llSetForce
llSetTorque
llApplyRotationalImpulse
llPushObject
エネルギーが減るとともに上記の関数は効果が弱くなっていき、ゼロになれば効果は無くなる。
つまり物理系関数を使ってオブジェクトを永久的に動かすことは不可能な仕様になっている。
しかしながら、エネルギーは時間とともに回復するため、オブジェクトを休ませてやれば再び動くようにはなる。
llGetForce
vector llGetForce()
フォースを得る。
主に惑星ダコパのマスター・ヨーダの元で修行を積むことで実現される機能である。
要するにオブジェクトに加えられている力(llSetForce関数による)を調べるのに使う。
llGetFreeMemory
integer llGetFreeMemory()
スクリプトが使用可能な残りメモリ容量(単位byte)を返す。
各スクリプトが利用可能なメモリ容量は一律16Kbyteである。
このメモリ容量の中にはスクリプトのバイトコード、スタックメモリ、ヒープメモリが含まれる。
極々簡単に言ってしまうなら、スクリプトのバイトコードとはスクリプト本体のことであり、スタックメモリは関数の呼び出し時に使われる領域、ヒープは変数の格納領域である。
すなわち、以下のような事柄がメモリを消費する要因になる。
・巨大なスクリプト
1スクリプト内に全ての処理を書くには限界がある。
スクリプトで実装する機能が膨大な場合はモジュール化(複数のスクリプトに分けてリンクメッセージ等でやり取りする方法)を考慮する。
・関数のネスト
大量のユーザー関数を用意し、関数の中から関数を呼び出し、さらに別の関数を・・・と次々に呼び出すとスタックメモリが消費される。
・巨大なリスト
リスト型変数は何でも格納できて便利だが、格納サイズには限界がある。
リストを多用し、いくつもの要素を格納していくとヒープメモリが足りなくなる場合がある。
かなりザックリな説明なので突っ込みどころではある(^^;
タグ :GET系関数
この記事へのトラックバックURL
http://miz.slmame.com/t14668
この記事へのコメント
数日前に土地を借りて色々な仕掛けを作成中ですのものです。いつもこちらのサイトを参考に素人ながらスクリプトを組んでいます。超感謝感激です♪
llGetAgentInfoの参考例を元に「特定のアイテムをアタッチしていれば指定のアニメーション動作を行う」といったものを作成したいのですが、教えていただけるでしょうか?
※「扇子を持ってないとお立ち台で踊れない」というベルファーレ世代の集まる場をどうしても作りたくて・・・。
お時間のある時で結構ですのでよろしくお願い致します。
llGetAgentInfoの参考例を元に「特定のアイテムをアタッチしていれば指定のアニメーション動作を行う」といったものを作成したいのですが、教えていただけるでしょうか?
※「扇子を持ってないとお立ち台で踊れない」というベルファーレ世代の集まる場をどうしても作りたくて・・・。
お時間のある時で結構ですのでよろしくお願い致します。
Posted by yanyan at 2007年07月12日 14:23
数日前に土地を借りて色々な仕掛けを作成中ですのものです。いつもこちらのサイトを参考に素人ながらスクリプトを組んでいます。超感謝感激です♪
llGetAgentInfoの参考例を元に「特定のアイテムをアタッチしていれば指定のアニメーション動作を行う」といったものを作成したいのですが、教えていただけるでしょうか?
※「扇子を持ってないとお立ち台で踊れない」というベルファーレ世代の集まる場をどうしても作りたくて・・・。
お時間のある時で結構ですのでよろしくお願い致します。
llGetAgentInfoの参考例を元に「特定のアイテムをアタッチしていれば指定のアニメーション動作を行う」といったものを作成したいのですが、教えていただけるでしょうか?
※「扇子を持ってないとお立ち台で踊れない」というベルファーレ世代の集まる場をどうしても作りたくて・・・。
お時間のある時で結構ですのでよろしくお願い致します。
Posted by yanyan at 2007年07月12日 14:37
>yanyanさん
こんばんは。
llGetAgentInfoは「アタッチメントを付けているかどうか」はわかるのですが、「何を付けているか」まではわかりません。
LSLでは残念ながら、「特定のアイテムをアタッチしているかどうか」を直接的に判定する方法がありません。
従ってyanyanさんのお望みのものを作るには少々工夫が必要です。
正直に言いますが、私も今すぐにはベストな方法を思いつきません(^^;
少なくとも、「扇子」と「お立ち台」の間でlistenを使ったメッセージのやり取りが必要になるでしょう。
1、「お立ち台」に「sit」すると"check attach"等と発言する
2、「扇子」が"check attach"をlistenする
3、「扇子」は自分のアタッチ位置をllGetAttached関数で調べ、所定位置(右手?)に装備されていたら"attach ok"等と発言する
4、「お立ち台」が"attach ok"をlistenする
5、「お立ち台」はダンスアニメーションを実行する
6、一定時間以内に"attach ok"がlistenできなかった場合(=扇子が装備されていない場合)は、「お立ち台」はllUnSit関数でアバタ-を強制的に立たせる
以上のようにすると「扇子」をアタッチしている人しか「お立ち台」でダンスできなくはなります。
まずはヒントレベルの回答ですが、もっと良い方法を思いついたら改めて。
こんばんは。
llGetAgentInfoは「アタッチメントを付けているかどうか」はわかるのですが、「何を付けているか」まではわかりません。
LSLでは残念ながら、「特定のアイテムをアタッチしているかどうか」を直接的に判定する方法がありません。
従ってyanyanさんのお望みのものを作るには少々工夫が必要です。
正直に言いますが、私も今すぐにはベストな方法を思いつきません(^^;
少なくとも、「扇子」と「お立ち台」の間でlistenを使ったメッセージのやり取りが必要になるでしょう。
1、「お立ち台」に「sit」すると"check attach"等と発言する
2、「扇子」が"check attach"をlistenする
3、「扇子」は自分のアタッチ位置をllGetAttached関数で調べ、所定位置(右手?)に装備されていたら"attach ok"等と発言する
4、「お立ち台」が"attach ok"をlistenする
5、「お立ち台」はダンスアニメーションを実行する
6、一定時間以内に"attach ok"がlistenできなかった場合(=扇子が装備されていない場合)は、「お立ち台」はllUnSit関数でアバタ-を強制的に立たせる
以上のようにすると「扇子」をアタッチしている人しか「お立ち台」でダンスできなくはなります。
まずはヒントレベルの回答ですが、もっと良い方法を思いついたら改めて。
Posted by Miz at 2007年07月12日 22:20
早速の御回答、ありがとうございます!。
llGetAgentInfoでの実装が困難にもかかわらず、代案まで提示頂き、いつもながら頭が下がる思いです・・。提示頂いた内容にて早速、やってみようと思います。 完成した際にはお知らせ致しますので是非、踊りにきてください♪。 扇子はもちろん差し上げますので・・・。
これからも参考にさせて頂きますので頑張ってください。ありがとうございました!
llGetAgentInfoでの実装が困難にもかかわらず、代案まで提示頂き、いつもながら頭が下がる思いです・・。提示頂いた内容にて早速、やってみようと思います。 完成した際にはお知らせ致しますので是非、踊りにきてください♪。 扇子はもちろん差し上げますので・・・。
これからも参考にさせて頂きますので頑張ってください。ありがとうございました!
Posted by yanyan at 2007年07月13日 09:10
Mizさん、お久しぶりです。ふと気が付くと日本語関数集充実してきてますね。非常な労作、感服いたしました。
ところで、llGetAnimationなのですが、これはアニメーション名ではなくてアニメーションの状態名ですね。
例えば、PageDownやCキーを押してしゃがむ場合、状態として"Crouching"となり、基本アニメーション名"crouch"が再生されます。
状態名取得のメリットは、しゃがんだ際AO等で違う名前のアニメに入れ替えられていても状態に変化はないことです。このへん、ややこしいので補足が必要かと思いました。
ところで、llGetAnimationなのですが、これはアニメーション名ではなくてアニメーションの状態名ですね。
例えば、PageDownやCキーを押してしゃがむ場合、状態として"Crouching"となり、基本アニメーション名"crouch"が再生されます。
状態名取得のメリットは、しゃがんだ際AO等で違う名前のアニメに入れ替えられていても状態に変化はないことです。このへん、ややこしいので補足が必要かと思いました。
Posted by Seagel at 2007年07月14日 15:47
>Seagelさん
長老様、ご指摘ありがとうございます。
思い返せば長老様のところへLSLの質問に出かけた頃のことが懐かしいです。
インパルスとフォースの違いなど、長老様に教えていただかなければわからなかったことが多数ありました。
記事のほう直しておきます。
他にも何かお気づきの点ありましたらご指摘いただけると嬉しく思います。
長老様、ご指摘ありがとうございます。
思い返せば長老様のところへLSLの質問に出かけた頃のことが懐かしいです。
インパルスとフォースの違いなど、長老様に教えていただかなければわからなかったことが多数ありました。
記事のほう直しておきます。
他にも何かお気づきの点ありましたらご指摘いただけると嬉しく思います。
Posted by Miz at 2007年07月17日 13:39
始めまして、このサイトを見てlslをいじりだした初心者です。
質問させて頂きたいのですが、愚問でしたらごめんなさい。
ここの記事のoverrideを参考にさせて頂きスクリプトを書いてみたのですが、Standing時に腹這いのアニメを割り当て、Walking時に腹這いのまま前進するようなアニメを割り当てたのですが、Standing状態からWalking状態に移るときに一瞬立ち上がってしまいます。
立ち上がらないでWalking状態にするための修正方法があったら教えていただきたく書き込みました。
よろしくお願いします。
質問させて頂きたいのですが、愚問でしたらごめんなさい。
ここの記事のoverrideを参考にさせて頂きスクリプトを書いてみたのですが、Standing時に腹這いのアニメを割り当て、Walking時に腹這いのまま前進するようなアニメを割り当てたのですが、Standing状態からWalking状態に移るときに一瞬立ち上がってしまいます。
立ち上がらないでWalking状態にするための修正方法があったら教えていただきたく書き込みました。
よろしくお願いします。
Posted by sankaku at 2007年07月24日 13:23
>sankakuさん
一瞬立ち上がる理由として思い当たるのは、アニメーションの優先順位の問題です。
Standing時の腹這いアニメの優先度はいくつになっているでしょうか。
サンプルのコードでは、llGetAnimation関数をタイマーで実行している関係上、厳密な「歩き出したタイミング」が取れるわけではありません。
0.5秒間隔で回しているので、最長で考えると、歩き出してから0.5秒経過して初めて匍匐前進のアニメに切り替わる場合があります。
(1)腹這いアニメ実行中
(2)歩き出す(デフォルトの歩行アニメが実行される)
: *この間、最長で0,5秒
(3)タイマーイベント発動、匍匐前進のアニメ実行
もしもStanding時の腹這いアニメの優先度が歩行アニメーションよりも高くなかった場合、0.5秒間は歩行アニメのほうが優先されて実行される可能性があります。
今思い当たるのはこれだけですが、他に問題がないかどうか一度確認してみますね。
一瞬立ち上がる理由として思い当たるのは、アニメーションの優先順位の問題です。
Standing時の腹這いアニメの優先度はいくつになっているでしょうか。
サンプルのコードでは、llGetAnimation関数をタイマーで実行している関係上、厳密な「歩き出したタイミング」が取れるわけではありません。
0.5秒間隔で回しているので、最長で考えると、歩き出してから0.5秒経過して初めて匍匐前進のアニメに切り替わる場合があります。
(1)腹這いアニメ実行中
(2)歩き出す(デフォルトの歩行アニメが実行される)
: *この間、最長で0,5秒
(3)タイマーイベント発動、匍匐前進のアニメ実行
もしもStanding時の腹這いアニメの優先度が歩行アニメーションよりも高くなかった場合、0.5秒間は歩行アニメのほうが優先されて実行される可能性があります。
今思い当たるのはこれだけですが、他に問題がないかどうか一度確認してみますね。
Posted by Miz at 2007年07月25日 11:28
>Mizさん
早速の回答ありがとうございます。
ご指摘の件ですが、
StandingとWalkingのアニメは共に優先度は4にしています。
ちなみに、以前は無料配布されているZHAOを使っていたのですが、そのときには今回のような事は起こりませんでた・・・。
お時間が有るときにでも確認していただければ嬉しい限りです。
ありがとうございます。
早速の回答ありがとうございます。
ご指摘の件ですが、
StandingとWalkingのアニメは共に優先度は4にしています。
ちなみに、以前は無料配布されているZHAOを使っていたのですが、そのときには今回のような事は起こりませんでた・・・。
お時間が有るときにでも確認していただければ嬉しい限りです。
ありがとうございます。
Posted by sankaku at 2007年07月27日 18:11
>sankakuさん
試してみました。
私のほうで試した限りでは、オーバーライドするアニメの優先度が4の場合は立ち上がるようなことは無いようでした。
サンプルに載せているコードのアニメ名だけ変えて試しましたが、sankakuさんの試しているコードも同様でしょうか?
試してみました。
私のほうで試した限りでは、オーバーライドするアニメの優先度が4の場合は立ち上がるようなことは無いようでした。
サンプルに載せているコードのアニメ名だけ変えて試しましたが、sankakuさんの試しているコードも同様でしょうか?
Posted by Miz at 2007年07月30日 13:41
>Mizさん
お世話になってます。
ご確認ありがとうございました。
私もいろいろ確認していたのですが、コードもアニメ名以外変更していませんし、原因不明に陥ってました。
しかし、ふと思って移動アニメのフェーズイン時間を0にしたところ、立ち上がることなく移動アニメに移るようになりました。
以上報告です。
色々ご親切に対応いただき、ありがとうございました。
しかしながら、解決したのでOKなのですが、解決した理屈はわかりません・・・。
お世話になってます。
ご確認ありがとうございました。
私もいろいろ確認していたのですが、コードもアニメ名以外変更していませんし、原因不明に陥ってました。
しかし、ふと思って移動アニメのフェーズイン時間を0にしたところ、立ち上がることなく移動アニメに移るようになりました。
以上報告です。
色々ご親切に対応いただき、ありがとうございました。
しかしながら、解決したのでOKなのですが、解決した理屈はわかりません・・・。
Posted by sankaku at 2007年08月04日 12:07
llGetAgentInfo の
if (!ai & AGENT_ATTACHMENTS){ ですが
if (!(ai & AGENT_ATTACHMENTS)){ でないと思ったように動かないようです。
ご報告まで。
if (!ai & AGENT_ATTACHMENTS){ ですが
if (!(ai & AGENT_ATTACHMENTS)){ でないと思ったように動かないようです。
ご報告まで。
Posted by Tackmee at 2007年08月12日 19:13
お返事遅くなりました(__;
>sankakuさん
フェーズイン時間が0以上ということは、匍匐前進のアニメはゆっくりスタートしますから、それまでの間は通常の歩行アニメと合成された状態で再生されるはずです。
したがって、一瞬立ち上がるように見えていたのだと思います。
>Tackmeeさん
ありがとうございます。
修正しておきます。
>sankakuさん
フェーズイン時間が0以上ということは、匍匐前進のアニメはゆっくりスタートしますから、それまでの間は通常の歩行アニメと合成された状態で再生されるはずです。
したがって、一瞬立ち上がるように見えていたのだと思います。
>Tackmeeさん
ありがとうございます。
修正しておきます。
Posted by Miz
at 2007年08月13日 11:05
at 2007年08月13日 11:05こんにちはいつも勉強になる記事を拝見させて頂いています。
今回は歩く時に独自のアニメーションを実行できる物が作りたいんですが、llGetAnimationの記事を参考に作るんでしょうか。
すいませんほんと初心者なので教えて頂けないでしょうか^^;
今回は歩く時に独自のアニメーションを実行できる物が作りたいんですが、llGetAnimationの記事を参考に作るんでしょうか。
すいませんほんと初心者なので教えて頂けないでしょうか^^;
Posted by Rossi at 2008年06月10日 18:19

