Template:LSL Function/ParticleSystem/ja
spec
パーティクル[1]を定義して、 スクリプト の入っている プリム の中にある パーティクルエミッター の状態を設定します。同じプリムに入っている他のスクリプトがこの関数を呼び出すと、同じパーティクルエミッターの状態を変更することになります。この関数で定義されたパーティクル自体は、プリムのサイズ、形、色などと同様に、 プリムのプロパティ となります。それぞれのプリムには 1 個の パーティクルエミッターだけしか存在できず、それは 幾何学的中心 に存在し、プリムの ローカル Z 軸に沿って、正の Z 方向を指します。
この関数だけがプリムのパーティクルエミッターの状態を変更することができます。つまり、エミッターを異なる状態にしたい場合 (例えば、まったく異なるパーティクルを放出したり、エミッターを停止したりしたい場合) 、この同じ関数を代わりに描画しようとしている新しいパーティクルのパラメタで呼び出せばいいです。空のリスト (例えば {{{1}}}
; ) を指定すると、エミッターが停止します。
パーティクルは本質的には 2D の スプライト であり、常にビューアのカメラに正対して描画されます。
ルール / データの値は以下のように定義されます。
caveats
- 放出期間 (PSYS_SRC_MAX_AGE) をゼロ以外に指定してパーティクルを使用すると、スクリプトが何も呼び出していないのに、パーティクルが再開してしまうことがあるでしょう。これは、プリムのプロパティが更新されたりビューワに送信されたりすると、エミッターが「リセット」されてしまうバグによるものです。結果として、 timer か強制 スリープ を使って、放出期間が切れたパーティクルを消去しなければならなくなります。 Debbie Trilling はこの回避策を投稿しました: http://forums.secondlife.com/showpost.php?p=1996465&postcount=6
- PSYS_SRC_OMEGA で設定する回転は リージョン 座標に対するもので、プリムの ローカル 座標に対するものではありません。
- 新規で作成すると、プリムエミッターはプリムの ZERO_ROTATION に設定されます。パーティクルの表示を設計している時に PSYS_SRC_OMEGA を使用すると、エミッターは回転することになります。その後 PSYS_SRC_OMEGA のベクトルを変更すると、エミッターは ZERO_ROTATION にはリセットされず、停止または変更されたときの回転軸に沿って回転し続けることになります。この結果、破損したプリムの中でパーティクルは(新しいエミッターの)新しいプリムの中に同じスクリプトを入れたときとは違うように見えることになります。
- アバターに向けて移動するパーティクルは、 PSYS_SRC_TARGET_KEY ルールが指定され PSYS_PART_TARGET_POS_MASK フラグが設定されると、アバターの Bounding Box の幾何学的中心に向かうことになります。残念なことに、これは股間を直撃するように見えてしまいます。アバターの別の部位を目標にしたい場合は、目標となるプリムを設置して、パーティクルを向かわせたい位置にそれを移動し、プリムのキーを PSYS_SRC_TARGET_KEY ルールの値に設定します。
- Second Life ビューワは、小さすぎて殆ど見えない遠くのオブジェクトを間引いて描画するという最適化をしています。エミッターが非常に小さく、距離が遠いために間引かれてしまっている場合、それに関連づいたパーティクルも描画されなくなります。
notes
- ビューワが表示するパーティクル個数の標準は、通常 4096 に設定されています。これはクライアントが視野に入る全てのアクティブなパーティクルを描画する最大のパーティクル数です。良いパーティクルの設計の秘訣は、自分のパーティクルを「スパム」せず、他の人のパーティクルを締め出さないことです。例えば、もし自分のパーティクルエミッターが期待した数のパーティクルを放出していないという問題がある場合、このリソース枯渇の犠牲になっているかもしれません。パーティクルはどちらかというと描画の優先度が低いので、クライアント/ビューアのラグ (低フレームレート) も同様の問題を起こします。最善の解決策は、設計やテストのときに、他のパーティクルがあまりないラグの少ない環境に移動することです。
- パーティクルが一旦発生すると、移動方向は PSYS_SRC_ACCEL 、PSYS_PART_TARGET_POS_MASK フラグ、 PSYS_PART_FOLLOW_SRC_MASK によってのみ制御されます。例えば "渦を巻く竜巻" の効果 (オブジェクトが喋る時、撤去される時、アバターが SIM/グリッドを立ち去る時にビューワで使われるような効果) を作成する良い方法というものはありません。その効果は、パーティクルの発生源を動かすことで実現可能です。(例えば旋回スクリプトで。)
helpers
色と透過度を intteger で格納したり、 integer から復元したりするのに便利な関数:
<lsl>integer ColorAlphatoRGBA(vector color, float alpha) {
return (((integer)(alpha * 255.0) & 0xFF) << 24)
constants_nb
ルール/設定値の定数 | ルールパラメタ | 説明 | 値 | |
パーティクルのふるまい | ||||
PSYS_PART_FLAGS | integer flags | パーティクルの振る舞いを制御する様々なフラグ。設定値は 10 進数形式か 16 進数 形式の整数で指定するか、以下の 1 個以上のフラグ定数の ビット単位 OR を ("|" 演算子を用いて) 指定します: | 0 | |
V a l u e s |
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 | ||
(未実装) enum 値として存在しているだけです。 | 0x200 | |||
HUD および rez されたオブジェクトのパーティクル発生源を区別するためビューアによって使われます。 | 0x40000000 | |||
パーティクルを削除します。どの PSYS_PART_*_MASK とも互換性がありません。 | 0x80000000 | |||
(未実装 & コメントアウト) パーティクルにランダムな強弱を適用するために使われるようです。 | - | |||
(未実装 & コメントアウト) パーティクル放出時にランダムな速度を指定するために使われるようです。 | - | |||
(未実装 & コメントアウト) 短いパーティクルを追加放出して "軌跡" を実現するために使われるようです。 | - | |||
パーティクルのみばえ | ||||
PSYS_SRC_PATTERN | integer pattern | 一般的な放出パターンを指定します。 | 9 | |
V a l u e s |
PSYS_SRC_PATTERN_EXPLODE | パーティクルを球状にスプレーするように表示します。パーティクルの初速は PSYS_SRC_BURST_SPEED_MIN と PSYS_SRC_BURST_SPEED_MAX で決まります。 EXPRODE パターンは ANGLE パラメタを無視します。 | 0x02 | |
PSYS_SRC_PATTERN_ANGLE_CONE | パーティクルを球状、半球状、円錐状、またはリング状にスプレーするように表示します。形状は PSYS_SRC_ANGLE_BEGIN と PSYS_SRC_ANGLE_END の ANGLE パラメタによって決まります。 ANGLE_CONE パターンは、 PSYS_SRC_ANGLE_BEGIN に 0.00000 、 PSYS_SRC_ANGLE_END に 3.14159 (または PI) (など) を指定すると、 EXPLODE パターンと同じように使用することができます。 | 0x08 | ||
PSYS_SRC_PATTERN_ANGLE | パーティクルを円状、半円状、弧または放射状にスプレーするように表示します。形状は PSYS_SRC_ANGLE_BEGIN と PSYS_SRC_ANGLE_END によって決まります。円状パターンはプリムの X 軸について放射状に開きます。 | 0x04 | ||
PSYS_SRC_PATTERN_DROP | 初速なしでパーティクルを作成します。 DROP パターンは PSYS_SRC_BURST_RADIUS 、PSYS_SRC_BURST_SPEED_MIN 、PSYS_SRC_BURST_SPEED_MAX の値を上書きして 0.00000 に設定します。 (DROP パターンのように動作する全てのパターンで、 RADIUS 、SPEED_MIN 、SPEED_MAX が設定されていたら 0.0000 に上書きされるようになっています) | 0x01 | ||
PSYS_SRC_PATTERN_ANGLE_CONE_EMPTY | (未実装) PSYS_SRC_PATTERN_DROP パターンと同じように、このパターンは元々、 ANGLE パラメタの逆で、パーティクルがスプレーされない範囲を描くためにありました。 | 0x10 | ||
PSYS_SRC_BURST_RADIUS | float radius | パーティクルの発生範囲をエミッターからの距離で指定します。このルールは PSYS_PART_FOLLOW_SRC_MASK フラグが指定されると無視されます。http://forums-archive.secondlife.com/327/f5/226722/1.html でのテストによると最大値は 50.00 です。 | 16 | |
PSYS_SRC_ANGLE_BEGIN | float angle_begin | パーティクルが発生しない円や球の「くぼみ」または円錐の断面の半角を、(エミッターが向いている方向を起点とした) ラジアンで指定します。指定可能な値は PSYS_SRC_ANGLE_END のそれと同じですが、効果は逆になります。パターンが PSYS_SRC_PATTERN_ANGLE の場合、 2D の円の範囲となります。 PSYS_SRC_PATTERN_ANGLE_CONE または PSYS_SRC_PATTERN_ANGLE_CONE_EMPTY が使用されている場合、 3D の球の範囲となります。このパラメタおよび PSYS_SRC_ANGLE_END の値は内部的に並び替えられ、このパラメタには小さいほうが割り当てられます。 | 22 | |
PSYS_SRC_ANGLE_END | float angle_end | パーティクルが発生しない円や球の「くぼみ」または円錐の断面の半角を、(エミッターが向いている方向を起点とした) ラジアンで指定します。指定可能な値は 0.0 から PI までで、 0.0 の場合、パーティクルがエミッターの向く方向に一直線に放出されることになり、 PI の場合、エミッターを中心として、PSYS_SRC_ANGLE_BEGIN で指定した「くぼみ」または円錐の断面を除いた、円または球状に放出されることになります。パターンが PSYS_SRC_PATTERN_ANGLE の場合、 2D の円の範囲となります。 PSYS_SRC_PATTERN_ANGLE_CONE または PSYS_SRC_PATTERN_ANGLE_CONE_EMPTY が使用されている場合、 3D の球の範囲となります。このパラメタおよび PSYS_SRC_ANGLE_BEGIN の値は内部的に並び替えられ、このパラメタには大きいほうが割り当てられます。 | 23 | |
float angle_inner | 非推奨: 代わりに PSYS_SRC_ANGLE_BEGIN を使ってください 後継のルールと同様に動作しますが、エミッターの中心でなく表面が範囲の基準になる点が異なります。 | 10 | ||
float angle_outer | 非推奨: 代わりに PSYS_SRC_ANGLE_END を使ってください 後継のルールと同様に動作しますが、エミッターの中心でなく表面が範囲の基準になる点が異なります。 | 11 | ||
PSYS_SRC_TARGET_KEY | key target | 移動目標となるオブジェクト、プリム、アバターの UUID を指定します。それに向かってパーティクルは進路を変え、移動してゆきます。表示持続時間が尽きる時にちょうど目標の幾何学中心に到達するよう調整されます。 PSYS_PART_TARGET_POS_MASK フラグが設定されていなければなりません。 警告 4 | 20 | |
パーティクルの外観 | ||||
PSYS_PART_START_COLOR | vector color_start | パーティクル出現時の色を表現した vector 値。 | 1 | |
PSYS_PART_END_COLOR | vector color_end | パーティクルが表示持続時間を経過して消滅する時の色を表現した vector 値。PSYS_PART_INTERP_COLOR_MASK フラグが設定された時だけ使われます。 | 3 | |
PSYS_PART_START_ALPHA | float alpha_start | パーティクル出現時の透明度を指定します。有効な値の範囲は 0.0 ~ 1.0 です。値が小さいほど透明に、大きいほど不透明になります。 | 2 | |
PSYS_PART_END_ALPHA | float alpha_end | パーティクルが表示持続時間を経過して消滅する時の透明度を指定します。PSYS_PART_INTERP_COLOR_MASK フラグが設定された時だけ使われます。有効な値は PSYS_PART_START_ALPHA と同じです。 | 4 | |
PSYS_PART_START_SCALE | vector scale_start | パーティクルが出現する時のサイズを指定します。(単位: メートル。) 有効な値は各軸とも 0.04 (0.03125) ~ 4.0 です。パーティクルは本質的に平面のスプライトなので、vector 値の Z 軸要素は無視され 0.0 になります。 | 5 | |
PSYS_PART_END_SCALE | vector scale_end | パーティクルが表示持続時間を経過して消滅する時のサイズを指定します。PSYS_PART_INTERP_SCALE_MASK フラグが設定された時だけ使われます。有効な値は PSYS_PART_START_SCALE と同じです。 | 6 | |
PSYS_SRC_TEXTURE | string texture | 各パーティクルで使用するテクスチャのインベントリの中での名前を指定します。代わりに、テクスチャのアセットキー UUID を指定することもできます。 llLinkParticleSystem を使用し、テクスチャが UUID でない場合、テクスチャはエミッタープリムの中になければなりません (スクリプトと一緒でなくてもかまいません) 。 | 12 | |
Particle Flow | ||||
PSYS_SRC_MAX_AGE | float duration_system | エミッターの放出持続時間を秒単位で指定します。 (既にパーティクル構成が設定済みならば) 視界に入った時点からの、あるいは (既に視界に入っているならば) この関数が実行された時点からの時間となります。指定時間が過ぎると、上記の条件に合致しない限り、パーティクルは放出されなくなります。ゼロを指定するとパーティクルは無期限に放出されます。 (警告 1) | 19 | |
PSYS_PART_MAX_AGE | float duration_particle | 各パーティクルの表示持続時間を秒単位で指定します。 最大値は 30.0 です。この時間の間に、パーティクルが出現し、他のルールで指定されたパラメタに応じて外観を変えつつ移動し、消滅します。 | 7 | |
PSYS_SRC_BURST_RATE | float burst_sleep | 放出されるパーティクルの "炸裂" (burst) 間隔を秒単位で指定します。 0.0 を指定すると、ビューアが可能な限り高速にパーティクルを放出します。 | 13 | |
PSYS_SRC_BURST_PART_COUNT | integer burst_particle_count | 一度の "炸裂" で放出されるパーティクルの数を指定します。 | 15 | |
パーティクルの動作 | ||||
PSYS_SRC_ACCEL | vector acceleration | 各パーティクルが放出される際、それに適用される方向加速度ベクトルをメートル/秒で指定します。 リージョン 座標の各軸について 0.0 ~ 100.0 を有効な値として指定できます。 | 8 | |
PSYS_SRC_OMEGA | vector omega | エミッターの各軸に関する回転速度をラジアン/秒で指定します。この値を設定するとプリムの Z 軸の正方向に向いていたエミッターは "解放" され、めざましい回転を表現します。(llTargetOmega 関数による) プリムの回転は、エミッターの回転に影響しません。 (警告 2 と 警告 3) | 21 | |
PSYS_SRC_BURST_SPEED_MIN | float speed_min | 各パーティクルの初速の最小値をメートル/秒で設定します。パーティクルが出現する際の初速は、これで指定される範囲からランダムに選ばれます。このパラメタおよび PSYS_SRC_BURST_SPEED_MAX の値は内部的に並び替えられ、このパラメタには小さいほうが割り当てられます。 | 17 | |
PSYS_SRC_BURST_SPEED_MAX | float speed_max | 各パーティクルの初速の最大値をメートル/秒で設定します。パーティクルが出現する際の初速は、これで指定される範囲からランダムに選ばれます。このパラメタおよび PSYS_SRC_BURST_SPEED_MIN の値は内部的に並び替えられ、このパラメタには大きいほうが割り当てられます。 | 18 | |
LL_PART_* 定数は viewer - indra/llmessage/llpartdata.h にだけ現れ、それらのうち赤で示したフラグはコメントアウトされています。 |
deepnotes
欠番 14
14 という値を持つはずだった欠番の定数があり、基本的な列挙型 LLPSScriptFlags がそれを LLPS_SRC_BURST_DURATION という識別子で持っていますが、クライアントのソースで全く使われていません。炸裂持続時間が PSYS_SRC_BURST_PART_COUNT と PSYS_SRC_BURST_RATE で決まることを考えれば、これは当然です。