ソラマメブログ
プロフィール
ねこねこ
ねこねこ
QRコード
QRCODE
アクセスカウンタ
読者登録
メールアドレスを入力して登録する事で、このブログの新着エントリーをメールでお届けいたします。解除は→こちら
現在の読者数 1人
オーナーへメッセージ

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



タグ :スクリプト

同じカテゴリー(スクリプト)の記事画像
パーティクルの復習^^ ほたるの光^^ 
物理そしてビークル
ライブ見たよ&llSetPos()卒業制作
llRezObject を使ってスカイボックス出現
パーティクル-その2
パーティクル
同じカテゴリー(スクリプト)の記事
 パーティクルの復習^^ ほたるの光^^  (2008-08-07 21:15)
 物理そしてビークル (2008-03-07 23:34)
 ライブ見たよ&llSetPos()卒業制作 (2008-02-22 01:05)
 llRezObject を使ってスカイボックス出現 (2008-01-26 15:38)
 パーティクル-その2 (2007-11-20 19:07)
 パーティクル (2007-11-17 10:44)
Posted by ねこねこ at 23:38│Comments(0)スクリプト
上の画像に書かれている文字を入力して下さい
 
<ご注意>
書き込まれた内容は公開され、ブログの持ち主だけが削除できます。