AS3のオープンソースライブラリ「stardust」の中身(2):Emitter

2010年01月17日  投稿者:ハセガワ
パーティクルの発生源Emitterクラスのメソッド
ブックマークする:

進行状況

→第6回:何か作りたい(1):よくあるきらきらしたやつ(ソースあり)
→第5回:Classの中身(2):Emitter2Dクラス(調査中)
→第4回:Classの中身(1):Clockクラス(調査中)
→第3回:お勉強(3):パーティクルがよける…Deflectorクラスで障害物
→第2回:お勉強(2):マウスで作る、やめる…Emitter.active
→第1回:お勉強(1):とりあえず何か出来た

パーティクルを生成する手順(2D)

stardustを使ってパーティクルを作るための基本的な順番は、公式マニュアルによると

(1)Clockを作る…パーティクル発生の頻度
(2)Emitterを作ってclockをセット…エミッターって発生装置みたいなもの(?)
(3)Rendererを作る…画面表示用オブジェクト(?)
(4)Renderer.addEmitter( Emitter )でエミッターをレンダラーにセット
(5)Emitter.addInitializer( 発生場所とか発生させるspiteとか )でエミッターを初期設定
(6)Emitter.addAction( 寿命の長さとか重力とか )で実際の動きを設定
(7)Event.ENTER_FRAMEやTimerEvent.TIMERに、Emitter.step()を関連づけて表示を更新

となっている。

Emitter2Dクラス(idv.cjcat.stardust.twoD.emitters

2D用のエミッターを作る。
僕はCGにもパーティクルにも全く詳しくないので、正直理解してません。
エミッターというのは、おおよそ、パーティクルの発生源、フキダシ口と考えてよいでしょうか。

//設定例
var emitter:Emitter2D = new Emitter2D(clock);//引数をclockにして生成
Emitter2Dオブジェクトが出来ること

Emitter2D.addInitializer(初期設定)
エミッター装置の初期設定をする。
初期設定できる主な値は以下の通り。

クラス(抜粋) 内容
Life(Randomオブジェクト) パーティクルの寿命の範囲
Mass(Randomオブジェクト) パーティクルの固まり具合(?)の範囲
Scale(Randomオブジェクト) パーティクルの粒の大きさの範囲
Alpha(Randomオブジェクト) パーティクルの不透明度の範囲
以下、twoD. Initializers内
DisplayObjectClass
( displayObjectClassオブジェクト)
パーティクル自身のクラスを指定(雨粒とか点とかを作るクラス)
Position( zoneオブジェクト) パーティクルの発生するエリアを指定→idv.cjcat.stardust.twoD.zones
2DのZoneクラス)CircleZone,Line,RectZone,SectorZone,SinglePoint,LazySectorZoneなど
Velocity( zoneオブジェクト) パーティクルの速度(?)を指定→idv.cjcat.stardust.twoD.zones
2DのZoneクラス)CircleZone,Line,RectZone,SectorZone,SinglePoint,LazySectorZoneなど
Rotation( Randomオブジェクト) パーティクルの動く角度の範囲
Omega( Randomオブジェクト) オメガって何ですか?角速度?

・基本的に数字じゃなくてアバウトな範囲で指定する感じ。
・Randomオブジェクトは new UniformRandom( 初期値 , 範囲 )で作れるっぽい。
  new UniformRandom( 5 , 5 )なら、0~10の範囲でランダムな数が作られる(と思う)。


Emitter2D.addAction(アクション)
重力や障害物(パーティクルが避けて通る)などの動きの設定をする
設定できる主なアクションは以下(ただし調査中)
多すぎてわけわからなくなりそうなので、後日整理。

設定できるクラス 内容
Age(Number) 初期値:1。Lifeで設定した寿命に対して、消えるまでの時間(?)
DeathLife(しきい値:Number) パーティクルが寿命を迎えた時に「取り除く」場合はこれを必ずONにする。
AlphaCurve
(inLifespan:Number = 0, outLifespan:Number = 0, inFunction:Function = null, outFunction:Function = null)
寿命内でのパーティクルの透明度の変化具合をpenner.easingで調節できる…らしいが未検証。
ScaleCurve
(inLifespan:Number = 0, outLifespan:Number = 0, inFunction:Function = null, outFunction:Function = null)
寿命内でのパーティクルのサイズの変化具合をpenner.easingで調節できる…らしいが未検証。
以下、twoD.actions内
Accelerate( acceleration:Number = 0.1 ) パーティクルの加速度
Damping( damping:Number = 0 ) パーティクルの減速。1で停止。
collide() パーティクル同士が衝突すると互いに反発する(?)…調査中
Deflect() deflect.addDeflector( deflectorオブジェクト )で障害物を生成。
その後、Emitter2D.addAction( deflect ) でアクションに追加。
Explode( x, y, strength, growSpeed, maxDistance, attenuationPower, epsilon) 特定の座標から衝撃波を起こす(?)
FollowWaypoints( waypoints:Array = null, loop:Boolean = false, massless:Boolean = true) 特定の座標をパーティクルが通過するようになる(?)
Gravity() Fieldオブジェクトに対して重力をかける
Impulse(field:Field = null) Fieldオブジェクトに対して加速をかける
Move(multiplier:Number = 1) パーティクルの動きを増幅する。例えば2にすれば同じ速度で2回動く(?)
Oriented(factor:Number = 1, offset:Number = 0) 調査中
RandomDrift(maxX:Number = 0.2, maxY:Number = 0.2, randomX:Random = null, randomY:Random = null) ランダムな加速をさせる
Snapshot パーティクルのステータスを記録したり戻したり(?)
Spawn(count:Random = null, inheritDirection:Boolean = true, inheritVelocity:Boolean = false) パーティクルの分裂(?)花火やロケット噴射っぽい表現に使うと書いてある。
SpeedLimit(limit:Number) パーティクルの限界速度を指定
Spin(multiplier:Number = 1) 角速度omegaに対して回転数を指定


多分、ほとんどパーティクルの動きはInitializeとActionで決定することになりそうなので、
覚えたら色んなことができそう。

できなかったこと、やりたいこと。

・3Dもやってみたい。よしやってみよう。

僕が買った、もしくは買う予定の参考書
ブックマークする
FlaTech+を購読する
  • 全記事を含むRSSfeed
  • このページをブックマーク: