LlParticleSystem/ja

From Second Life Wiki
< LlParticleSystem
Revision as of 04:31, 25 February 2016 by SakuraNoel Fayray (talk | contribs)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigation Jump to search

要約

関数: llParticleSystem( list rules );

rules のリストに沿って定義されたパーティクルが、 スクリプトの入っているプリムに設定されます。

• list rules [ rule1, data1, rule2, data2 . . . rulen, datan ] 形式で指定された、パーティクルのルールリスト

仕様

パーティクル[1]を定義して、 スクリプト の入っている プリム の中にある パーティクルエミッター の状態を設定します。同じプリムに入っている他のスクリプトがこの関数を呼び出すと、同じパーティクルエミッターの状態を変更することになります。この関数で定義されたパーティクル自体は、プリムのサイズ、形、色などと同様に、 プリムのプロパティ となります。それぞれのプリムには 1 個の パーティクルエミッターだけしか存在できず、それは 幾何学的中心 に存在し、プリムの ローカル Z 軸に沿って、正の Z 方向を指します。

この関数だけがプリムのパーティクルエミッターの状態を変更することができます。つまり、エミッターを異なる状態にしたい場合 (例えば、まったく異なるパーティクルを放出したり、エミッターを停止したりしたい場合) 、この同じ関数を代わりに描画しようとしている新しいパーティクルのパラメタで呼び出せばいいです。空のリスト (例えば llParticleSystem([]); ) を指定すると、エミッターが停止します。

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

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

ルール/設定値の定数 ルールパラメタ 説明
パーティクルのふるまい
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_RIBBON_MASK パーティクルの流れを連続した帯状に結合します。 パーティクルテクスチャは引き伸ばされ(または絞られ)、右端が前のパーティクルの左端に結合されます。 リボンの「幅」は、開始スケールと終了スケールの「x」値で制御されます。 (「y」値は無視されます。 パーティクル間の距離は、各リボンセグメントの「長さ」を制御します。) 他のパーティクルエフェクトとは異なり、リボンセグメントは視聴者のカメラに向けてレンダリングされません。 新しいパーティクルのZ軸は、エミッタープリムのZ軸を模倣しています。 リボンセグメントは、「長さ」がない場合はレンダリングされません。これは、パーティクルがエミッタープリムのローカルZ軸を「上」または「下」にのみ移動する場合に起こります。 PSYS_PART_FOLLOW_VELOCITY_MASKはリボンには効果がありません。 シンプルなリボン効果を得るには、DROPパターン、TEXTURE_BLANK、ACCEL、WINDを使ってみてください。 0x400
PSYS_PART_TARGET_LINEAR_MASK 設定すると、放出されたパーティクルは PSYS_SRC_TARGET_KEY ルールで指定された目標へ等間隔の直線で移動します。このモードでは PSYS_SRC_ACCEL、PSYS_SRC_BURST_RADIUS、および場合によっては他のルールが無視されます。ターゲットがエミッターの「下」にあるときにPSYS_PART_BOUNCE_MASKを使用すると、リニアパーティクルストリームが上方に偏向し、ターゲットの上で終了します。 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
パーティクルのみばえ
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
PSYS_SRC_INNERANGLE float angle_inner 非推奨: 代わりに PSYS_SRC_ANGLE_BEGIN を使ってください 後継のルールと同様に動作しますが、エミッターの中心でなく表面が範囲の基準になる点が異なります。 10
PSYS_SRC_OUTERANGLE 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
PSYS_PART_START_GLOW float glow_start 発光時のパーティクルの光り方を指定します。有効な値は0.0(光らない)から1.0(光りまくる)の範囲です。 26
PSYS_PART_END_GLOW float glow_end パーティクルがライフタイム中に遷移するグローを指定します。有効な値はPSYS_PART_START_GLOWと同じです。 27
Particle Blending
Note: 注:パーティクルシステムのブレンドパラメータは、OpenGLのglBlendFuncに直接ラップしています。glBlendFuncの公式を含む詳細なドキュメントは、公式のglBlendFuncドキュメントに記載されています。
PSYS_PART_BLEND_FUNC_SOURCE integer bf_source ブレンド関数が、入力されたパーティクルの色とアルファ情報を使用してレンダリング結果を生成する方法を指定します。デフォルトはPSYS_PART_BF_SOURCE_ALPHAです。 24
PSYS_PART_BLEND_FUNC_DEST integer bf_dest ブレンド関数がレンダリング結果を生成するために現在のフレームバッファの色とアルファの情報をどのように使用するかを指定します。デフォルトはPSYS_PART_BF_ONE_MINUS_SOURCE_ALPHAです。パーティクルを背景と調和させて不透明感をなくし、発光させるには、destにPSYS_PART_BF_ONE、sourceにデフォルトを使用します。その他のブレンドの組み合わせでは、パーティクルテクスチャの不可視/アルファ部分がレンダリングされてしまいますが、テクスチャの不可視領域が黒一色の場合は別です(場合によっては白一色の場合もあります)。 25
V
a
l
u
e
s
PSYS_PART_BF_ONE ソースやデスティネーションのRGBA値をスケーリングしない。 0x0
PSYS_PART_BF_ZERO ソースまたはデスティネーションのRGBA値をゼロにします。 0x1
PSYS_PART_BF_DEST_COLOR RGBAの値をデスティネーションのRGBAの値でスケーリングします。 0x2
PSYS_PART_BF_SOURCE_COLOR RGBA値をパーティクルソースのRGBA値でスケーリングします。 0x3
PSYS_PART_BF_ONE_MINUS_DEST_COLOR RGBA値をデスティネーションの反転したRGBA値でスケーリングします。 0x4
PSYS_PART_BF_ONE_MINUS_SOURCE_COLOR RGBA値をパーティクルソースの反転したRGBA値でスケールします。 0x5
PSYS_PART_BF_SOURCE_ALPHA RGBA値をパーティクルソースのアルファ値でスケールします。 0x7
PSYS_PART_BF_ONE_MINUS_SOURCE_ALPHA RGBA値をパーティクルソースの反転したアルファ値でスケールします。 0x9
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 にだけ現れ、それらのうちで示したフラグはコメントアウトされています。

警告

  1. 放出期間 (PSYS_SRC_MAX_AGE) をゼロ以外に指定してパーティクルを使用すると、スクリプトが何も呼び出していないのに、パーティクルが再開してしまうことがあるでしょう。これは、プリムのプロパティが更新されたりビューワに送信されたりすると、エミッターが「リセット」されてしまうバグによるものです。結果として、 timer か強制 スリープ を使って、放出期間が切れたパーティクルを消去しなければならなくなります。 Debbie Trilling はこの回避策を投稿しました: http://forums-archive.secondlife.com/54/fa/260031/1.html#post1996465
  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 フラグが設定されると、アバターの Bounding Box の幾何学的中心に向かうことになります。残念なことに、これは股間を直撃するように見えてしまいます。アバターの別の部位を目標にしたい場合は、目標となるプリムを設置して、パーティクルを向かわせたい位置にそれを移動し、プリムのキーを PSYS_SRC_TARGET_KEY ルールの値に設定します。
  5. Second Life ビューワは、小さすぎて殆ど見えない遠くのオブジェクトを間引いて描画するという最適化をしています。エミッターが非常に小さく、距離が遠いために間引かれてしまっている場合、それに関連づいたパーティクルも描画されなくなります。

サンプル


この例では、だんだん大きくなる赤い球が放出されます。

llParticleSystem( [
        PSYS_PART_FLAGS,       PSYS_PART_WIND_MASK | PSYS_PART_EMISSIVE_MASK,
        PSYS_SRC_PATTERN,      PSYS_SRC_PATTERN_EXPLODE, 
        PSYS_PART_START_COLOR, <1.0, 0.0, 0.0>
    ] );

便利なスニペット

色と透過度を intteger で格納したり、 integer から復元したりするのに便利な関数:

integer ColorAlphatoRGBA(vector color, float alpha) {
    return (((integer)(alpha   * 255.0) & 0xFF) << 24) |
           (((integer)(color.x * 255.0) & 0xFF) << 16) |
           (((integer)(color.y * 255.0) & 0xFF) <<  8) |
            ((integer)(color.z * 255.0) & 0xFF);
}

vector RGBAtoColor(integer rgba) {
    return < ((rgba >> 16) & 0xFF) / 255.0, ((rgba >> 8) & 0xFF) / 255.0, (rgba & 0xFF) / 255.0 >;
}

float RGBAtoAlpha(integer rgba) {
    return ((rgba >> 24) & 0xFF) / 255.0;
}

注意点

  • ビューワが表示するパーティクル個数の標準は、通常 4096 に設定されています。これはクライアントが視野に入る全てのアクティブなパーティクルを描画する最大のパーティクル数です。良いパーティクルの設計の秘訣は、自分のパーティクルを「スパム」せず、他の人のパーティクルを締め出さないことです。例えば、もし自分のパーティクルエミッターが期待した数のパーティクルを放出していないという問題がある場合、このリソース枯渇の犠牲になっているかもしれません。パーティクルはどちらかというと描画の優先度が低いので、クライアント/ビューアのラグ (低フレームレート) も同様の問題を起こします。最善の解決策は、設計やテストのときに、他のパーティクルがあまりないラグの少ない環境に移動することです。
  • パーティクルが一旦発生すると、移動方向は PSYS_SRC_ACCEL 、PSYS_PART_TARGET_POS_MASK フラグ、 PSYS_PART_FOLLOW_SRC_MASK によってのみ制御されます。例えば "渦を巻く竜巻" の効果 (オブジェクトが喋る時、撤去される時、アバターが SIM/グリッドを立ち去る時にビューワで使われるような効果) を作成する良い方法というものはありません。その効果は、パーティクルの発生源を動かすことで実現可能です。(例えば旋回スクリプトで。)

関連項目

関数

•  llLinkParticleSystem

記事

•  LSL での色
•  透明度

特記事項

欠番 14

14 という値を持つはずだった欠番の定数があり、基本的な列挙型 LLPSScriptFlags がそれを LLPS_SRC_BURST_DURATION という識別子で持っていますが、クライアントのソースで全く使われていません。炸裂持続時間が PSYS_SRC_BURST_PART_COUNT と PSYS_SRC_BURST_RATE で決まることを考えれば、これは当然です。

Search JIRA for related Issues

脚注

  1. ^ 訳注:本来 "Particle System" とは "Particle" (粒子) の集合を指し、厳密には「パーティクルシステム」と訳すべきところですが、日本の SL ユーザの大半がこのパーティクルシステム自体を「パーティクル」と称し、逆に「システム」はコンピュータシステムのようなものを連想させてしまう可能性があることから、「パーティクル」と訳します。

Signature

function void llParticleSystem( list rules );
この翻訳は 原文 と比べて古いですか?間違いがありますか?読みにくいですか?みんなで 修正 していきましょう! (手順はこちら)
この項目はあなたにとって参考にならない項目ですか?もしかしたらLSL Wikiの関連した項目が参考になるかもしれません。