データ加工時の文法


ポスト処理を設定すると、各スナップショットのデータ読み込み直後にスクリプトが実行されて、データの加工などを行うことができます。

スクリプトから Zindaiji3 の内部データにアクセスするためのコマンドは、その他のエクスプレッション処理と同様に C.somecommand と C の接頭語を付けたコマンドとして登録されています。

例として、i 番目の粒子の位置を変更するには

C.SetDataPosition(i, x, y, z)

となります。

1次元の量として粒子タイプを変更するような場合には

C.SetDataType(i, type)

となります。

データの新規作成や、人工的に粒子数を追加するような場合には、最初にメモリ確保のためのコマンド

C.SetParticleNumber(number)

が必要になります。

上記のサンプルは、回転する粒子円盤を作成するスクリプトになっています。上のスクリプトから作成されたデータから、下のようなアニメーションが作れます。



ポスト処理のスクリプトは、今読んだスナップショットのデータにしかアクセスできません。
前のスナップショットデータを使って、次のdt後に相互作用によってこのように進化するはずだ、というシミュレーション的なデータの作成はできないので注意してください。

ユーザー定義関数(C++)

LUAスクリプトはそこそこ高速なスクリプトですが、C言語などで直接コンパイルしたコードよりは遅いです。より高速な処理や、複雑な処理をするために、ソースコードを改変して独自のデータ作成ルーチンを組み込みたい場合があるかもしれません。
そのような場合にソースコードの改変をしやすくするために、あらかじめ ソースコード内にUserDefinedFunction というルーチンが用意されています。

スクリプト内でC.CallUserDefinedFunction(番号, 引数...)を実行すると、UserDefinedFunction0xを呼び出します。 (関数は 1から3まで3つ用意されていて、引数の番号で呼び出す関数を変更できます)

UserDefinedFunction0x() は SRC/PARTICLEDATA/clsUserDefinedFunctions.cpp 内で定義されており、デフォルト状態では、球状の分布を作るルーチンと、カオス図形を作成するルーチンが記述されています。
この関数を書き換えてコンパイルを通すことで、独自ルーチンによるデータ作成を行うことができます。

UserDefinedFunctionのプログラム方法

まず、粒子データのメモリを確保しなければいけません。
そのための関数が Allocate(int 粒子数)です。
(x,y,zなどの確実に使用する変数以外で)使用しない変数などは確保しないことによりメモリの節約を行っているので、用いることのできる変数を支持するために、Allocateを実行する前に、以下の変数を TRUE もしくは FALSE に設定します。

mbUseRadius
mbUseID
mbUseValue1

Allocate が実行されるとメモリが確保されるので、あとはデータを代入してゆきます。
(当然ながら配列の要素外の場所に代入をするようなプログラムにすると落ちたり予期しない動作をするようになります。注意してプログラミングしてください)

データ配列

mpX[][3] : 位置 (float)
mpV[][3] : 速度 (float) (*)
mpRadius[] : 半径 (float)
mpID[] : ID (int)
mpValue1[] : 物理量1 (float)

(*) エルミート補間のときに使用します。 線形補間の場合には、補間処理のときに上書きされるために定義しても意味はなくなります。
また、そのスナップショットの持つ時間として mpCParentSnap->mTime (double) は自由に変更してかまいません。速度データから差分位置を計算する際には、この時間情報を使用しています。
スナップショットの時間が定義されないときは、デフォルトでそのスナップショットのインデックス値が時間として使用されます。

戻る
inserted by FC2 system