Template:LSL Function/ParticleSystem/ja

From Second Life Wiki
< Template:LSL Function‎ | ParticleSystem
Revision as of 14:28, 27 April 2010 by Mako Nozaki (talk | contribs) (merged translator's notes into original page - deleted the term "訳注")
Jump to navigation Jump to search

spec

スクリプトが入っているプリムパーティクル放出器 (particle emitter) の状態を設定する、パーティクル構成 (particle system) を定義します。同じプリムにある他のスクリプトも、この同じパーティクル放出器の状態を変更できます。従って、この関数で定義されるパーティクル構成はプリムの属性であり、その点で (プリムの) サイズ、形状、色などと同様です。 各プリムは、ただ 1個 のパーティクル放出器を持ちます。その位置はプリムの 幾何学中心 です。その方向はプリムのローカルな Z 軸に沿っており、正の Z 軸方向を向いています。

この関数だけが、プリムのパーティクル放出器の状態を変更できます。従って、放出器を別な状態に変えたい (例えば、全く別のパーティクル構成で放出したい、あるいは放出を完全に停止したい) 場合、新しく設定したいパーティクル構成のパラメタで、この関数を再度呼び出してください。llParticleSystem([]); という具合に空のリストを指定すると、放出器を停止します。

パーティクルは本質的に平面の "スプライト" であり、常にビューアのカメラに正対して描画されます。

ルール/データの値は以下のように定義されます。

caveats

  1. PSYS_SRC_MAX_AGE で放出期間をゼロ以外に指定したパーティクル構成を使う際、スクリプト側で何もしていないのに (もう停止している) パーティクルが再開してしまう場合があります。これはプリムの何らかの属性が更新された、あるいはビューアに何かが作用したかが原因で、放出器が "リセット" されるバグの為です。結果的に、timer 関数か強制的な Sleep を使い、指定時間が過ぎたらパーティクル構成をクリアする必要があるかもしれません。Debbie Trilling がこの対処法について述べています: http://forums.secondlife.com/showpost.php?p=1996465&postcount=6
  2. PSYS_SRC_OMEGA で定義される回転の相対基準となるのはリージョン座標系であり、プリムのローカル座標系ではありません。
  3. プリム放出器を新規で作成すると、プリムの中の ZERO_ROTATION に設定されます。パーティクルを設計している間に PSYS_SRC_OMEGA を使用すると、放出器は回転することになります。その後 PSYS_SRC_OMEGA のベクトルを変更すると、放出器は ZERO_ROTATION にはリセットされず、停止または変更されたときの回転軸に沿って回転し続けることになります。この結果、破損したプリムの中でパーティクルは(新しい放出器の)新しいプリムの中に同じスクリプトを入れたときとは違うように見えることになります。
  4. PSYS_SRC_TARGET_KEY ルールと PSYS_PART_TARGET_POS_MASK フラグによってアバターに向け放出されるパーティクルは、そのアバターを取り囲む直方体の幾何学中心まで行って消滅します。不幸なことに、これは股間を直撃するように見えてしまいます。アバターの別の部位を目標にしたい場合は、そこに目標となるプリムを置いてください。そしてそのプリムの UUID を PSYS_SRC_TARGET_KEY ルールの値に指定してください。
  5. Second Life ビューアは、小さすぎて殆ど見えない遠くのオブジェクトを間引いて描画するという最適化をしています。放出器が非常に小さくまた遠いため間引かれてしまう場合、それに設定されたパーティクルもまた描画されないでしょう。

notes

  • ビューアが表示するパーティクル個数の標準は、通常 4096 に設定されています。これは視野にある全ての稼動中パーティクル構成に関して、ビューアが描画できる最大パーティクル数です。人々に "スパム" を行なわない、他人のパーティクル (が使うべきリソース) を圧迫しないためにも、良いパーティクル構成の設計が必要です。例えば、もしあなたのパーティクル放出器が期待するほどには多くの放出をしていないという場合、このリソース不足の犠牲者にされているかもしれません。パーティクルはどちらかというと描画の優先度が低いので、クライアント/ビューアのラグ (低フレームレート) も同様の問題を起こします。解決策として、自分のパーティクル構成を設計しテストする際には、比較的他から影響を受けない、ラグの少ない場所で行なうことです。
  • パーティクルが放出された後の進行方向は PSYS_SRC_ACCEL、PSYS_PART_TARGET_POS_MASK フラグ、PSYS_PART_FOLLOW_SRC_MASK フラグによってのみ制御されます。例えば "渦を巻く竜巻" の効果 (オブジェクトが喋る時、撤去される時、アバターが SIM/グリッドを立ち去る時にビューアで使われるような効果) を作成する良い方法というものはありません。その効果は、パーティクルの発生源を動かすことで実現可能です。(例えば旋回スクリプトで。)

helpers

色と透明度を integer 値として管理するのに便利な関数:
<lsl>integer ColorAlphatoRGBA(vector color, float alpha) {

   return (((integer)(alpha   * 255.0) & 0xFF) << 24)

constants_nb

ルール/設定値の定数 説明
パーティクル構成のふるまい
PSYS_PART_FLAGS integer パーティクルの振る舞いを制御する様々なフラグ。設定値は 10 進数形式か 16 進数形式の整数で指定するか、以下の 1 個以上のフラグ定数の ビット単位 OR を ("|" 演算子を用いて) 指定します: 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
PSYS_PART_BEAM_MASK (未実装) enum 値として存在しているだけです。 0x200
LL_PART_HUD HUD および rez されたオブジェクトのパーティクル発生源を区別するためビューアによって使われます。 0x40000000
LL_PART_DEAD_MASK パーティクルを削除します。どの PSYS_PART_*_MASK とも互換性がありません。 0x80000000
LL_PART_RANDOM_ACCEL_MASK (未実装 & コメントアウト) パーティクルにランダムな強弱を適用するために使われるようです。 -
LL_PART_RANDOM_VEL_MASK (未実装 & コメントアウト) パーティクル放出時にランダムな速度を指定するために使われるようです。 -
LL_PART_TRAIL_MASK (未実装 & コメントアウト) 短いパーティクルを追加放出して "軌跡" を実現するために使われるようです。 -
パーティクル構成のみばえ
PSYS_SRC_PATTERN integer 全体的な放出パターンを指定します。 9


PSYS_SRC_PATTERN_EXPLODE パーティクルを全方向へ打ち出すように表示します。burst 動作のルールに従います。 0x02
PSYS_SRC_PATTERN_ANGLE_CONE パーティクルを球状の範囲に表示します。表示範囲は PSYS_SRC_ANGLE_BEGIN と PSYS_SRC_ANGLE_END で定義されます。 0x08
PSYS_SRC_PATTERN_ANGLE パーティクルを平面的な円の範囲に表示します。表示範囲は PSYS_SRC_ANGLE_BEGIN と PSYS_SRC_ANGLE_END で定義されます。表示範囲となる平面の向きは、放出器のリージョン座標の傾きにおいて X=0 となる向きです。 0x04
PSYS_SRC_PATTERN_DROP パーティクルが放出器の位置から力を加えず落下するように表示します。PSYS_SRC_BURST_RADIUS、PSYS_SRC_BURST_SPEED_MIN、PSYS_SRC_BURST_SPEED_MAX ルールを無視します。 0x01
PSYS_SRC_PATTERN_ANGLE_CONE_EMPTY (未実装) パーティクルを球状の範囲に表示します。表示範囲は PSYS_SRC_ANGLE_BEGIN と PSYS_SRC_ANGLE_END で定義されますが、ANGLE_CONE のパターンとは逆に解釈されます。(すなわち ANGLE_CONE でパーティクルが表示されない範囲ができたら、同じ設定値の場合 ANGLE_CONE_EMPTY ならば逆にそこにパーティクルが表示される。逆も同様。) 0x10
PSYS_SRC_BURST_RADIUS float パーティクルの発生範囲を放出器からの距離で指定します。このルールは PSYS_PART_FOLLOW_SRC_MASK フラグが指定されると無視されます。http://forums-archive.secondlife.com/327/f5/226722/1.html でのテストによると最大値は 50.00 です。 16
PSYS_SRC_ANGLE_BEGIN float パーティクルが放出されない範囲を指定します。範囲となる円/円錐のくぼみ/突出部分 (放出器の表面が起点) の角度を 1/2 したものをラジアンで指定します。有効な値は PSYS_SRC_ANGLE_END のそれと同じですが、意味は逆です。放出パターンが PSYS_SRC_PATTERN_ANGLE の場合、平面の円の範囲を表現します。PSYS_SRC_PATTERN_ANGLE_CONE あるいは PSYS_SRC_PATTERN_ANGLE_CONE_EMPTY の場合、立体の球の範囲を表現します。このパラメタおよび PSYS_SRC_ANGLE_END の値は内部的に並び替えられ、このパラメタには小さいほうが割り当てられます。 22
PSYS_SRC_ANGLE_END float パーティクルが放出されない範囲を指定します。範囲となる円/円錐のくぼみ/突出部分 (放出器の表面が起点) の角度を 1/2 したものをラジアンで指定します。有効な値は 0.0~PI です。0.0 の場合、放出器が向いている方向へ一直線にパーティクルを放出します。PI の場合、PSYS_SRC_ANGLE_BEGIN で定義されるくぼみ/突出部分を除いた全方向へ、放出器からパーティクルを放出します。放出パターンが PSYS_SRC_PATTERN_ANGLE の場合、平面の円の範囲を表現します。PSYS_SRC_PATTERN_ANGLE_CONE あるいは PSYS_SRC_PATTERN_ANGLE_CONE_EMPTY の場合、立体の球の範囲を表現します。このパラメタおよび PSYS_SRC_ANGLE_BEGIN の値は内部的に並び替えられ、このパラメタには大きいほうが割り当てられます。 23
PSYS_SRC_INNERANGLE float 非推奨: 代わりに PSYS_SRC_ANGLE_BEGIN を使ってください 後継のルール (PSYS_SRC_ANGLE_BEGIN) と同様に動作しますが、放出器の中心でなく表面が範囲の基準になる点が異なります。 10
PSYS_SRC_OUTERANGLE float 非推奨: 代わりに PSYS_SRC_ANGLE_END を使ってください 後継のルール (PSYS_SRC_ANGLE_END) と同様に動作しますが、放出器の中心でなく表面が範囲の基準になる点が異なります。 11
PSYS_SRC_TARGET_KEY key 移動目標となるオブジェクト、プリム、アバターの UUID を指定します。それに向かってパーティクルは進路を変え、移動してゆきます。表示持続時間が尽きる時にちょうど目標の幾何学中心に到達するよう調整されます。PSYS_PART_TARGET_POS_MASK フラグが設定されていなければなりません。警告 3 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 と同じです。 4
PSYS_PART_START_SCALE vector パーティクルが出現する時のサイズを指定します。(単位: メートル。) 有効な値は各軸とも 0.04 (0.03125) ~ 4.0 です。パーティクルは本質的に平面のスプライトなので、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 放出器の放出持続時間を指定します。(単位: 秒。) (既にパーティクル構成が設定済みならば) 視界に入った時点からの、あるいは (既に視界に入っているならば) この関数が実行された時点からの時間となります。指定時間が過ぎると、上記の条件に合致しない限り、パーティクルは放出されなくなります。ゼロを指定するとパーティクルは無期限に放出されます。(警告 1) 19
PSYS_PART_MAX_AGE float 各パーティクルの表示持続時間を指定します。(単位: 秒。) 最大値は 30.0 です。パーティクルは出現した後、この時間をかけて、他のルールで指定されたパラメタに応じて外観を変えつつ移動し、消滅します。 7
PSYS_SRC_BURST_RATE float 放出されるパーティクルの "炸裂" (burst) 間隔を指定します。(単位: 秒。) 0.0 を指定すると、ビューアが可能な限り高速にパーティクルを放出します。 13
PSYS_SRC_BURST_PART_COUNT integer 一度の "炸裂" で放出されるパーティクルの数を指定します。 15
パーティクルの動作
PSYS_SRC_ACCEL vector 各パーティクルが放出される際、それに適用される方向加速度ベクトルを指定します。(単位: メートル/秒。) リージョン座標の各軸について 0.0 ~ 100.0 を有効な値として指定できます。 8
PSYS_SRC_OMEGA vector 放出器の各軸に関する回転速度を指定します。(単位: ラジアン/秒。) この値を設定するとプリムの Z 軸の正方向に向いていた放出器は "解放" され、めざましい回転を表現します。(llTargetOmega 関数による) プリムの回転は、放出器の回転に影響しません。(警告 2) 21
PSYS_SRC_BURST_SPEED_MIN float 各パーティクルの初速の最小値を設定します。(単位: メートル/秒。) パーティクルが出現する際の初速は、これで指定される範囲からランダムに選ばれます。このパラメタおよび PSYS_SRC_BURST_SPEED_MAX の値は内部的に並び替えられ、このパラメタには小さいほうが割り当てられます。 17
PSYS_SRC_BURST_SPEED_MAX float 各パーティクルの初速の最大値を設定します。(単位: メートル/秒。) パーティクルが出現する際の初速は、これで指定される範囲からランダムに選ばれます。このパラメタおよび 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 で決まることを考えれば、これは当然です。