セカCHU☆

SecondLifeのこと

足跡ってこんなの?

2008年06月02日 01時00分12秒 | セカンドライフのすくりぷと
お友達から質問されたので、足跡発生装置を作ってみたよ


rez禁止のトコロでも使えるように、particleで作ってみたんだぁ。
一定時間ごとにparticleを出せばいいというのはスグ分かったんだけど、なかなか出した所に止まったままになるparticleが出来ません
webを探しても、あんまりそういうscriptの説明も無いみたい。うーん。
何時間かパラメータをいじってみて、原因判明
PSYS_SRC_ACCEL と PSYS_SRC_BURST_SPEED_MIN と PSYS_SRC_BURST_SPEED_MAX の数値を0にしても、PSYS_PART_FOLLOW_VELOCITY_MASKを指定してたらparticleが表示されないみたいだよ。
VELOCITY_MASKを指定すると、必ず動いてなきゃいけないようです。
どこにも書いてないけれど、排他パラメータだねこれって

出した位置で止まったままのscriptが出来れば、あとは左と右を一定間隔で出すだけだよね。
なるべく歩いたときに足元の高さをキープできるように、chestに箱を2つ装着して
最初に、右足scriptにだけsleep0.5秒入れてみたけれど、上手く均等に足跡が付きませんでした。
wearするのは同時のタイミングでも、scriptが動き始めるのは同時じゃないんだねー。
今回は安易にtimerイベント使っちゃったけど、もっと他にいい方法があるんじゃないかなぁ。

試作品はこんなふうになりました
欠点といえば、timerイベント使ってるから少し負荷を掛けちゃう事と、
particleは常に正面に見えちゃうから、地面に近い位置から見た時に影が立ってるように見えちゃう事かな。
それ以前に、足跡のしくみってこれで合ってたんでしょうか


ルートプリムの左足scriptだよ
float KANKAKU = 0.5;     // 1po ni kakaru jikan (sec)
integer NAGASA = 10;     // asiato nokoru jikan (sec)

integer NUM = 1;

default
{
    state_entry()
    {     
      llSetTimerEvent(KANKAKU);
    }
   
    timer(){
      llMessageLinked(NUM,NAGASA,"","");
      if (NUM == 1) {
          NUM = 2;
      } else {
          NUM = 1;
      }
    }
   
    link_message(integer sendnum,integer num, string str, key id){
        llParticleSystem(
        [  PSYS_PART_FLAGS , (  0 |
            PSYS_PART_INTERP_COLOR_MASK |
            PSYS_PART_INTERP_SCALE_MASK
            )
           ,PSYS_SRC_PATTERN, PSYS_SRC_PATTERN_ANGLE
           ,PSYS_PART_START_ALPHA, 1.0
           ,PSYS_PART_END_ALPHA, 1.0
           ,PSYS_PART_START_COLOR, <0.0, 0.0, 0.0>
           ,PSYS_PART_END_COLOR, <0.0, 0.0, 0.0>
           ,PSYS_PART_START_SCALE, <0.1, 0.1, 0.1> // particle ookisa
           ,PSYS_PART_END_SCALE, <0.1, 0.1, 0.1>   // particle ookisa
           ,PSYS_SRC_MAX_AGE, 0.5                      
           ,PSYS_PART_MAX_AGE, (float)num
           ,PSYS_SRC_ACCEL, <0,0,0>
           ,PSYS_SRC_ANGLE_BEGIN, PI
           ,PSYS_SRC_ANGLE_END, PI
           ,PSYS_SRC_OMEGA, <0.0, 0.0, 0.0>
           ,PSYS_SRC_BURST_PART_COUNT, 1    // asiato kazu(ikutu?)
           ,PSYS_SRC_BURST_RATE, 1.0        // asiato kankaku(nan byou?)
           ,PSYS_SRC_BURST_SPEED_MIN, 0.0
           ,PSYS_SRC_BURST_SPEED_MAX, 0.0
           ,PSYS_SRC_TEXTURE,"asiato-dogL"  // asiato texture namae
        ]);
    }
}

右足scriptだよ
default
{
    state_entry()
    {

    }
   
    link_message(integer sendnum,integer num,string str, key id){
        llParticleSystem(
        [  PSYS_PART_FLAGS , (  0 |
           PSYS_PART_INTERP_COLOR_MASK |
           PSYS_PART_INTERP_SCALE_MASK
           )
          ,PSYS_SRC_PATTERN, PSYS_SRC_PATTERN_ANGLE
          ,PSYS_PART_START_ALPHA, 1.0
          ,PSYS_PART_END_ALPHA, 1.0
          ,PSYS_PART_START_COLOR, <0.0, 0.0, 0.0>
          ,PSYS_PART_END_COLOR, <0.0, 0.0, 0.0>
          ,PSYS_PART_START_SCALE, <0.1, 0.1, 0.1> // particle ookisa
          ,PSYS_PART_END_SCALE, <0.1, 0.1, 0.1>   // particle ookisa
          ,PSYS_SRC_MAX_AGE, 0.5                      
          ,PSYS_PART_MAX_AGE, (float)num
          ,PSYS_SRC_ACCEL, <0,0,0>
          ,PSYS_SRC_ANGLE_BEGIN, PI
          ,PSYS_SRC_ANGLE_END, PI
          ,PSYS_SRC_OMEGA, <0.0, 0.0, 0.0>
          ,PSYS_SRC_BURST_PART_COUNT, 1   // asiato kazu(ikutu?)
          ,PSYS_SRC_BURST_RATE, 1.0       // asiato kankaku(nan byou?)
          ,PSYS_SRC_BURST_SPEED_MIN, 0.0
          ,PSYS_SRC_BURST_SPEED_MAX, 0.0
          ,PSYS_SRC_TEXTURE,"asiato-dogR"  // asiato texture namae
        ]);
    }
}

scriptここまでー