Zindaiji 3 は、天文学におけるN体計算などに代表される、大規模な粒子シミュレーションを可視化するためのアプリケーションです。
Zindaijiという名前は、国立天文台付近の地名にちなんでつけられています。
Zindaiji 3 の目標は…
Zindaiji3はOpenGLとそのシェーダー機能を利用しています。速いグラフィックボードの付いたPCでの利用が推奨です。OpenGLのバージョンが1.5より以前の古いものだと機能しないと思われます。
2012/01/15 ver0.30 公開 |
2012/04/22 ver0.47 公開 |
2012/08/06 ver0.60 公開 |
圧縮ファイルを解凍して、全体を好きな場所に置きます。設定ファイルなどが実行ファイルの場所に書き込まれるので、自分が書き込みパーミッションの無い場所などには置かないでください。また、日本語や空白のあるパスは思わぬエラーの原因になる可能性があるので、避けてください。
レジストリーは弄らないので、削除するだけでアンインストールできます。
Linux版はwxWidget-gtkのインストールが必要です。wxWidet-gtkはUbuntu環境ではsynapticからインストールできます。
Mac OS X 版は、現在32bit対応しかしていません。また、Mac OS X 版は、./Zindaiji3Mac.app/Contents/MacOS/Zindaiji3Mac をターミナルから実行する必要があります。まだMac初心者なので、ダブルクリックで実行できるようにする方法わからない…
また、ダイヤログをメインのウィンドウの下に隠すことが可能なので、狭い画面で使いにくいです(Win/Linux版は隠れない)。
デフォルトで一番大きいパネルがプレビューパネルになっていて、可視化された画面を表示する場所になっています。最初の状態ではグリッドとカメラと光源、そしてピボット(回転の中心、青い十字)が表示されます。
視点の移動の基本は、ピボットを中心とした回転(trackball)になっていて、マウスの左ボタンに割り当てられています。
ズームは、マウスの中ボタンとマウスホィールに割り当てられています。
また、中ボタンがないマウスのために、Alt+マウス左ボタンが、マウスの中ボタンと同等の操作になるようになっています。
画面のパン(横移動)は、Shift+Ctrl+マウス左ボタンが割り当てられています。画面をパンすると、同時に回転の中心(ピボット)も動くことに注意してください。
パンすると、ピボットも動く。
プレビュー画面内で、アイテム(カメラと光源)を掴んで動かすことができます。
デフォルトでは、Shift+右マウスボタンで、アイテムを選択することができます。選択したアイテムは、Shift+左マウスボタンに割り振られています。
画面左下に、平行移動、回転、拡大縮小のボタンが用意されています。現在それぞれに対応するショートカットは、'T', 'R', 'S'となっています。
アイテムが選択されているときには、ガイドの矢印が表示されます。Shift+左ボタンでそれらをドラッグすることで、X軸、Y軸、Z軸にそっての移動ができます。平行移動の際は何もないところでドラッグをすると、視線と直行した面内での操作になります。また、「X」「Y」「Z」のショートカットキーで、X軸、Y軸、Z軸にそった移動のモードにすることができます。
マウス操作は、設定ダイヤログを使って変更することができます。
プロジェクトファイルの読み込み/保存をおこないます。プロジェクトファイルの拡張子は、.zjpなります。
データ読み込みダイヤログを開きます。
画面上に表示されている画像を保存します。複数のパネルが表示されているときには、左上の画像が保存されます。連番画像保存では。連番画像保存設定ダイヤログを開きます。
スナップショットの保存は、パネルに表示されている画面をキャプチャして保存をするので、画像のサイズは自動的に設定されます。
任意のサイズの画像(4096x4096まで)を保存するときは、連番画像保存設定ダイヤログを使ってください。
粒子データなどをエクスポートすることができます。現時点では粒子データのみをエクスポートします。この機能によって、アスキーデータから(読み込みなどの速い)バイナリーデータへの変換などをすることができます
粒子データのエクスポート時のフォーマット編集は、粒子データ出力ダイヤログで行います。
シーンを閉じます。
Zindaiji3を終了します。
アンドゥ、リドゥを行います。
現在の時間フレームをダイアログを使って数値で入力します。
現在の時間フレームは、タイムラインエディタにある入力窓からも変更できます。タイムリマップモードのオン/オフをします。タイムリマップモードでは、時間を一つのパラメータとして扱うので、初期状態を表示してから時間を進める、といった操作ができます。
メモリ上に展開されたデータの開放をします。
シーンの長さなどを設定するシーン設定ダイヤログを開きます。
マウス操作などの設定をする設定ダイヤログを開きます。
フィルターを設定して、幾つかのデータの操作を行うことができます。複数のフィルタの設定も行えます。フィルターの詳細は、フィルターパネル上で行います。
プレビュー画面を一つだけもったウィンドウを表示させます。
このウィンドウは、"Alt+Enter" で最大化することができるので、充分軽いシーンなどでは、全画面再生(SPACE)をすることができます。
そのさいは、メインのウィンドウのデータ表示を切っておくと、パフォーマンスが上がります。
ビューとカメラの設定ダイヤログを表示します。
光源設定ダイヤログを表示します。
カラーカーブエディターを表示します。
ステレオグラム設定ダイヤログを表示します。
Zindaijiは粒子を次のような手法で描画します。
品質のパラメータを変更すると、球で表示する際のポリゴン数が変わります。
アルファブレンドは、半透明な粒子を表示するときに、背後の色を(透明度に応じて)隠す描画法です。ガス雲が背後の星の光を隠すような表現に向いています。
加算モードは、粒子を描画するたびにその色をキャンバス上に加算するというもので、単純に密度を加算して表示するような場合や、星のような光り輝く粒子を表現するのに向いています。
また、右側のコンボボックスでは、レンダリング時に使用するシェーダーを変更できます。
「オリジナル」は、デフォルトのOpenGLのレンダリングを利用します。ハイライトの位置が近似的に計算されるので、魚眼レンダリングのときなどには破綻が生じます。
「グーロー」シェーディングは、オリジナルのレンダリングに似ていますが、多少違いがあります。ポリゴンの各頂点ごとに色を計算するので、ポリゴンの境界で星のような模様が見えることがあります。
「フォン」シェーディングでは、各ピクセルごとに色を計算するために、そうしたポリゴンの境界は目立たなくなります。
「トゥーン」シェーダーは、輪郭線付のイラスト的なレンダリングを行います。まだ実験的な実装なので、カラーカーブを用いない単色の表示にのみ対応しています。
粒子の持つ半径データを用いて球または板の表示をするか、それとは無関係にある大きさ(1)で表示をするかを設定します。この値に対して、さらに半径の調整で設定した値が掛け合わされた大きさで表示を行います。
アルファ値は、粒子の不透明度を決めます(0が完全に透明)。
固定値に設定すると、全ての粒子が"アルファの調整"で決めた値に設定されます。
もし"半径依存(逆2乗)"にすると、半径に依存したアルファ値になります。
これはSPHシミュレーションの可視化に向いています。なぜなら、SPH粒子の密度は R-3に比例し、一方光線が粒子を通過する際の距離は R に比例するために、光の吸収量や発光の量は、一次的には R-2 に比例するためです。
この場合は、不透明度は Max[Amax, (R/Rbase)2], として描画しています。ここで、Rbase と Amax の値は、基準/最大値の行で設定する値になります。
粒子の色 (板と点)を設定します。 ボタン左にあるグラフのアイコンをクリックすると、固定カラーとカラーカーブモードを変更します。 ボタンを押すと、固定カラーの選択ダイヤログかカラーカーブエディターが表示され、そこでカラーカーブの編集をすることができます。
粒子の色 (球)を設定します。
3つの色はそれぞれ環境(ambient)、散乱(diffuse)、反射(specular)に対応します。
光源の反対側で本来光の当たらない部分でも環境光の色で表示されることになります。(光が周辺で散乱して回り込んでいるという扱いになります。)
光源側では、さらに角度に応じて散乱色と反射色が環境色に足しあわされて表示されることになります。
これらの色もカラーカーブエディターで編集をすることができます。
このパネルでは表示の品質と速度のバランスに関係するパラメータを設定します。
粒子を間引いて表示します。間引いた分は、残りの粒子の半径や不透明度が大きくなるように表示し、見た目の印象が大きくは変わらないようにしてあります。
半透明の粒子を表示するときには、奥の物体の色に応じて手前の物体の見え方が変わるために、奥から手前に向かって順番に表示をしなければなりません。そのための計算を行うかどうかを設定します。
半透明を使わないとき、完全に加算のみを使って表示をする場合にはZソートをする必要がないので、高速化ができます。
数種類の粒子が混在している場合、OpenGLの描画のステータスを粒子ごとに更新するのにかなりの時間がかかります。
粒子の分類を、"粒子種0として表示", に設定すると全ての粒子を粒子種0として表示して、描画ステータスの更新のかなりの部分を省略して、描画を高速化することができます。特に粒子の種類分けがない場合には、"粒子種0として表示"を選択するようにしてください。
シャドウボリューム法を使って、影を計算することができます。球を表示している場合のみ有効です。
影を有効にすることによって、現実感を大きく向上させることができますが、レンダリングスピードはかなり遅くなります。
レンダリングスピードは、影領域を計算するのに使うポリゴンの数とその面積に大きく依存します。
長さパラメータを小さくすることでレンダリング速度を上げられますが、見たい構造のスケールよりも短くすると影が正しく表示されなくなります。
「影ポリゴンを表示」モードにすることで、影の計算用のポリゴンを明示的に表示することができるので、パラメータの調整を見ながら行うことができます。
個別の光源に関して影のオン/オフを設定するには、光源設定ダイヤログを使用します。
これらのパラメータで、影の計算用のポリゴンの品質と長さを設定できます。
レンダリング時間の観点から、長さのパラメータは表示が破綻しない限り小さい数にするべきです。
時間や、カラーカーブの情報をプレビュー画面上に表示することができます。表示の位置は、コンボボックスから選べます。
時間については、表示する際に頭につける文字や、文字のフォント、サイズなどを選べます。(日本語フォントはシステムで用意されたリストからは適切なフォントを選択してくれないようです。カスタムを選んで自分でフォントを選択することができます。)
その右の4つのチェックボックスは、4種類のアトリビュートに対応しています。
カラーカーブの透明度は、市松模様の背景を使って表現されます。また、透明度情報のない単純なカラーカーブも選択できます。("アルファ値を表示しない" を選択します)
また、カラーカーブ上の目盛表示も On/Off ができます。
*既知の問題* 目盛上の数字がはみ出して見えなくなる場合があるので、表示部分の修正の必要があります。
Zindaiji3 は、16bit FBO を利用して描画をしているので、メモリー内ではモニター上に表示されている8bit画像よりも多くの情報を持っています。レベル補正とガンマ補正のパラメータによって、元の16bit画像をどのように8bit画像にマッピングするかを調整できます。
現時点では、画像保存時は8bit画像の保存のみが実装されています。
また、色相と彩度もこのパネル内で調整が行なえます。
フィルターのパラメータ設定は、フィルターパネルで行います。複数のフィルターの設定ができ、順番に表示されます。各フィルタの最上部のボタンで、パネルを畳んだり展開したりすることができます。
将来複数のフィルタが実装され、ブーリアンやオブジェクトといったカテゴリーごとに分類される予定です。
T, R, S の3つの数値は、位置(Translate)、回転(Rotate), 大きさ(Scale)に対応しています。
ブーリアンフィルターは、領域外の粒子を隠したり、領域内部の粒子のみを表示したりする機能があり、断面図の表示などに使用します。
フィルタリングフィルターは、粒子の番号に応じて一部の粒子だけを表示したり隠したりする時に使用します。
データボックスフィルターは、データの原点の移動や回転、スケーリングといった処理を行います。意図は、カメラを旋回させる代わりにデータを回転させるといった操作を行えるようにすることにあります。
オブジェクトフィルターは、球や四角といった基本的な形状をシーンに配置します。 いずれwavefront objectといったオブジェクトの表示をそのうち実装するつもりでいます。しばらくお待ちください…
グリッドフィルターは、座標を表すためのグリッドを表示します。
ビューの設定の中のTranslateとRotateは、プレビュー画面で今見ているビューの位置と、方向のオイラー角を示しています。
一方、カメラパス設定の中のTranslateとRotateは、カメラワーク中の現在のカメラの位置と角度を示しています。
カメラワークのカメラは、タイムラインエディタ上で設定をすることができます。また、プレビューの設定をCam0にすると、ビューの位置が自動的にカメラワークの設定を追随するようになります。
「Look Anchor」 のチェックをすると、カメラは自動的にアンカーの方向を向くようになります。アンカーは初期には原点に配置されています。
このモードは、シミュレーション中の移動する現象を追いかけたいというような時に効果を発揮します。
ただし、アンカーの移動は手で調整しなければなりません。あらかじめ解析して得た位置をテキストファイルとして読み込む機能をつけるのはよい考えなので、いずれ実装します。
左下の3つの「キー配置」ボタンが、カメラワークの編集に重要な役目をもっています。
「POS」 のボタンを押すと、現在のプレビュー画面のビューの位置にキーフレームを設定します。
「POS+ROT」のボタンでは、カメラの回転成分にもキーフレームが打たれます。
多くの場合、画面上でよい構図を探しながら、これらのボタンを使って適当な間隔キーフレームを配置することで、カメラワークの設定をすることができます。
「Look Anchor」モードなどでは、回転成分を変化させない方が良い場合もあるので、必要に応じて2つのボタンを使い分けてください。
「ANC」 ボタンではアンカーに対して、現在の"pivot"の位置でキーフレームを打ちます。
タイムライン上の赤い線が現在の時間フレームを表します。スライダーを使って時間フレームとワーキングエリアの範囲を設定できます。
メインのスライダーの左側のテキスト入力窓で、数字入力で変更することもできます。
緑色の箱は、既にメモリ上にデータが読み込まれているフレームを表します。
デフォルトでは、パラメータは時間依存が「OFF」になっており、すべてのフレームで一定の値になります
時間依存を「ON」にするにはボタンをクリックしてください。
時間依存するパラメータは、タイムライエディタで編集します。
キーフレームをタイムライン上に打つことで、その間の値は自動的に補間されます。
キーの挿入と除去は、右クリックメニュー、または画面左のチェックボックスによって行うことができます。
位置など多次元のパラメータは、x,y,zの3成分に対してバラバラにキーフレームを打って編集することができます。
バラバラに編集をするときには "リンク" ボタン を押してリンクモードを解除してください。
また、キー上でのダブルクリック、または右クリックメニューから呼び出すことのできるダイヤログによって、数値的にキーフレームの値を編集することができます。
補間のタイプについては、現在次のモードが実装されています。
STEP, LINEAR, HERMITE(AUTO), and HERMITE(SEMIAUTO).
HERMITE(AUTO) モードでは、キーフレーム間は3次関数で補間されます。キーフレームでの速度は、前後のキーフレームから自動的に計算されます。
HERMITE(SEMIAUTO) モードでは、「Ease」パラメータを設定できます、この値はそのキーフレームでの速度に掛け合わされます。
0に設定された時には、徐々に速度を落としながらその値に近づいてゆき、キーフレーム上でちょうど速度0になあります。
この機能によって、「イーズイン」「イーズアウト」といわれる動きの演出を行うことができます。
パラメータの数が増えすぎた場合などに、タイムライン上から一時的に隠すことができます。それぞれのパラメータのシャイボタンと、全体的なシャイボタン(左上のボタンです)をチェックすることで、そのパラメータは表示されなくなります。
もし必要なパラメータを隠してしまった場合には、左上のシャイボタンをオフにすることで、すべてのパラメータが表示されます。
アイコンに使われている鼻の大きいキャラクターは、キルロイといって昔流行った落書きだそうです。アフターエフェクトなどでこのマークが使われているので、マネして使わせてもらいました。
エディットメニュー(&E)でタイムリマップモードがONにすると、時間をパラメータの一つとしてコントロールできるようになります。
注)現時点で、タイムリマップ使用時にはデータの事前読み込みとメモリの解放の優先順位の判断にバグが残っています。
例)
100のファイルからなる連番データがあるとします。
もし最初と最後に50フレームずつ初期状態と終状態を見せたいというような場合には、シーンの長さを200に設定し、タイムリマップのキーフレームを 0(0frame)、0(50frame), 99(149frame), 99(199frame)に配置することで実現ができます。
画面下のボタンによって時間をコントロールできます。
再生ボタンなどは見ただけでおおよその機能は想像できると思います。
間隔の数値は、再生時にスキップするフレーム数を設定します。
たとえば間隔2の場合は 0, 2, 4, 6, .... のフレームを表示します。
これらは、重いデータの編集時などに効果を発揮するはずです。
また、補間数は再生時にフレーム間を何コマで補間するかを設定します。たとえば補間数5で全10タイムステップのデータから連番画像を作ると、全部で50枚の画像が出力されることになります。
タイムステップ間の補間は、データ読み込み時にデータ読み込みダイヤログで設定したルールに従って行われます。
プリフェッチの数値で、事前読み込みの範囲を設定します。
例えばこの値を3にすると、現在のフレームから3ステップ分だけ事前にデータの読み込みを行います。
この事前読み込みは、描画とは別のスレッドを使って行うために、僅かしかパフォーマンスを落としません。そのため、適切に設定したプリフェッチ機能によって、編集時やレンダリング時の待ち時間を大幅に減らすことができます。