LlParticleSystem/ja
LSL ポータル | 関数 | イベント | 型 | 演算子 | 定数 | 実行制御 | スクリプトライブラリ | カテゴリ別スクリプトライブラリ | チュートリアル |
要約
関数: llParticleSystem( list <span title="パーティクルシステムルール一覧のフォーマット[ rule1, data1, rule2, data2 . . . ルール、データ ]" style="border-bottom:1px dotted; cursor:help;">rules );
仕様
プリム内にあるスクリプトに含まれているパーティクルエミッターの状態を設定するパーティクルシステムを定義します。この関数を同じプリムにあるいずれか他のスクリプトが呼んでいる場合、同一のパーティクルエミッターの状態として修正するでしょう。 各プリムは幾何学中心を中心とした、ひとつのパーティクルエミッターのみ所有でき、 プリムの有効なZ方向に指向する、ローカルZ軸に沿って並びます。
この関数は、プリムのパーティクルエミッターの状態を更新するだけのものです。エミッターを異なる状態に変更したいなら(たとえば、異なるパーティクルシステム全体を分散させる、あるいはエミッターを完全にオフにする)、 代わりに描写したい新しいパーティクルシステムのパラメータでこの関数を呼ぶだけです。空のリストを指定するとエミッターはオフに切り替わります。
パーティクルは基本的に2Dのスプライトで、常にビューアのカメラ表面に描写されます。
ルール/データは以下に定義されます。
ルール / 定型値 | 型 | 説明 | 値 | |
システムの動作 | ||||
PSYS_PART_FLAGS | integer | 様々なフラグがパーティクルシステムの動作を操作します。値は小数点の数値あるいは16進法、あるいは同時に一つ以上の、以下のフラグ定型(|演算子を用る)で指定されるかもしれません。 | 0 | |
値 | PSYS_PART_BOUNCE_MASK | 設定時、指定のパーティクルがエミッターのZの高さでのリージョン面で跳ね返るでしょう。"跳ね返る"上で、各パーティクルは重心とアングルが逆向きになります。これは面より下に落下するパーティクルに限定の動きです。 | 0x004 | |
PSYS_PART_EMISSIVE_MASK | 設定時、パーティクルは完全に明るい状態で、グローバルライティング(太陽光)に左右されません。 そのほかの場合では、パーティクルは標準のグローバルライティングを加えている状態で発光されるでしょう。部分的な光は、パーティクルを非放射状に照らします。 | 0x100 | ||
PSYS_PART_FOLLOW_SRC_MASK | 設定時、パーティクルはエミッターの位置と相対的に動きます。そのほかの場合では、パーティクルの位置と動きはエミッターの位置/動きには左右されません。このフラグはPSYS_SRC_BURST_RADIUS ルールでは無効です。 | 0x010 | ||
PSYS_PART_FOLLOW_VELOCITY_MASK | 設定時、パーティクルは動きあるいは拡散の方向に上向きで適応して回転します。そのほかの場合では、標準のエミッターの回転を基準として常に放散されます。 | 0x020 | ||
PSYS_PART_INTERP_COLOR_MASK | 設定時、パーティクルの色とアルファが、パーティクルの効果時間中、開始設定から終了設定へと変換します。変換はスムーズに補完されます。 | 0x001 | ||
PSYS_PART_INTERP_SCALE_MASK | 設定時、パーティクルの大きさと形状が、パーティクルの効果時間中、開始設定から終了設定へと変換します。 | 0x002 | ||
PSYS_PART_TARGET_LINEAR_MASK | (非公式な追記) 設定時、放散したパーティクルがPSYS_SRC_TARGET_KEYで指定された対象に向かって一直線に移動します。このモードで、PSYS_SRC_ACCEL、PSYS_SRC_BURST_RADIUS、そして場合によってはほかのルールが排除されます。 | 0x080 | ||
PSYS_PART_TARGET_POS_MASK | 設定時、放散したパーティクルが有効時間中にPSYS_SRC_TARGET_KEYルールで指定された対象に向かって、移動を調整してコースが変わります。対象が指定されていない場合、範囲外に移動した場合、あるいは有効ではない対象が指定された場合、パーティクルは発散しているプリム自身を対象にします。 | 0x040 | ||
PSYS_PART_WIND_MASK | 設定時、パーティクルの動きは風に影響されます。 パーティクル上で、補助的な効力として作用されます。 | 0x008 | ||
(未実装) 隠されていますが、リストにあります。 | 0x200 | |||
パーティクルを除去し、多くのほかのPSYS_PART_*_MASKとは両立しません。 | 0x80000000 | |||
(未実装) パーティクルにランダムな加速率を適用するために用いられると推測されます。 | - | |||
(未実装') パーティクルの分散上でランダムな重点を指定することに用いられると推測されます。 | - | |||
(未実装) 一気に多くのパーティクルを分散させる源に痕跡を付与するために用いられると推測されます。 | - | |||
システムの表現 | ||||
PSYS_SRC_PATTERN | integer | 基本的な分散パターンを指定します。 | 9 | |
値 | PSYS_SRC_PATTERN_ANGLE | SYS_SRC_ANGLE_BEGINとPSYS_SRC_ANGLE_ENDによって定義される2次元循環部に存在するパーティクルです。 パーティクル面の方向は、エミッターのリージョンの回転と相対的にX=0です。 | 0x04 | |
PSYS_SRC_PATTERN_ANGLE_CONE | PSYS_SRC_ANGLE_BEGINとPSYS_SRC_ANGLE_ENDによって定義される3次元球状部に存在するパーティクルです。 | 0x08 | ||
PSYS_SRC_PATTERN_ANGLE_CONE_EMPTY | (非公式な追記:非関数として振舞います) PSYS_SRC_ANGLE_BEGIN PSYS_SRC_ANGLE_ENDによって定義される3次元球状部に存在するパーティクルですが、ANGLE_CON パターンと対義です。(すなわち、ANGLE_CONEが無効な場所だとANGLE_CONE_EMPTYのパーティクルがあり、逆の場合もしかり) | 0x10 | ||
PSYS_SRC_PATTERN_DROP | 存在するパーティクルがエミッターのポジションに無重力で落下していきます。PSYS_SRC_BURST_RADIUS、PSYS_SRC_BURST_SPEED_MINとPSYS_SRC_BURST_SPEED_MAXルールは無効です。 | 0x01 | ||
PSYS_SRC_PATTERN_EXPLODE | 放出動作規則に一致している全方向に放散して存在するパーティクルです。 | 0x02 | ||
PSYS_SRC_BURST_RADIUS | float | パーティクルが作られるであろうエミッターからの距離を指定します。このルールはPSYS_PART_FOLLOW_SRC_MASKフラグの設定時は無効です。 http://forums.secondlife.com/showthread.php?t=226722 のテストでは、最大値は50.00を指し示します。 | 16 | |
PSYS_SRC_ANGLE_BEGIN | float | 分散されないだろうパーティクルの、円状もしくは球状もしくは円錐状の(エミッター面から始まる)部分のラジアンの半分のアングルを指定します。エフェクトは一致しているのを反転されるのにも関わらず、有効な値はPSYS_SRC_ANGLE_ENDと同じものです。パターンがPSYS_SRC_PATTERN_ANGLEの場合、パーティクルの表現は2次元の平らな環状部上です。PSYS_SRC_PATTERN_ANGLE_CONEかPSYS_SRC_PATTERN_ANGLE_CONE_EMPTYが使われている場合、パーティクルの表現は3次元の球状部上です。このパラメータとPSYS_SRC_ANGLE_ENDの値は パラメータが2つの値の小さいほうを取得するように内部で再実行されることに注意しましょう。 | 22 | |
PSYS_SRC_ANGLE_END | float |
分散されないであろうパーティクルの、円状もしくは球体の"くぼみ"、もしくは円錐状の(エミッター面から始まる)部分のラジアンの半分のアングルを指定します。有効な値が0でエミッター面からPIの方向へ一直線に放散されたパーティクルを生じ、PSYS_SRC_ANGLE_BEGINによって定義された、完全な円状もしくは"くぼみ"を含まないエミッター周りの球体の弧もしくは円錐状の部分で発散され始めるパーティクルを生じるでしょう。パターンがPSYS_SRC_PATTERN_ANGLEの場合、表現は二次元の平らな環状部上です。PSYS_SRC_PATTERN_ANGLE_CONEかPSYS_SRC_PATTERN_ANGLE_CONE_EMPTYが使われている場合、表現は3次元球状部上です。このパラメータの値とPSYS_SRC_ANGLE_BEGINは2つの値の大きいほうを取得するように内部で再実行されます。||align="center"|23 | ||
float | 廃止: 代わりにPSYS_SRC_ANGLE_BEGINを使用します。 代替するルールとよくにた動きは、中心よりもかなりエミッター面寄り部分の端にはいきません。 | 10 | ||
float | 廃止: 代わりにPSYS_SRC_ANGLE_ENDを使用します。 代替するルールとよくにた動きは、中心部よりもかなりエミッター面寄りな部分にはいきません。 | 11 | ||
PSYS_SRC_TARGET_KEY | key | パーティクルがコースと動きを変えるであろう方向の対象のオブジェクト、プリム、もしくはエージェントのキーを指定します。有効時間の終了時は、対象の幾何学的中心へと最終的に試みます。PSYS_PART_TARGET_POS_MASKの設定が必要です。caveat 4 | 20 | |
パーティクルの見栄え | ||||
PSYS_PART_START_COLOR | vector | パーティクル発散開始時の色を指定する一個のvectorです。 | 1 | |
PSYS_PART_END_COLOR | vector | パーティクルが有効時間の間に変換する色を指定する一個のvectorです。PSYS_PART_INTERP_COLOR_MASKマスクを設定している場合のみつかえます。 | 3 | |
PSYS_PART_START_ALPHA | float | パーティクル発散開始時のアルファを指定します。有効な値は0.0~1.0の範囲です。高い数値ほどさらに不透明になり、小さい数値ほどさらに透明になります。 | 2 | |
PSYS_PART_END_ALPHA | float | パーティクルが有効時間の間に変換するアルファを指定します。PSYS_PART_INTERP_COLOR_MASKフラグを設定している場合のみ使えます。有効な値はPSYS_PART_START_ALPHAと同じです。(caveat 1) | 4 | |
PSYS_PART_START_SCALE | vector | パーティクル発散開始時の形状やサイズを指定します。各方向で有効な値は0.04 (0.03125)~4.0mです。パーティクルは基本的に2Dスプライトなので、vectorのZ構成は無効であり、0.0で設定すべきです。 | 5 | |
PSYS_PART_END_SCALE | vector | パーティクルが有効時間の間に変換する形状とサイズを指定します。PSYS_PART_INTERP_SCALE_MASKフラグを設定している場合のみ使えます。有効な値はPSYS_PART_START_SCALEと同じです。 | 6 | |
PSYS_SRC_TEXTURE | string | 各パーティクルに用いる、プリム内のテクスチャ名を指定します。代わりに付与するキーとしてテクスチャのUUIDを指定することも出来るでしょう。 | 12 | |
パーティクルの落下 | ||||
PSYS_SRC_MAX_AGE | float | (パーティクルシステムがすでに設定されている場合)エミッターが視界に入り始めるように指示、あるいは(すでに視界にある場合)この関数が実行開始する秒単位の間隔を指定します。終了直後、それ以降パーティクルが分散されないと、上記の指定は除去されます。0はパーティクルシステムを無期限で継続します。(caveat 2) | 19 | |
PSYS_PART_MAX_AGE | float | 秒単位で各パーティクル発散有効時間を指定します。最大30.0秒です。この時間の間、パーティクルは他の部分で指定されたパラメータにあわせて表示され、見かけを変えて、動いて、そして非表示になるでしょう。 | 7 | |
PSYS_SRC_BURST_RATE | float | 放出されているパーティクルが発散する時間間隔を秒単位で指定します。0.0の値はビューアが可能な限りの速さでパーティクルが放散を起こすように指定します。 | 13 | |
PSYS_SRC_BURST_PART_COUNT | integer | 各"発散"で放出されるパーティクルの数を指定します。 | 15 | |
パーティクルの動き | ||||
PSYS_SRC_ACCEL | vector | 放散された各パーティクルに当てはめられる方向加速度のvectorを、メートル毎秒で指定します。有効な値は、リージョン構成上の各方角で0.0~100.0です。 | 8 | |
PSYS_SRC_OMEGA | vector | 各軸に沿って秒毎ラジアンでのエミッターの回転を指定します。これはプリムの有効なZ軸からエミッターの面を引き離し、表現する方向で目立たせます。プリムの回転(llTargetOmega参照)はエミッター回転上では働きません。(caveat 3) | 21 | |
PSYS_SRC_BURST_SPEED_MIN | float | メートル毎秒で各パーティクル発散時に選択される発散速度の、ランダムな範囲の最小値を指定します。 このパラメータの値とPSYS_SRC_BURST_SPEED_MAXは、この2つの値で小さいほうを取得するように内部で再実行されることに注意しましょう。 | 17 | |
PSYS_SRC_BURST_SPEED_MAX | float | メートル毎秒で各パーティクル発散時に選択される発射速度の、ランダムな範囲の最大値を指定します。このバラメータの値とPSYS_SRC_BURST_SPEED_MINは、この2つの値で大きいほうを取得するように内部で再実行されることに注意しましょう。 | 18 |
警告
- パーティクルシステム実行によるバグ(VWR-2146参照)のようで、、PSYS_PART_END_ALPHAとPSYS_PART_INTERP_COLOR_MASKフラグは、常に補正された結果としてPSYS_PART_END_ALPHAの値を加えるでしょう。そして1から初めて0.5進めるなら、パーティクルの効果時間の半分のとき0.75のアルファを期待します。1.25になろうとするとバグが発生します。結果的に、いつも加えられた後にこれの必要とする数値より高めに設定にするなどすれば、パーティクルが消滅しなくなります。
- これは WindLight First Look test Viewerにて修正されています。
- 0ではないエミッター効果時間(PSYS_SRC_MAX_AGE) の設定にてパーティクルシステムを使っているとき、パーティクルシステムで組まれたトリガがオフになることなく再起動するかもしれない、と伝えるほうがいいかもしれません。これはエミッターが幾つかのプリムの設定が更新もしくは他のビューアに送信するときにリセットするのが原因でバグが発生しているようです。結果的に、timerを使うか、著しい遅延と一度発生時間を消滅させてパーティクルシステムを消すべきかもしれません。
- PSYS_SRC_OMEGAで定義される回転は、リージョン座標システムに相対的で、プリムのローカル座標システムとは相対的ではありません。
- パーティクルは、PSYS_SRC_TARGET_KEYルールとPSYS_PART_TARGET_POS_MASKフラグで設定されている、指定された人型アバタに向かって動いていて、終点はアバターの矩形の幾何学中心、あいにくにも、アバタの股間部に直撃しているように表示されるでしょう。対象のアバタのほかの箇所を終点にしたい場合は、代わりに終点にしたい場所にした対象プリムを設置すべきで、PSYS_SRC_TARGET_KEYルールの値にそのプリムのキーを使用します。
- Second Life viewerは余りにも小さくみえる距離にあるオブジェクトは淘汰するように最適化されています。もしエミッターがとても小さいなら、距離のことがもとで最適化され、パーティクルシステムとそのエミッター間で表示されないでしょう。
サンプル
この例は光っている赤い球の効果を作成します。
<lsl>
llParticleSystem([PSYS_PART_FLAGS, PSYS_PART_WIND_MASK
便利なスニペット
integerに(から)色とアルファの値を蓄積(回収)のための使い勝手のいい関数です。
<lsl>
integer ColorAlphatoRGBA(vector color, float alpha) {
return (((integer)(alpha * 255.0) & 0xFF) << 24)
注意点
- クライアントの標準のパーティクル総数は、4096が基本設定です。クライアントが視界範囲で全ての有効なパーティクルシステムを表現するであろう最大パーティクル総数です。優れたパーティクルシステムのデザインは、そのパーティクルが周囲の人に邪魔になることと他の人達のパーティクルシステムを枯らしていくこと、を避けるのがキーポイントです。そのようなものとして、そんな多くのパーティクルの分散で、あなたのパーティクルエミッターがトラブルに遭う経験をしているならば、パーティクルの枯れをさけることはできないかもしれません。クライアント/ビューアのラグ(小さいフレームレート)はこれらが原因でもまた発生する可能性があるので、パーティクルは表現するために少ない最適地を選びます。これの最善な解決策は、あなた自身がデザインとテストを行なうとき、他のパーティクルシステムが相対的に制限しない、少ないラグの環境で動かすことです。
- 一度パーティクルが分散されると、直接的な動きはPSYS_PART_TARGET_POS_MASKフラグかthe PSYS_PART_FOLLOW_SRC_MASKフラグの、PSYS_SRC_ACCELによってのみ影響され得ます。そのようになるので、旋回渦エフェクト(オブジェクトが発している方向にビューアを一度向けた、消滅しはじめ、またはアバターがsim/gridから去ったときのようなもの)を作る良い方法はありません。