ポスト処理を設定すると、各スナップショットのデータ読み込み直後にスクリプトが実行されて、データの加工などを行うことができます。
スクリプトから Zindaiji3 の内部データにアクセスするためのコマンドは、その他のエクスプレッション処理と同様に C.somecommand と C の接頭語を付けたコマンドとして登録されています。
例として、i 番目の粒子の位置を変更するには
C.SetDataPosition(i, x, y, z)
となります。
1次元の量として粒子タイプを変更するような場合には
C.SetDataType(i, type)
となります。
データの新規作成や、人工的に粒子数を追加するような場合には、最初にメモリ確保のためのコマンド
C.SetParticleNumber(number)
が必要になります。
上記のサンプルは、回転する粒子円盤を作成するスクリプトになっています。上のスクリプトから作成されたデータから、下のようなアニメーションが作れます。
ポスト処理のスクリプトは、今読んだスナップショットのデータにしかアクセスできません。
前のスナップショットデータを使って、次のdt後に相互作用によってこのように進化するはずだ、というシミュレーション的なデータの作成はできないので注意してください。
LUAスクリプトはそこそこ高速なスクリプトですが、C言語などで直接コンパイルしたコードよりは遅いです。より高速な処理や、複雑な処理をするために、ソースコードを改変して独自のデータ作成ルーチンを組み込みたい場合があるかもしれません。
そのような場合にソースコードの改変をしやすくするために、あらかじめ ソースコード内にUserDefinedFunction というルーチンが用意されています。
スクリプト内でC.CallUserDefinedFunction(番号, 引数...)を実行すると、UserDefinedFunction0xを呼び出します。
(関数は 1から3まで3つ用意されていて、引数の番号で呼び出す関数を変更できます)
UserDefinedFunction0x() は SRC/PARTICLEDATA/clsUserDefinedFunctions.cpp 内で定義されており、デフォルト状態では、球状の分布を作るルーチンと、カオス図形を作成するルーチンが記述されています。
この関数を書き換えてコンパイルを通すことで、独自ルーチンによるデータ作成を行うことができます。