VRエンジン作成日記

ひたすらVRエンジンを作っていきます

ParticleSystemを修正2

ParticleSystemを修正した。可能な限りUnityのShurikenを再現しようと思ったら、AnimationCurveの実装が難しかった。キーフレームを追加してベジェ曲線を描くような構造になってるんだけど、発想を理解するまでに時間がかかってしまった。まだ完全には実装できていないため、明日続きを書くつもり。

ベジェ曲線は次のサイトに詳しい説明が書いてあった。このサイトに書かれている内容が理解できれば、Adobeイラストレータの描画部分も実装できるのではないかというくらい詳しい。

pomax.github.io

UnityのAnimationCurveクラスのEvaluateメソッドの値は、次の式でおおよそ計算できるようだ。

Value = pow(1 - t, 3) * P0 + 3 * pow(1 - t, 2) * t * P1 + 3 * (1 - t) * pow(t, 2) * P2 + pow(t, 3) * P3

P0からP3はキーフレームの値で、P0、P3がそれぞれアンカーポイント、P1、P2がコントロールポイントになる。細かい実装内容を書くと、上の式からさらにweightとtangentで値を調整する機能も入っている。weightを適用しない場合、P1、P2の値はそれぞれX方向に1/3、2/3の座標を取る。weightを適用する場合は、1/3、2/3以外の値を指定することができる。tangentは数学のタンジェントの考え方そのままで、縦/横の値、つまり傾きということになる。outプリフィックスが付いている値は、次の値に向かう時に使用される。inプリフィックスは前の値から入ってくる時に使われる。

整理すると、

コントロールポイント P0、P3

・X: Keyframe.time

・Y: Keyframe.value

アンカーポイント P1

・X: Keyframe.outWeight (P0の値)

・Y: Keyframe.outTangent (P0の値)

 アンカーポイント P2

・X: Keyframe.inWeight (P3の値)

・Y: Keyframe.inTangent (P3の値)

という感じになる。また、Keyframe.weightedModeを使ってoutWeight、inWeightの扱い方を変えることができる。WeitedMode.Noneの場合は、outWeightが右方向に1/3、inWeightが左方向に1/3になる。Noneの場合は、実際に指定したoutWeight、inWeightの値は無視されるようだ。outTangentを0にした場合は、まっすぐ右方向を指し、inTangentを0にした場合は、まっすぐ左方向を指す。

まだ調べきれていないけど、AnimationCurve.preWrapMode、AnimationCurve.postWrapModeを使って、X方向の範囲外の処理を指定できるようだ。

・関連するコミット

fix particle system · hikipuro/tea.js@aa614e8 · GitHub