パーティクルフローとTPの対応表

http://hammerbchen.blogspot.jp/2012/01/particleflowthinkingparticles.html

こちらのサイトから引用して。
結構この記事はtwitterなんかでも紹介されてますけど、今日話しに出たので再度まとめ。

ThinkingParticles

Particle Flow

Particle Age

Age Test

StdForce

Force

Position Born

Position Object

Particle Die

Delete

Friction

Force + Drag

Surface Follow

Speed by Surface

Std Shape

Shape

Geom Instance

Shape Instance

Rep Bounce

Keep Apart

PAttach

Lock/Bond

UDflector/StdCollision

Collision

Bring To

Find Target

社内の人が早くTPを覚えれるようにこのブログを立ち上げてますんで、こういうのはありがたい。
このブログいつも見てますが他の記事も凄くいいですよね。

DataChannel オペレータとは何か

最近わかったんですがmemoryオペレータってそのダイナミクスセットをキャッシュにしてしまうと動かなくなってしまうんですね。それを回避したかったのでtwitterで聞いたところDataChannelを使うとよいよいう返答が帰ってきました。
これがまたデータの流れがわかりにくい。またいつものトレイルでシーンを作ったので流れを図解してみた。

image

一個目の「Born Particles」ダイナミクスセットで出てきた数値(ポリゴンのカウント数)を次の「traile」ダイナミクスセットに持っていって使うことが(sizeに入れている)出来ている。memoryオペレータに似てはいるが、キャッシュをオンにしても作動する。しかしその反面depthが無いので過去の数値はたぶん取れない。
なんでこんなオペレータがあるのかはまだハッキリしないけど(memoryオペレーターがキャッシュをオンでも動作すればいいだけでは?)とりあえずこれがないとキャッシュが全然取れないのでdepthを使わないならこれを頻繁に使って組んでいこうと思う。

突っ込みあったらお願いします。

Group Rollout

Group Rollout

パーティクルをグループ分けするtPで要の機能。SCの動きにも関係するShape Collision Dynamicsのパラメーターもここにある。

image22_1.gif
Color – ビューポートでのカラー

Display Dropdown – ビューポードでどんなタイプで表示するか。

image23_1.gif
Besides the standard particle viewport display styles, thinkingParticles offers a display option that shows the Particle ID for each particle. This ID can be used in conjunction with the PSelection Operator to delete specific particles for example.

A Particle ID is only valid as long as the particle exists. When it dies, this number can be recycled for other particles. Test for a specific particle ID should be performed within an appropriate time frame.

Show Mesh checkbox – これをアクティブにするとパーティクルがメッシュの場合メッシュが表示される。

Renderable – when checked, the particles in this group will be rendered. Note, this is not a value that is passed on below the hierarchy.
Data Channels – This window contains a list of all extra Data Channels that have been created for use with a particular group. thinkingParticles offers many advanced concepts to control or handle particles. One new concept is the option to attach any kind of data value to a particle through what are called Data Channels. Data Channels are a very flexible way of adding features to a particle that are not known to the system beforehand. To learn more about how Data Channels function, go HERE.
Name space – Just above the Channel Type dropdown list is a blank space. This text field allows you to type in a descriptive name that is to be associated with a newly created Data Channel. While this may seem like a common sense move, please be sure to type in a name in this field BEFORE you hit the ADD button to create the new Data Channel.
Channel Type – This dropdown menu provides you with a list of Data Channel value types that you can use to create new Data Channel output data streams for your Particle Groups.
mastergroup_all_rollout_float_dropdown.bmp
REM. – Click on the Remove button to remove a selected Data Channel from the list window.
ADD – Click on the Add button to add a new Data Channel to the list window. Be SURE you’ve entered a name in the Name Space prior to clicking ADD so that you new Data Channel has a recognizable name.

Shape Collision Dynamics

image
Elasticity弾力性 100で反発力1。つまり1mの高さからボールを落としたら1m跳ね返る。100以上になるとエネルギーが増すんで注意。

Dynamic Friction動摩擦。パーティクル同士が衝突するときの摩擦力This spinner sets the friction (power loss) between particles when they collide with each other. Be aware that this power loss happens only on impact.

Static Friction静摩擦。 パーティクル同士が接触しているときの摩擦力。これが低いと滑りやすい。

Delay Frames遅延フレームThis spinner sets a delay value for the dynamic calculation of a particle. A Delay Frames value of 10 means that 10 frames after the particle is born, the physics engine kicks in and takes control through the dynamic rules that are present.
Optimize – Activate this checkbox to enable the parameters found in the Collision Optimize rollout menu. When active, the face counts within the colliding meshes will be automatically reduced. This face reduction is only done “internally” for the collision objects and not for the rendering mesh. This option may speed up the dynamic simulation enormously. However, if overdone the results may be incorrect.
Active – Select this option to make the particles in the selected group respond to all forces, including dynamic simulations.
Neutron – When this option is active, all particles in this group will be treated as a passive dynamic object. By passive dynamic, we are referring to how the particles will react to other particles and objects within your scene. Collisions between this passive object and other particles will occur, but it will remain uninfluenced by both the particle collisions and forces in your scene.

Particles in this group will also not respond to any force fields or space warps.

Frozen – Activate this radio button to get hybrid particle behavior. In this state, the particles in the selected Group behaves somewhere between the Active and Unyielding states. All particles in this group will be born as dynamically sleeping. In other words, they will not respond to any forces at all except impulses (such as collisions – only forces like Gravity and Wind will have no effect when in sleep mode). In the event of an impulse interacting with the particles in the group, the particles will becomedynamically awake and respond to standard dynamics like other active objects.  

Shape Collision Operator

Voxel Grid – This spinner defines the number of cubic subdivisions that are calculated to wrap the objects outer boundaries. Higher values will produce more accurate simulation characteristics, however the dynamics calculations will take longer.
Edges Samples – This spinner is used to add extra collision points along edges of an object. This value should be increased with objects that have long stretched edges (e.g. a long box object) or sliver triangles. If this value is too low, objects may penetrate each other along their edges.
Velocity Friction – This spinner’s value is based on the relative speed difference between two particles. The slower particle will force the faster one to slow down. Higher values will cause the particles to slow down more rapidly. This can be used to simulate viscous materials such as oil, sludge or molasses.

Frozen First Activation

The following parameters are only valid for the first activation of a Frozen object. After the object has changed state the parameters are no longer valid or considered.
Velocity Thresh – sets a Velocity Threshold that should be used to really wake a particle up.
Rotation Thresh – defines the rotational speed that needs to be there to really wake the particle up.
Motion Inheri. – sets the motion inheritance multiplier at wake-up time for a frozen particle

Deformation

Max Depth – sets the maximum penetration depth allowed, for a deforming particle.
Radius – defines the “compression” radius or area the deformation might occur within a deforming particle.
Impulse Thresh. – sets the minimum impulse needed, to start a deformation of  a particle object.

PhysX Operator

The following parameters are for the NVIDIA PhysX engine valid, only. Other dynamic solvers will not be affected by those settings.
Box – sets the particles to a BOX collision mode. All particles will be treated as highly optimized procedural boxes. This speeds up shape collisions a lot.
Sphere – when checked, the collisions will all be treated as Spherical collisions regardless of the real shapes the particles might have.
Convex Mesh – check this option, to use the Convex hull of the particle shapes to calculate shape collisions.
Triangle Mesh – when checked, the real triangle mesh of the particle object will be used for collision detection between particles.

There is only ONE object allowed in a scene that has this Triangle Mesh flag turned on! PhysX does not support multiple triangle Mesh collisions in a scene.

Shape Collision Optimize

The controls within this rollout adjust the degree of optimization of objects involved in collision detection.
mastergroup_optimize_rollout.bmp
Off Under Faces – This spinner sets a numerical face threshold for optimization. If an object has fewer faces than the specified value, then it will be ignored for optimization purposes.
Face Thresh – This spinner sets the threshold angle used to determine which faces are collapsed. Low values produce less optimization and better approximations of the original shape. Higher values improve optimization, but are more likely to result in sliver faces that render poorly (see Bias for how to control this).
Edge Thresh – This spinner sets a different threshold angle for open edges (those that bound only one face). A low value preserves open edges. At the same time you can apply a high face threshold to get good optimization.
Bias – This spinner helps eliminate skinny or degenerate triangles that occur during optimization which can cause rendering artifacts. Higher values keeps triangles from becoming degenerate. The default of 0.1 is generally enough to eliminate the skinniest triangles. Range=0.0 to 1.0

A value of 0.0 turns Bias off.

Max Edge Len. – This spinner specifies the maximum length beyond which an edge cannot be stretched when optimized. When Max Edge Len is set to 0.0, it has no effect. Any value greater than 0.0 specifies the maximum length of the edges. When used in concert with the Bias spinner, this control helps you avoid creating long skinny faces while optimizing.
Preserve Smooth Boundaries – When this checkbox is active, the optimization routine only allows faces that share at least one smoothing group to be collapsed.

Surface Posをちゃんと知らなければ破壊から煙は作れないのではないか

前回の破壊した所から煙を発生させたい
の記事で破壊から煙を発生させたくて色々ためしてみたんだけど、どうやらちゃんとSurface Posオペレーターを使いこなさないといけない気がしてきた。

ブログをあさったり

こういうのを見たりを2日間ほど探ってみたんだけど、結局わからず、どうやってもnodeを使わずにグループで発生したオブジェクトからSurfacePosにつなげない。
しびれを切らしてtwitterの#tpjpで質問w。やはりまた米岡さんに教えてもらいました。米岡さんいなかったら終わってるだろ・・。

リンク
@velvetface できますよ。グループのパーティクルアウトプットをSurfacePosのparticlechapeに繋げばOKです。ここは自分も最初分かるまで時間食いました。ちなみにポリゴンのIDごとに発生源を指定することができますが、(続く) #TPJP

リンク
@velvetface 例えばID2のサーフェイスから出したい場合はIDが2つ以上あるマルチマットマテリアルがオブジェクトにアサインされている必要があります。ここは普通にやってたら絶対気がつかないので注意してください^^; #TPJP

 

そしてあっさり出来ると。

いつもありがとうございます。英語wikiをじっくり読まないといけないかなあ。
今回はどの面から出ているかわかりにくいので次回はIDまわりちゃんと調査します。

破壊した所から煙を発生させたい

VolumeBreakとSCで変な動きの検証。その後 でやったシーンに煙を足す準備。

image 地面ヒットところ

 

しかしいくつか問題があって

・分割したオブジェクトの中心から煙(水色のパーティクル)が出てしまっている。サーフェスから出したい。
・出来れば分割した断面からのみ煙(水色のパーティクル)を出したい。
・Memoryオペレーターでヒットしたところとタイミングを取り出して地面から出る煙(赤色のパーティクル)を作っているが何故か一回目しか出ない。

赤い煙が一回しか出ないのはホントおかしい。
これはVolumeBreakをアクティブにするときに使ったパーティクルの発生情報とポジションをMemoryオペレーターに記憶して使っているので毎回出るような気がするんだけど。デバッグしたら数字が出まくって重くなったので今度気合をいれてみてみよう。

やりたいことから逆算してチュートリアルを探してはシーンを構築していっているので、まだまだ知らないこと多いなあ。

VolumeBreakとSCで変な動きの検証

前回の記事でおかしかったのでSCを検証

image

とりあえず動きがおかしいのはどう考えてもSCのせいなのでVolumeBreakまわりをオフにして検証。

やっぱ動きおかしいね。SCを調べます。

joeさんのチュートリアルのファイルのVolumeBreakまわりをオフにしてシミュレートしてみると。

おや。なんかおかしい。
接地の直前で減速しているし、重心から考えるとヒットした瞬間コテンと回転しそうなのにな(これは摩擦のせいかも)

image
SCのshow voxelをすると格子が見える。ここで減速してるっぽい。
でもPhysxみたいに完全に無視されているわけではないみたい。
なので精度なんだろう。
SCを調べる。
—————追記—————

調べてみたけどよくわからなかった。

唯一Physics RolloutのCollision IterationContact Iterationの数値を下げると格子での減速が収まった。なんだこれ。

—————追記2—————
voxelあげたらこんなんですよ。いやー意味わからないです。

SCに集中したチュートリアル探そう。

—————追記3—————
こういうのだとうまくいってるような。

VolumeBreakとSCで変な動き

あまり調整してないのでスピード感がおかしいのはともかく。
VolumeBreakで分割してSCで落下させたんだけど、(更に衝突スピードで崩壊がアクティブになるかの判定もやっている)何故か落下後の動きがおかしい。
なんだか起き上がっているように見える。
破片同士も埋まってるような気もするし。
よくわかってないのにチュートリアルどうりにやって基礎がおろそかなので、もっとシンプルに組んで検証しようと思う。

memory オペレーターのdepthが何なのか調べてみた

ツイッターでMemoryオペレーターのdepthがどういう働きなのかという話題があがっていたので間単に調べてみた。

まずはObj.To Particleでパーティクルを適当に動かしてみる。

シンプルな動き。

この動きをMemoryオペレーターのpositonで保存する。depthの深さを10にしてみる。 

次に、新たにMemoryオペレーターをつくります。そのオペレータから記録したポジション情報を取り出し、Positon Bornオペレータで新しいパーティクルを発生させる。スピードを0、lipespanを30、レート(count)を10にする。

簡単なトレイルのようなものが出来た。

ここで更に記録を取り出したMemoryオペレーターのdepthの数値を変えてみる。
Integerヘルパーを出してMemoryオペレーターのdepthに繋ぎ、数値を10にする。

するとこのような動きになる。

https://twitter.com/notchmen/status/207360148627398657
@notchmenさんの発言によると
depthを指定してやることで、過去情報を取り出せます

ということですので。 そのとおりdepthを10にすると10f過去の数値を取り出せているようですね。ちゃんとdepthを理解できたということでいいかな?

米岡さんの記事をやってみる:(TP Basic) Memory Operatorの基本

http://sky-high-nest.sblo.jp/article/51381532.html

本当に親切に解説してくれていた。

今回触れられていないけど、memory オペレータのdepthの意味がわからなかったのでリファレンスを読んでみようとしたが、さっぱり。joeさんのDVDでもdepthを99にする作業が頻繁に出てくるがいまだによくわからない。
もしかして。Memory Operatorのdepthが0でいいっていうのは毎フレームごとに格納して使用して、ってやってるからdepth0でいいんだろうか。
今回だと、床にヒットするパーティクルが1fに複数の場合に0以上が必要なのかも。

あと使ったノードで不明だった点をメモとしてまとめた。

value To timeその3:Value To Timeでのノーマライズの実際

前回LifeSpanにバリエーションをつけずにすべて60fとしたもので作りました。それが以下です。

そこでLifeSpanのVariationを50%にしてみる。

すると以下のようになる。

variationによって短くなっているヤツの消え方がおかしいですね。
ログを見てみると。

t = 0 dt = 160
birth >> *Age = Frames=0 Ticks=0
t = 160 dt = 160
birth >> *Age = Frames=1 Ticks=0
t = 320 dt = 160
birth >> *Age = Frames=2 Ticks=0
t = 480 dt = 160
birth >> *Age = Frames=3 Ticks=0
t = 640 dt = 160
birth >> *Age = Frames=4 Ticks=0
t = 800 dt = 160
birth >> *Age = Frames=5 Ticks=0
t = 960 dt = 160
birth >> *Age = Frames=6 Ticks=0
t = 1120 dt = 160
birth >> *Age = Frames=7 Ticks=0
t = 1280 dt = 160
birth >> *Age = Frames=8 Ticks=0
t = 1440 dt = 160
birth >> *Age = Frames=9 Ticks=0
t = 1600 dt = 160
birth >> *Age = Frames=10 Ticks=0
t = 1760 dt = 160
birth >> *Age = Frames=11 Ticks=0
t = 1920 dt = 160
birth >> *Age = Frames=12 Ticks=0
t = 2080 dt = 160
birth >> *Age = Frames=13 Ticks=0
t = 2240 dt = 160
birth >> *Age = Frames=14 Ticks=0
t = 2400 dt = 160
birth >> *Age = Frames=15 Ticks=0
birth >> *Age = Frames=0 Ticks=0
t = 2560 dt = 160
birth >> *Age = Frames=16 Ticks=0
birth >> *Age = Frames=1 Ticks=0
t = 2720 dt = 160
birth >> *Age = Frames=17 Ticks=0
birth >> *Age = Frames=2 Ticks=0
t = 2880 dt = 160
birth >> *Age = Frames=18 Ticks=0
birth >> *Age = Frames=3 Ticks=0
t = 3040 dt = 160
birth >> *Age = Frames=19 Ticks=0
birth >> *Age = Frames=4 Ticks=0
t = 3200 dt = 160
birth >> *Age = Frames=20 Ticks=0
birth >> *Age = Frames=5 Ticks=0
t = 3360 dt = 160
birth >> *Age = Frames=21 Ticks=0
birth >> *Age = Frames=6 Ticks=0
t = 3520 dt = 160
birth >> *Age = Frames=22 Ticks=0
birth >> *Age = Frames=7 Ticks=0
t = 3680 dt = 160
birth >> *Age = Frames=23 Ticks=0
birth >> *Age = Frames=8 Ticks=0
t = 3840 dt = 160
birth >> *Age = Frames=24 Ticks=0
birth >> *Age = Frames=9 Ticks=0
t = 4000 dt = 160
birth >> *Age = Frames=25 Ticks=0
birth >> *Age = Frames=10 Ticks=0
t = 4160 dt = 160
birth >> *Age = Frames=26 Ticks=0
birth >> *Age = Frames=11 Ticks=0
t = 4320 dt = 160
birth >> *Age = Frames=27 Ticks=0
birth >> *Age = Frames=12 Ticks=0
t = 4480 dt = 160
birth >> *Age = Frames=28 Ticks=0
birth >> *Age = Frames=13 Ticks=0
t = 4640 dt = 160
birth >> *Age = Frames=29 Ticks=0
birth >> *Age = Frames=14 Ticks=0
t = 4800 dt = 160
birth >> *Age = Frames=30 Ticks=0
birth >> *Age = Frames=15 Ticks=0
birth >> *Age = Frames=0 Ticks=0
t = 4960 dt = 160
birth >> *Age = Frames=31 Ticks=0
birth >> *Age = Frames=16 Ticks=0
birth >> *Age = Frames=1 Ticks=0
t = 5120 dt = 160
birth >> *Age = Frames=32 Ticks=0
birth >> *Age = Frames=17 Ticks=0
birth >> *Age = Frames=2 Ticks=0
t = 5280 dt = 160
birth >> *Age = Frames=33 Ticks=0
birth >> *Age = Frames=18 Ticks=0
birth >> *Age = Frames=3 Ticks=0
t = 5440 dt = 160
birth >> *Age = Frames=34 Ticks=0
birth >> *Age = Frames=19 Ticks=0
birth >> *Age = Frames=4 Ticks=0
t = 5600 dt = 160
birth >> *Age = Frames=35 Ticks=0
birth >> *Age = Frames=20 Ticks=0
birth >> *Age = Frames=5 Ticks=0
t = 5760 dt = 160
birth >> *Age = Frames=36 Ticks=0
birth >> *Age = Frames=21 Ticks=0
birth >> *Age = Frames=6 Ticks=0
t = 5920 dt = 160
birth >> *Age = Frames=37 Ticks=0
birth >> *Age = Frames=22 Ticks=0
birth >> *Age = Frames=7 Ticks=0
t = 6080 dt = 160
birth >> *Age = Frames=38 Ticks=0
birth >> *Age = Frames=23 Ticks=0
birth >> *Age = Frames=8 Ticks=0
t = 6240 dt = 160
birth >> *Age = Frames=39 Ticks=0
birth >> *Age = Frames=24 Ticks=0
birth >> *Age = Frames=9 Ticks=0
t = 6400 dt = 160
birth >> *Age = Frames=40 Ticks=0
birth >> *Age = Frames=25 Ticks=0
birth >> *Age = Frames=10 Ticks=0
t = 6560 dt = 160
birth >> *Age = Frames=41 Ticks=0
birth >> *Age = Frames=26 Ticks=0
birth >> *Age = Frames=11 Ticks=0
t = 6720 dt = 160
birth >> *Age = Frames=42 Ticks=0  一個目終了age42
birth >> *Age = Frames=27 Ticks=0
birth >> *Age = Frames=12 Ticks=0
t = 6880 dt = 160
birth >> *Age = Frames=0 Ticks=-1
birth >> *Age = Frames=28 Ticks=0
birth >> *Age = Frames=13 Ticks=0
t = 7040 dt = 160
birth >> *Age = Frames=29 Ticks=0
birth >> *Age = Frames=14 Ticks=0
t = 7200 dt = 160
birth >> *Age = Frames=30 Ticks=0
birth >> *Age = Frames=15 Ticks=0
t = 7360 dt = 160
birth >> *Age = Frames=31 Ticks=0
birth >> *Age = Frames=16 Ticks=0
t = 7520 dt = 160
birth >> *Age = Frames=32 Ticks=0
birth >> *Age = Frames=17 Ticks=0
t = 7680 dt = 160
birth >> *Age = Frames=33 Ticks=0
birth >> *Age = Frames=18 Ticks=0
t = 7840 dt = 160
birth >> *Age = Frames=34 Ticks=0
birth >> *Age = Frames=19 Ticks=0
t = 8000 dt = 160
birth >> *Age = Frames=35 Ticks=0
birth >> *Age = Frames=20 Ticks=0
t = 8160 dt = 160
birth >> *Age = Frames=36 Ticks=0
birth >> *Age = Frames=21 Ticks=0
t = 8320 dt = 160
birth >> *Age = Frames=37 Ticks=0
birth >> *Age = Frames=22 Ticks=0
t = 8480 dt = 160
birth >> *Age = Frames=38 Ticks=0
birth >> *Age = Frames=23 Ticks=0
t = 8640 dt = 160
birth >> *Age = Frames=39 Ticks=0
birth >> *Age = Frames=24 Ticks=0
t = 8800 dt = 160
birth >> *Age = Frames=40 Ticks=0
birth >> *Age = Frames=25 Ticks=0
t = 8960 dt = 160
birth >> *Age = Frames=41 Ticks=0
birth >> *Age = Frames=26 Ticks=0
t = 9120 dt = 160
birth >> *Age = Frames=42 Ticks=0
birth >> *Age = Frames=27 Ticks=0
t = 9280 dt = 160
birth >> *Age = Frames=43 Ticks=0  2個目終了age43
birth >> *Age = Frames=28 Ticks=0
t = 9440 dt = 160
birth >> *Age = Frames=0 Ticks=-1
birth >> *Age = Frames=29 Ticks=0
t = 9600 dt = 160
birth >> *Age = Frames=30 Ticks=0
t = 9760 dt = 160
birth >> *Age = Frames=31 Ticks=0
t = 9920 dt = 160
birth >> *Age = Frames=32 Ticks=0
t = 10080 dt = 160
birth >> *Age = Frames=33 Ticks=0
t = 10240 dt = 160
birth >> *Age = Frames=34 Ticks=0
t = 10400 dt = 160
birth >> *Age = Frames=35 Ticks=0
t = 10560 dt = 160
birth >> *Age = Frames=36 Ticks=0
t = 10720 dt = 160
birth >> *Age = Frames=37 Ticks=0
t = 10880 dt = 160
birth >> *Age = Frames=38 Ticks=0
t = 11040 dt = 160
birth >> *Age = Frames=39 Ticks=0
t = 11200 dt = 160
birth >> *Age = Frames=40 Ticks=0
t = 11360 dt = 160
birth >> *Age = Frames=41 Ticks=0
t = 11520 dt = 160
birth >> *Age = Frames=42 Ticks=0
t = 11680 dt = 160
birth >> *Age = Frames=43 Ticks=0
t = 11840 dt = 160
birth >> *Age = Frames=44 Ticks=0
t = 12000 dt = 160
birth >> *Age = Frames=45 Ticks=0
t = 12160 dt = 160
birth >> *Age = Frames=46 Ticks=0
t = 12320 dt = 160
birth >> *Age = Frames=47 Ticks=0
t = 12480 dt = 160
birth >> *Age = Frames=48 Ticks=0
t = 12640 dt = 160
birth >> *Age = Frames=49 Ticks=0
t = 12800 dt = 160
birth >> *Age = Frames=50 Ticks=0  3個目終了age50
t = 12960 dt = 160
birth >> *Age = Frames=0 Ticks=-1

となっています。
3個パーティクルがあって1つめから順番に
LifeSpan(age)が42、43、50となっています。
そのため本来60まであることを想定されたValue To TimeとFloatの仕組みが途中で切れているので最後の縮小までいけてません。
つまりLifeSpanのVariationが0%なら全部60なので問題がないのだけど、Variationが入っちゃうと60以外の数字が入ってきちゃうのでなんとかしなければいけないというわけみたいです。

じゃあどうするかというと、
ここで米岡さんのサイトには
(TP Basic)Value To Timeの基本
ライフスパンのノーマライズとは「パーティクルエイジ÷ライフスパン」の計算をして0から1の結果を求めることです 。

とあります。
ちょっとやってみてDebugで数値をみてみましょう。

わかりやすいようにパーティクルは一個。
O birthのLifeSpanとAgeからAdd&Multiplyに繋いでA/Bの計算をします。
その計算結果をDebugで見てみましょう。
Debugはどこかに繋がないと出ないのでちょっとFloatに繋がせてもらいましょう。
それでこの計算結果ですが、0fからタイムスライダーを進めていくと以下のようになりました。

Add&Multiply >> Value = 0
t = 160 dt = 160
Add&Multiply >> Value = 0.0233952
t = 320 dt = 160
Add&Multiply >> Value = 0.0467905
t = 480 dt = 160
Add&Multiply >> Value = 0.0701857
t = 640 dt = 160
Add&Multiply >> Value = 0.0935809
t = 800 dt = 160
Add&Multiply >> Value = 0.116976
t = 960 dt = 160
Add&Multiply >> Value = 0.140371
t = 1120 dt = 160
Add&Multiply >> Value = 0.163767
t = 1280 dt = 160
Add&Multiply >> Value = 0.187162
t = 1440 dt = 160
Add&Multiply >> Value = 0.210557
t = 1600 dt = 160
Add&Multiply >> Value = 0.233952
t = 1760 dt = 160
Add&Multiply >> Value = 0.257348
t = 1920 dt = 160
Add&Multiply >> Value = 0.280743
t = 2080 dt = 160
Add&Multiply >> Value = 0.304138
t = 2240 dt = 160
Add&Multiply >> Value = 0.327533
t = 2400 dt = 160
Add&Multiply >> Value = 0.350928
t = 2560 dt = 160
Add&Multiply >> Value = 0.374324
t = 2720 dt = 160
Add&Multiply >> Value = 0.397719
t = 2880 dt = 160
Add&Multiply >> Value = 0.421114
t = 3040 dt = 160
Add&Multiply >> Value = 0.444509
t = 3200 dt = 160
Add&Multiply >> Value = 0.467905
t = 3360 dt = 160
Add&Multiply >> Value = 0.4913
t = 3520 dt = 160
Add&Multiply >> Value = 0.514695
t = 3680 dt = 160
Add&Multiply >> Value = 0.53809
t = 3840 dt = 160
Add&Multiply >> Value = 0.561486
t = 4000 dt = 160
Add&Multiply >> Value = 0.584881
t = 4160 dt = 160
Add&Multiply >> Value = 0.608276
t = 4320 dt = 160
Add&Multiply >> Value = 0.631671
t = 4480 dt = 160
Add&Multiply >> Value = 0.655066
t = 4640 dt = 160
Add&Multiply >> Value = 0.678462
t = 4800 dt = 160
Add&Multiply >> Value = 0.701857
t = 4960 dt = 160
Add&Multiply >> Value = 0.725252
t = 5120 dt = 160
Add&Multiply >> Value = 0.748647
t = 5280 dt = 160
Add&Multiply >> Value = 0.772043
t = 5440 dt = 160
Add&Multiply >> Value = 0.795438
t = 5600 dt = 160
Add&Multiply >> Value = 0.818833
t = 5760 dt = 160
Add&Multiply >> Value = 0.842228
t = 5920 dt = 160
Add&Multiply >> Value = 0.865624
t = 6080 dt = 160
Add&Multiply >> Value = 0.889019
t = 6240 dt = 160
Add&Multiply >> Value = 0.912414
t = 6400 dt = 160
Add&Multiply >> Value = 0.935809
t = 6560 dt = 160
Add&Multiply >> Value = 0.959205
t = 6720 dt = 160
Add&Multiply >> Value = 0.9826
t = 6880 dt = 160
Add&Multiply >> Value = -0.00014622

となりました。0から始まってほぼ1まで進んでいますね。
つまりこうすることによってそのパーティクルが寿命のうちどの位置にいるのかわかるということですね。
0がスタートで1がゴールです。
じゃあこの数値をどのように活用するのか。
先ほどの米岡さんのページには以下のように書いてあります。

そしてそこから出された計算結果をValue To Timeに送ります。Add&Multiplyから出力される値は常に0から1なのでValue1には0をValue2には1を設定します。後は先ほど使ったfloatノードのアニメーションを再利用します。 

Value To TimeのValueに繋いげばいいのか。今までlifspanの数値で0から60fとしていたところをAdd&Multiplyから出た0から1に変更してやるんですね。

する動画はこうなりました。状態をおさらいすると
・LifeSpanは60。variationは50%
・パーティクルはわかりやすいように10個出している
・Value To Timeにはノーマライズされた0から1の値が入る。

やっとできました。うまくいってますね。
これはスケール以外のものにも幅広く使えそうですね。