Makapu様:llParticleSystem() / BuckUp


Makapu様llParticleSystem()

Top > llParticleSystem() > Makapu様:llParticleSystem()/BuckUp

サンプルコード

integer PART_BOUNCE_MASK=0; // PSYS_PART_BOUNCE_MASK
integer PART_EMISSIVE_MASK=PSYS_PART_EMISSIVE_MASK;
integer PART_FOLLOW_SRC_MASK=0; // PSYS_PART_FOLLOW_SRC_MASK
integer PART_FOLLOW_VELOCITY_MASK=0; // PSYS_PART_FOLLOW_VELOCITY_MASK 
integer PART_INTERP_COLOR_MASK=PSYS_PART_INTERP_COLOR_MASK ;
integer PART_INTERP_SCALE_MASK=PSYS_PART_INTERP_SCALE_MASK;
integer PART_TARGET_LINEAR_MASK=0; // PSYS_PART_TARGET_LINEAR_MASK
integer PART_TARGET_POS_MASK=0; // PSYS_PART_TARGET_POS_MASK 
integer PART_WIND_MASK=PSYS_PART_WIND_MASK ;

integer PART_PATTERN = PSYS_SRC_PATTERN_EXPLODE ;
  //PSYS_SRC_PATTERN_ANGLE 
  //PSYS_SRC_PATTERN_ANGLE_CONE
  //PSYS_SRC_PATTERN_ANGLE_CONE_EMPTY
  //PSYS_SRC_PATTERN_DROP 

float PART_START_ALPHA = 1.0;
float PART_END_ALPHA = 0.0;
vector PART_START_COLOR = <1.0,1.0,1.0>;
vector PART_END_COLOR = <0.6,0.6,0.6>;
vector PART_START_SCALE = <0.32,0.32,0.0>;
vector PART_END_SCALE = <4.0,4.0,0.0>;
float SRC_MAX_AGE = 0.0;
float PART_MAX_AGE = 4.5 ;
vector PART_ACCEL = <0.0,0.0,0.2>;
float PART_ANGLE_BEGIN = PI ;
float PART_ANGLE_END = PI ;
integer PART_BURST_COUNT = 4 ;
float PART_BURST_RADIUS = 0.0 ;
float PART_BURST_RATE = 0.0 ;
float PART_BURST_SPEED_MIN = 0.2 ;
float PART_BURST_SPEED_MAX = 0.3 ;
vector PART_OMEGA = <0.0,0.0,0.0> ;
string PART_TEXTURE = "part_sound" ;
key PART_TARGET_KEY = NULL_KEY ;

SetParticle(integer on){
  if (on){
    llParticleSystem(
    [  PSYS_PART_FLAGS , PART_BOUNCE_MASK |
        PART_EMISSIVE_MASK |
        PART_FOLLOW_SRC_MASK |
        PART_FOLLOW_VELOCITY_MASK |
        PART_INTERP_COLOR_MASK |
        PART_INTERP_SCALE_MASK |
        PART_TARGET_LINEAR_MASK |
        PART_TARGET_POS_MASK |
        PART_WIND_MASK
      ,PSYS_SRC_PATTERN, PART_PATTERN
      ,PSYS_PART_START_ALPHA, PART_START_ALPHA 
      ,PSYS_PART_END_ALPHA, PART_END_ALPHA 
      ,PSYS_PART_START_COLOR, PART_START_COLOR
      ,PSYS_PART_END_COLOR, PART_END_COLOR 
      ,PSYS_PART_START_SCALE, PART_START_SCALE 
      ,PSYS_PART_END_SCALE, PART_END_SCALE 
      ,PSYS_SRC_MAX_AGE, SRC_MAX_AGE
      ,PSYS_PART_MAX_AGE, PART_MAX_AGE
      ,PSYS_SRC_ACCEL, PART_ACCEL 
      ,PSYS_SRC_ANGLE_BEGIN, PART_ANGLE_BEGIN
      ,PSYS_SRC_ANGLE_END, PART_ANGLE_END 
      ,PSYS_SRC_BURST_PART_COUNT, PART_BURST_COUNT 
      ,PSYS_SRC_BURST_RADIUS, PART_BURST_RADIUS 
      ,PSYS_SRC_BURST_RATE, PART_BURST_RATE 
      ,PSYS_SRC_BURST_SPEED_MIN, PART_BURST_SPEED_MIN 
      ,PSYS_SRC_BURST_SPEED_MAX, PART_BURST_SPEED_MAX 
      ,PSYS_SRC_OMEGA, PART_OMEGA 
      ,PSYS_SRC_TEXTURE, PART_TEXTURE 
      ,PSYS_SRC_TARGET_KEY, PART_TARGET_KEY
    ]);
  }else{
    llParticleSystem([]);
  }
}

default {
  state_entry() {
    state off; 
  }
}

state on {
  state_entry() {
    SetParticle(TRUE);
  }

  touch_start(integer detected) {
    state off;
  }
}

state off {
  state_entry() {
    SetParticle(FALSE);
  }
  
  touch_start(integer detected) {
    state on;
  }
}

パラメータの説明

私のコードでは、パーティクルの各パラメータ用にグローバル変数を用意しています。 各変数の値を変更するとパーティクルの動作が変わってきますので、どの変数がどんな意味を持つのか、以下に説明します。 パーティクルに関してはこれが肝でしょう(^^; っていうか、これ以外には難しいところは何もありません。

【マスク・パラメータ】

パーティクルの動きに関して、何をコントロールするのかを指定するためのパラメータです。 以下のようなものがあります。

integer PART_BOUNCE_MASK=0; // PSYS_PART_BOUNCE_MASK

バウンスマスク。 有効にするときはPSYS_PART_BOUNCE_MASKをセット、無効にするときは0です。 バウンスは「ぼよんぼよん」ですが(謎)、このマスクを使用すると、オブジェクトのZ軸の高さより下にパーティクルが行かなくなります。

integer PART_EMISSIVE_MASK=PSYS_PART_EMISSIVE_MASK;

エミッシブマスク。 有効にするときはPSYS_PART_EMISSIVE_MASKをセット、無効にするときは0です。 有効にするとパーティクルが光ります。きらきら〜。

integer PART_FOLLOW_SRC_MASK=0; // PSYS_PART_FOLLOW_SRC_MASK

フォローマスク。 有効にするときはPSYS_PART_FOLLOW_SRC_MASKをセット、無効にするときは0です。 オブジェクトと一緒にパーティクルが動くかどうかです。 有効にすると、オブジェクトの動きにあわせてパーティクルも動きます=パーティクルの動きはオブジェクトに対して相対的になります。 このマスクはBURST_RADIUS(後述)と同時には使えません。

integer PART_FOLLOW_VELOCITY_MASK=0; // PSYS_PART_FOLLOW_VELOCITY_MASK

ベロシティマスク。 有効にするときはPSYS_PART_FOLLOW_VELOCITY_MASKをセット、無効にするときは0です。 パーティクルが回転するようになります。

integer PART_INTERP_COLOR_MASK=PSYS_PART_INTERP_COLOR_MASK ;

カラーマスク。 有効にするときはPSYS_PART_INTERP_COLOR_MASKをセット、無効にするときは0です。 パーティクルの色が変わるようになります。 どのように色を変えるかは後述のPART_START_COLORとPART_END_COLORで指定します。

integer PART_INTERP_SCALE_MASK=PSYS_PART_INTERP_SCALE_MASK;

スケールマスク。 有効にするときはPSYS_PART_INTERP_SCALE_MASKをセット、無効にするときは0です。 パーティクルのサイズが変わるようになります。 サイズの指定は後述のPART_START_SCALEとPART_END_SCALEで行います。

integer PART_TARGET_LINEAR_MASK=0; // PSYS_PART_TARGET_LINEAR_MASK

ターゲットライナーマスク。 有効にするときはPART_TARGET_LINEAR_MASKをセット、無効にするときは0です。 パーティクルがターゲット(PART_TARGET_KEYで指定)に向かって一直線に飛んでいくようになります。 奴隷さんの首輪の鎖なんかに使われています。 このマスクはパーティクルの移動を制限しますので、後述のPART_ACCELやPART_BURST_RADIUSの設定は無効になります。

integer PART_TARGET_POS_MASK=0; // PSYS_PART_TARGET_POS_MASK

ターゲットマスク。 有効にするときはPART_TARGET_POS_MASKをセット、無効にするときは0です。 パーティクルがターゲット(PART_TARGET_KEYで指定)に向かって飛んでいくようになります。 ホーミングミサイルのような動きになります。

integer PART_WIND_MASK=PSYS_PART_WIND_MASK ;

ウインドマスク。 有効にするときはPSYS_PART_WIND_MASKをセット、無効にするときは0です。 パーティクルが風に流されるかどうかです。 有効にすると風に吹かれてパーティクルが飛んでいきます。

【パターン・パラメータ】

integer PART_PATTERN = パターン定数 ;

パーティクルの発生の形状を決めるパラメータです。 以下の値のうち一つの定数を選んで使います。

PSYS_SRC_PATTERN_EXPLODE

爆発型です。 四方八方にパーティクルが飛び散ります。

PSYS_SRC_PATTERN_ANGLE

平面型。 PART_ANGLE_BEGINとPART_ANGLE_ENDで指定される扇形(もしくはV字系)にパーティクルを噴射します。

PSYS_SRC_PATTERN_ANGLE_CONE

コーン型。 PART_ANGLE_BEGINとPART_ANGLE_ENDで指定されるコーン状にパーティクルを噴射します。

PSYS_SRC_PATTERN_ANGLE_CONE_EMPTY

逆コーン型。 PSYS_SRC_PATTERN_ANGLE_CONEの逆パターンです。 デス・スター型とでもいいましょうか・・・。

PSYS_SRC_PATTERN_DROP

ドロップ型。 その場にパーティクルをポトンと落とします。

【その他詳細パラメータ】

float PART_START_ALPHA = 1.0; float PART_END_ALPHA = 0.0;

パーティクルの透明度を指定します。 一つのパーティクルが発生してから消滅するまでの透明度の変化具合です。 上記の例では、発生時には完全不透明(1.0)、消滅時には完全透明(0.0)ですので、パーティクルは徐々に薄れて消えていくように見えます。

vector PART_START_COLOR = <1.0,1.0,1.0>; vector PART_END_COLOR = <0.6,0.6,0.6>;

パーティクルの色を指定します。 カラーマスク(PART_INTERP_COLOR_MASK)が有効でなければなりません。 指定しているvector値はRGBです。 念のために書いておきますが、<1.0,1.0,1.0>が白、<0.0,0.0,0.0>が黒です。 赤は<1.0,0.0,0.0>、緑は<0.0,1.0,0.0>、青は<0.0,0.0,1.0>です。 パーティクルはPART_START_COLORからPART_END_COLORへと徐々に変化するように見えます。

vector PART_START_SCALE = <0.32,0.32,0.0>; vector PART_END_SCALE = <4.0,4.0,0.0>;

パーティクルのサイズです。 単位はmで、XとYの値のみ有効になります(パーティクルは常に二次元に見えるため)。 最小値は0.03125、最大値は4.0です。 スケールマスク(PART_INTERP_SCALE_MASK)が有効でなければなりません。 パーティクルはPART_START_SCALEからPART_END_SCALEまで大きさが変わっていきます。

float SRC_MAX_AGE = 0.0;

パーティクルシステムの有効時間です。 単位は秒で、例えばこの値が10.0だと、オブジェクトは10秒間パーティクルを噴射し続けます。 10秒経つとパーティクルの噴射は止まりますが、パーティクルシステムそのものがOFFになるわけではありません。 その証拠に、一度その場を離れ、再びオブジェクトのところに戻ってくると、再び10秒間パーティクルが噴射されます。 0にすると永久にパーティクルを噴射します。

float PART_MAX_AGE = 4.5 ;

一つのパーティクルの有効時間です。 単位は秒で、最大30秒です。 透明度や色、サイズはこの秒数の間に変化しますので、例えば1秒とかだと一瞬で色やサイズが変わり、パーティクルは消えます。

vector PART_ACCEL = <0.0,0.0,0.2>;

パーティクルの加速度です。 単位はmで、X,Y,Zのvectorで指定します。 最小値は0.0078125(これ以下だと0と同じ)、最大値は100です。 各パーティクルはこのパラメータで指定された方向に動いていきます。 上記の例では少しずつ上へと漂っていきます。

float PART_ANGLE_BEGIN = PI ; float PART_ANGLE_END = PI ;

アングルパターン(PSYS_SRC_PATTERN_ANGLE、PSYS_SRC_PATTERN_ANGLE_CONE、PSYS_SRC_PATTERN_ANGLE_CONE_EMPTYの各パターン)の開始及び終了角度の指定です。 単位はラジアン。

integer PART_BURST_COUNT = 4 ;

一度にいくつのパーティクルを噴射するかです。

float PART_BURST_RADIUS = 0.0 ;

パーティクルを噴射するときの半径です。 フォローマスク(PART_FOLLOW_SRC_MASK)と一緒には使えません。 例えばこの値に1.0を指定すると、オブジェクトの中心から1m離れた位置にパーティクルが噴射されます。

float PART_BURST_RATE = 0.0 ;

どのくらいの間隔でパーティクルを噴射するかです。 単位は秒で、0.0は連続して噴射します。

float PART_BURST_SPEED_MIN = 0.2 ; float PART_BURST_SPEED_MAX = 0.3 ;

噴射されるときの最小スピードと最大スピードです。 仮にこの値を両方0にして、PART_ACCELもゼロにすると、パーティクルは噴射された位置から動きません。

vector PART_OMEGA = <0.0,0.0,0.0> ;

パーティクルの噴射方向を回転させます。 アングルパターン(PSYS_SRC_PATTERN_ANGLE、PSYS_SRC_PATTERN_ANGLE_CONE、PSYS_SRC_PATTERN_ANGLE_CONE_EMPTYの各パターン)のときに有効です。

string PART_TEXTURE = "part_sound" ;

パーティクルのテクスチャを指定します。 UUIDでの指定も可です。

key PART_TARGET_KEY = NULL_KEY ;

パーティクルが飛んでいくターゲットのキー(UUID)を指定します。 ターゲットマスク(PART_TARGET_POS_MASK)かターゲットライナーマスク(PART_TARGET_LINEAR_MASK)を使っているときに有効です。

以上のパラメータの組み合わせによって、パーティクルで様々なものを表現可能です。 実際に試してもらうのが一番わかりやすいと思いますが、パーティクルの素晴らしいSIMがありますので紹介しておきます。 各パラメータをどのように変えたらどうなるか、それぞれについて実際のパーティクルの動きが展示されていて、とても参考になります。