2007年04月09日
パーティクル
小技というわけではありませんが、パーティクルシステムについては設定すべきパラメータが非常に多く、わかりにくいという声をしばしば聞きます。
ですので今回はパーティクルシステムの解説とサンプル・スクリプトを書いておくことにします。
ですので今回はパーティクルシステムの解説とサンプル・スクリプトを書いておくことにします。
概要
パーティクルとは粒子のことです。
SLのパーティクルシステムは、煙や火、水しぶきなどの粒子を表現するための仕組みのことを言います。
スクリプトを使う以外にパーティクルを制御する方法はありません。
従って、粒子を使った表現をしようと思ったら、パーティクルシステムのスクリプトを使わなければなりません。
よく見かけるパーティクルを列挙してみましょう。
・煙、霧
・水しぶき、噴水の水、滝
・炎、火花、爆発、花火
・花吹雪、落ち葉
・雨、雪
・血しぶき
・鎖
・メガネなどのきらめき(キラーン)
・音符(MIZMIの楽器は弾くと音符が漂います)
・足跡
などなど。
パーティクルだと気がつかなくても、誰もが一度は目にしていると思います。
パーティクルの関数
パーティクルシステムを制御する関数は一つだけです。
llParticleSystem(list param);
この関数は引数にlistを取り、listの中に非常に多くのパラメータを設定します。
パーティクルを消すときには空のlistを渡します。
llParticleSystem([]);
パーティクルライブラリ
パラメータが異様に多いパーティクルシステムですが、使い方は単純なので誰が書いても似たようなコードになります。
逆に、パーティクルは常に似たようなコードになるため、ライブラリ化しておいたほうが便利です。
用途に応じてパラメータを変えるだけですから(^^;
私が使っているパーティクル用関数を載せておきます。
このユーザー関数はbool型(integer型)の引数を取ります。
SetParticle(TRUE)でパーティクルON、SetParticle(FALSE)でパーティクルOFFです。
以下のコードは、タッチするたびにON/OFFを切り替えます。
パラメータの説明
私のコードでは、パーティクルの各パラメータ用にグローバル変数を用意しています。
各変数の値を変更するとパーティクルの動作が変わってきますので、どの変数がどんな意味を持つのか、以下に説明します。
パーティクルに関してはこれが肝でしょう(^^;
っていうか、これ以外には難しいところは何もありません。
【マスク・パラメータ】
パーティクルの動きに関して、何をコントロールするのかを指定するためのパラメータです。
以下のようなものがあります。
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がありますので紹介しておきます。
各パラメータをどのように変えたらどうなるか、それぞれについて実際のパーティクルの動きが展示されていて、とても参考になります。
The Particle Laboratory
/teal/197/46/21/
応用編
「パーティクルの色をもっと派手に変えたい」
とか、
「異なるテクスチャを使ったパーティクルを連続して出したい」
などの要望がありますので、最後に例として色を次々に変えるパーティクルの実装コードを載せておきます。
2秒ごとにcounterの値をインクリメントさせ、2以上になったら0に戻します。
counterが0のときは赤、1のときは緑、2のときは青のパーティクルを発生させます。
パーティクルとは粒子のことです。
SLのパーティクルシステムは、煙や火、水しぶきなどの粒子を表現するための仕組みのことを言います。
スクリプトを使う以外にパーティクルを制御する方法はありません。
従って、粒子を使った表現をしようと思ったら、パーティクルシステムのスクリプトを使わなければなりません。
よく見かけるパーティクルを列挙してみましょう。
・煙、霧
・水しぶき、噴水の水、滝
・炎、火花、爆発、花火
・花吹雪、落ち葉
・雨、雪
・血しぶき
・鎖
・メガネなどのきらめき(キラーン)
・音符(MIZMIの楽器は弾くと音符が漂います)
・足跡
などなど。
パーティクルだと気がつかなくても、誰もが一度は目にしていると思います。
パーティクルの関数
パーティクルシステムを制御する関数は一つだけです。
llParticleSystem(list param);
この関数は引数にlistを取り、listの中に非常に多くのパラメータを設定します。
パーティクルを消すときには空のlistを渡します。
llParticleSystem([]);
パーティクルライブラリ
パラメータが異様に多いパーティクルシステムですが、使い方は単純なので誰が書いても似たようなコードになります。
逆に、パーティクルは常に似たようなコードになるため、ライブラリ化しておいたほうが便利です。
用途に応じてパラメータを変えるだけですから(^^;
私が使っているパーティクル用関数を載せておきます。
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([]);
}
}
このユーザー関数はbool型(integer型)の引数を取ります。
SetParticle(TRUE)でパーティクルON、SetParticle(FALSE)でパーティクルOFFです。
以下のコードは、タッチするたびにON/OFFを切り替えます。
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がありますので紹介しておきます。
各パラメータをどのように変えたらどうなるか、それぞれについて実際のパーティクルの動きが展示されていて、とても参考になります。
The Particle Laboratory
/teal/197/46/21/
応用編
「パーティクルの色をもっと派手に変えたい」
とか、
「異なるテクスチャを使ったパーティクルを連続して出したい」
などの要望がありますので、最後に例として色を次々に変えるパーティクルの実装コードを載せておきます。
integer counter=0;
(中略)
state on {
state_entry() {
SetParticle(TRUE);
llSetTimerEvent(2.0);
}
touch_start(integer detected) {
llSetTimerEvent(0.0);
state off;
}
timer(){
counter ++;
if (counter == 0){
PART_START_COLOR = <1.0,0.0,0.0>;
PART_END_COLOR = <0.5,0.0,0.0>;
} else if (counter == 1){
PART_START_COLOR = <0.0,1.0,0.0>;
PART_END_COLOR = <0.0,0.5,0.0>;
} else {
PART_START_COLOR = <0.0,0.0,1.0>;
PART_END_COLOR = <0.0,0.0,0.5>;
counter = 0;
}
SetParticle(TRUE);
}
}
2秒ごとにcounterの値をインクリメントさせ、2以上になったら0に戻します。
counterが0のときは赤、1のときは緑、2のときは青のパーティクルを発生させます。
タグ :パーティクル
Posted by Miz at 17:07│Comments(1)
│スクリプト小技
この記事へのトラックバック
パーティクルテクスチャをグレードアップしてのAOパーティクリングの図
AO(アニメーションオーバーライド)パーティクリングの試みその2で成功!で完成スクリプ【Rinsui SL+ Making Blog】at 2007年08月04日 23:10
ずっと同じことばかりに取り組んでると飽きるので、息抜きに他のにも挑戦。単純なパーティクルを作ってみました。黒い羽根が舞い散ります。・・・普段着でごめんなさいw写真でつけて...
黒羽根パーティクル【Elly's days in SL】at 2008年03月16日 23:25
クリスマスにあわせてタイムアタックに挑戦しました。なんとか出来上がりました。アイコンを描き始めてから正味で三日ですので、だいぶ速くなりました。REZ時よりお世話になってき...
パーティクル製造機【一日一膳腹八分目】at 2009年12月25日 17:33
この記事へのコメント
初めまして、単純な質問ですいません、スライドドアを作りましたが、音のスクリプトを入れたいのですが分かりません、おねがいします。
Posted by Tarti at 2009年03月16日 10:01