基本的なアイデアは、prim をひとつ(あるいは複数)、顔の正面に置いて、Lightの設定により、光源として使うことです。ただし、光源の prim が見えてしまっては邪魔なので、見えないようにする工夫が必要です。また、最初から、見
まずは、光源の prim を作成します。Features タブに、Light の項目があるので、check して、必要ならばパラメータを調整します。それから、Contents に、次の、見えなくするスクリプトを入れます。基本的には、llSetAlpha()
setInvisible() { llSetScale(<0.01, 0.01, 0.01>); llSetAlpha(0.0, ALL_SIDES); } default { state_entry() { } on_rez(integer param) { setInvisible(); } } |
これに、"light" と名付けて、take します。
次に、Nose (など)に attach (装着)する prim を作成し、上記の "light" object を入れます。さらに次のスクリプトにより、touch_start() イベントを受け取ったら、"light" object を rez して、link することにします。
string light = "light"; key owner; setLightName() { if (llGetInventoryNumber(INVENTORY_OBJECT) > 0) { light = llGetInventoryName(INVENTORY_OBJECT, 0); } } rezLight(vector pos) { llRezObject(light, pos, <0.0, 0.0, 0.0>, ZERO_ROTATION, 0); } rezLights() { setLightName(); vector pos = llGetPos(); vector v = <0.10, 0.0, 0.0>; vector p = pos + v; rezLight(p); } default { state_entry() { owner = llGetOwner(); } touch_start(integer n) { integer i; for (i = 0; i < n; i++) { if (llDetectedKey(i) == owner) { llRequestPermissions(owner, PERMISSION_CHANGE_LINKS); } } } run_time_permissions(integer perm) { if (perm & PERMISSION_CHANGE_LINKS) { rezLights(); } } object_rez(key id) { llCreateLink(id, TRUE); } } |
これで、touch すると、このオブジェクトには、見えない光源となるオブジェクトが link されることになります。
なお、この例では、attach される部所の 10cm のところに、光源のオブジェクトを 1個だけ、配置しています。必要ならば、光源の個数や場所を調整しておきます。
この時点で、Contents の中身は不要になるので、いったん削除しておきます。
さらに、attach() イベントを受け取ったら、自分自身を同様に見えなくする最初のものと似たスクリプトを
setInvisible() { llSetScale(<0.01, 0.01, 0.01>); llSetAlpha(0.0, ALL_SIDES); } default { state_entry() { } attach(key id) { setInvisible(); } } |
これを take して、自分の inventory に入れておきます。このオブジェクトを、例えば nose に attach すると、鼻の 10cm 先に、光源ができて、顔が明るくなるわけです。
上記のスクリプトや、object のパラメータを変更することにより、光源の数、距離、色などを調整することが可能です。た
下記は、snapshots ですが、以前の snapshot と比べて、顔の色が明るくなっているのが、わかります。特に、左の snapshot は、夜ですが、明るく照らされているのがわかります。
Tags: programming, second_life