2007年11月05日
明かりの続き

前回に続いて明かりをやります。明かりを3つ用意しました。左側が電球を球体から作ったものに変えて、リンクしたスタンド。真ん中と右が単独の球体。
一番左と真ん中の電球にタイマーイベントを入れてみました。10秒経つと消えるようにしました。
default{
state_entry(){
llSetPrimitiveParams([PRIM_POINT_LIGHT,FALSE,<0.0,0.0,0.0>,0.0,0.0,0.0]);
}
touch_start(integer detected){
state green;
}
}
state green{
state_entry(){
llSetPrimitiveParams([PRIM_POINT_LIGHT,TRUE,<0.0,1.0,0.0>,1.0,5.0,1.0]);
llSetTimerEvent(10);
}
touch_start(integer detected){
state default;
}
timer(){
llSetTimerEvent(0);
state default;
}
}

で、つけたり消したりしたのですが、あいかわらず反応が悪いです。一番右の単独の単に緑色の明かりをつけるだけのものでも遅延(ラグ)があります。しかし、一番左のリンクしたものと、真ん中の単独のものは、もっと反応が悪いです。前回書いたように、光はついても、表面が明るくならなかったり、消しても、表面はついたままになっています。写真のスタンドは、消しているけど表面は明るいままの状態のやつです。しかも、一番右の反応のいいものをつかって、つけたり消したりをすると、それに連動して表面がついたり消えたりします。ここで、整理すると、タッチするというスイッチによって光源(いわゆる光)はちゃんと反応してついたり消えたりします。それは近くのオブジェクトの表面に反映されるので確認できます。しかし、その次に、オブジェクトの表面が明るくなるのはラグが生じて反応しません。そのラグは、他の明かりをつけたり消したりによって表面が明るくなったり消えたりするのに連動して解消されます。

次は、色を赤、緑、青(いわゆるRGB)の順にさわるたびに変化していく明かりをつくります。参考にしたのは、miz さんの初級スクリプト講座第6回です。
ユーザー定義関数がでてくるので、少し理解できなくなってくるのですが、自分なりに勝手に解釈して作ってみました。
light(vector color){
llSetPrimitiveParams([PRIM_POINT_LIGHT,TRUE,color,1.0,5.0,1.0]);
}
integer counter;
default{
state_entry(){
light(ZERO_VECTOR);
counter=0;
}
touch_start(integer detected){
counter=counter+1;
if(counter==1){
light(<1.0,0.0,0.0>);
}
else if(counter==2){
light(<0.0,1.0,0.0>);
}
else if(counter==3){
light(<0.0,0.0,1.0>);
}
else{
light(ZERO_VECTOR);
counter=0;
}
}
}
最初、light という明かりの色によって変化するユーザー定義関数の color という引数(ひきすう)を、最初に単独で vector color; というように定義したのですが、シンタックスエラーになってしまいました。引数のとこで、型を定義しないとだめなようです。
だいたい、引数という字を「ひきすう」と読むなんて知りませんでした^^ 引用するはいんと読むだろと思ってずっと「いんすう」と読んでいました。独学の場合、ことばとして誰かに発音されることがないので、間違った読みのままずっといってしまうことがよくあると思います。パソコン用語でもなんと読むんだろというのが多すぎます。IEEE ってなんと読みます?
それはともかく、プログラムにもどると、このままちゃんと動作するのですが、いつもついたままです。ただし消えているときは、黒く(光らないで)ですが。省エネになっていないのかな? よくわからないのですが、消すということを入れると、
light(vector color){
if(color==ZERO_VECTOR){
llSetPrimitiveParams([PRIM_POINT_LIGHT,FALSE,ZERO_VECTOR,0.0,0.0,0.0]);
}
else{
llSetPrimitiveParams([PRIM_POINT_LIGHT,TRUE,color,1.0,5.0,1.0]);
}
}
integer counter;
default{
state_entry(){
light(ZERO_VECTOR);
counter=0;
}
touch_start(integer detected){
counter=counter+1;
if(counter==1){
light(<1.0,0.0,0.0>);
}
else if(counter==2){
light(<0.0,1.0,0.0>);
}
else if(counter==3){
light(<0.0,0.0,1.0>);
}
else{
light(ZERO_VECTOR);
counter=0;
}
}
}
となります。関数の定義のところで、if 文を使って条件分岐させて定義したりしていてちょっととまどいました。
counter はカウントする変数です。counter = counter + 1 は counter++ でもいいです。
変数とか関数という数学ででてきた言葉と同じものを使うので、はじめのうちは混乱するかもしれません。しかも変数名に英単語を使っているので、余計にこれなにって感じになります。=(イコール)も代入に使っています。論理的に同じというのは、= = という風に二つ重ねます。関数は数字の計算だけでなく一般的な処理を指します。というように、慣れるまでとまどうと思います。
こっちの、順に色を変化させる方は、そんなに気になるほどラグがありませんでした。いろいろな条件で変化するので、かなりわかりずらいです。まあ、実際にスクリプトを組んだら、オブジェクトに入れていろいろ動作させて満足なものが得られるのかどうかを検証する以外になさそうです。

ふと、環境設定で、近隣のローカルライトをオン・オフにする設定があるのを思い出しました。(9月28日のブログに出ています。)
写真は、近隣のローカルライトをオフにしています。すなわち、光源を光らすというのと、表面を光らすというのは、クライアント側(自分のパソコン上)で別々に実現しているということです。だから条件によってラグがでてくるのだと思われます。

ちなみに、これが、近隣のローカルライトをオンにした状態です。
実証主義を貫くつもりですが、なんか疲れますw
Posted by ねこねこ at 23:38│Comments(0)
│スクリプト