Category:LSL Light/ja

From Second Life Wiki
Jump to: navigation, search

光の属性

オブジェクトが投射する光の属性には 5 種類あり、それらは編集ダイアログの "特徴" タブ、あるいはスクリプトの関数によって設定されます。ダイアログに表示されるコントロールの順番は、スクリプトの関数のそれと同じです。(後述の例を参照)

一番目は単純な on/off スイッチ です: すなわち、オブジェクトが光源である (チェックボックスがチェックされている、あるいは設定値が TRUE である) か、そうでないかです。光の は (編集ダイアログならば) カラー ピッカー、(スクリプトならば) RGB vector 値で通常設定されます。光の 輝度 (intensity) は、その光がどの位強いかという絶対量を示します。これは 0 から 1 の間の小数点値で、1 が最大強度、0 は "off" にしたのと同じになります。

残る 2 つの設定は、扱いが難しいものです。なぜならそれらの効果はとても繊細で、互いに影響しあうからです。半径 (Radius) はオブジェクトの中心から光が届く距離です。その端で光は周囲の自然環境光と溶け合い、見分けがつかなくなります。これはメートル単位の小数点値です。弱まる (Falloff) はオブジェクトから放たれた光が "減衰" する度合いです。これは 0 から 2 の範囲の小数点値で、2 ならば輝度は急激に弱まり、0 ならば距離を問わず比較的緩やかに変化します。

これらの設定がどのように反映されるか例示します。8x8x8 メートルの大きさで中がくりぬかれた灰色の立方体を想像 (できれば実際に作成) してみてください。そして一方の壁面中央に光源を一つ置き、あなたはその真下に立って反対側の壁を見てください。(ヒント: 実際にこのオブジェクトを作成しているならば、作業中は真夜中に設定してください。また RL であなたが居る部屋のカーテンを下ろし、照明も消してください。)

半径が 4 メートル (反対の壁までの距離の半分) 未満の間は、かなり暗いままでしょう。"弱まる" の値を 2 (最大減衰) にすると、部屋はさらにやや暗くなるでしょう。

半径が 8 メートル (反対の壁までの距離) に達すると、部屋はやや明るくなります。"弱まる" を最大にすると、半径が 4 メートルで "弱まる" が 0 だった場合と同じ暗さになります。

半径が反対の壁までの距離より大きくなってはじめて、顕著に明るくなります。"弱まる" の効果はより大きくなり、ゼロにした場合、壁に当たる光は光源の軸を遮る点を中心として円形に集まるようになります。最大にした場合、部屋は直径が 4 メートルだった時と同じくらいに暗くなります。

光源の制御

SL の光は、最大 8 個の光源を扱える OpenGL の標準に従います。慣習的かつ実際的見地から、2 個は太陽と月に割り当てられ、6 個がその他の光用として残されます。8 個の光は全てクライアント機のビデオカードによって処理されるため、ビデオカードの種類が違うと、同じ場面でも若干見栄えが異なるかもしれません。ある場面でユーザによる光源が 6 個以上あった場合、周囲でより近い方にある 6 個のだけが表示されます。

LSL で光を作成、切り替え、変更する例:

integer isLightTurnedOn;
 
default
{
    touch_start(integer total_number)
    {
//      toggle isLightTurnedOn between TRUE and FALSE
        isLightTurnedOn = !isLightTurnedOn;
 
        if (isLightTurnedOn)
        {
            llSetPrimitiveParams([
                PRIM_FULLBRIGHT, ALL_SIDES, FALSE,
                PRIM_POINT_LIGHT, FALSE, ZERO_VECTOR, 1.0, 10.0, 0.6]);
        }
        else
        {
            vector COLOR_ORANGE  = <1.000, 0.522, 0.106>;
 
            llSetPrimitiveParams([
                PRIM_FULLBRIGHT, ALL_SIDES, TRUE,
                PRIM_POINT_LIGHT, TRUE, COLOR_ORANGE, 1.0, 10.0, 0.6]);
        }
    }
}

The following example shows how to create a configurable light that turns itself on and off when touched. The light's properties can be edited by changing the values defined at the top of the script. This script illustrates the lighting attributes PRIM_POINT_LIGHT, PRIM_FULLBRIGHT and PRIM_GLOW.

// Touch the object to light it up.
// Lighting is configurable.
 
integer light_s    = TRUE;
vector  lightcolor = <1.0, 0.75, 0.5>;
float   intensity  = 1.0;             // 0.0 <= intensity <= 1.0
float   radius     = 10.0;            // 0.1 <= radius <= 20.0
float   falloff    = 0.01;            // 0.01 <= falloff <= 2.0
float   glow       = 0.05;
 
toggle()
{
    float thisglow = 0.0;
    light_s = !light_s;
 
    if (light_s)
        thisglow = glow;
 
    llSetPrimitiveParams([
        PRIM_POINT_LIGHT, light_s, lightcolor, intensity, radius, falloff,
        PRIM_FULLBRIGHT, ALL_SIDES, light_s,
        PRIM_GLOW,       ALL_SIDES, thisglow
    ]);
      llSetColor(lightcolor, ALL_SIDES);
}
 
default
{
    state_entry()
    {
        llSetText("Touch for light", <1.0, 1.0, 1.0>, 1.0);
        toggle();
    }
 
    touch_start(integer total_number)
    {
        toggle();
    }
}


// simple light source demonstrator
// 8feb07 "tetsumo kuri"
// thanks to squee janitor for line to dissect
 
integer light_s = TRUE; // "_s" for status
 
default {
 
   state_entry()
   {
     //  llSetText("click me",<1,0,0.6>,.5);  // in case you like labels
   }
 
   touch_start(integer total_number)
   {
       if ( light_s )
       { 
           light_s = FALSE;
 
           // fullbright doesn't have anything to do with light in NEW(2006?) lighting model 
           // setting fullbright does look good though
           llSetPrimitiveParams([PRIM_FULLBRIGHT,ALL_SIDES,FALSE]);
 
           llSetPrimitiveParams([PRIM_POINT_LIGHT, FALSE,   // if this is false, light is off,
                                    <0.0,1.0,0.0>,1.0, 10.0, 0.5]); // rest of params don't matter
       }            
       else
       {
           light_s = TRUE;
           //llSetPrimitiveParams([PRIM_FULLBRIGHT,ALL_SIDES,TRUE]);   //leave fullbright commented for now
           llSetPrimitiveParams([PRIM_POINT_LIGHT,TRUE,
                                   <1.0,0.7,1.0>,  // light color vector range: 0.0-1.0 *3
                                   1.0,            // intensity    (0.0-1.0)
                                   10.0,           // radius       (.1-10.0)
                                   0.6 ]);         // falloff      (.01-1.0)
 
           // this could have been done in one line, like this     
           //llSetPrimitiveParams([PRIM_FULLBRIGHT,ALL_SIDES,FALSE,PRIM_POINT_LIGHT,TRUE,<1.0,1.0,0.5>,20,1.0,0.5]);
           //      ... but thats kinda hard to take in...       
       }
       //llSay(0, " Click!");
   }
 
}