...

ツリー構造の使用


■ 八分木ツリー構造のデータへの対応

最も単純な八分木のツリー構造のデータに対応しています。

現在、任意のファイル名には対応しておらず、次のような命名規則になっている必要があります。

親が0.df3で、子供は深さ毎に1.df3、2.df3…となっていて、ディレクトリーでツリー構造を表現しています。

/0.df(親)
/1_00/1.df3(子供)
/1_01/1.df3
 …
/1_06/1.df3
/1_07/1.df3
     /2_00/2.df3(孫)
     /2_01/2.df3
      ...
     /2_06/2.df3
     /2_07/2.df3
          /3_00/3.df(ひ孫)
          /3_01/3.df
          ....
 □ nを深さ、xxを8分木の番号として
 n_xx/
 とフォルダ名を決めています。
 構造の番号xxは、データの中心を原点として
 00: zが負、yが負、xが負
 01: zが負、yが負、xが正
 02: zが負、yが正、xが負
 ...
 07: zが正、yが正、xが正
 というような規則です。


□ 時系列の設定

ツリー構造を名前の決め打ちにしてしまったので、連番ファイル名で時間進化を表現できなくなってしまいました。「名前で開く」機能を使ってフォルダ名で時間進化データを扱うようにします。

時間進化をフォルダの連番で表して
000/0.df3
001/0.df3
…
というような場合、文法は%03d/0.df3になります。


ツリー構造の表示

ツリー構造を有効にすると、レンダリング時にカメラが近いところは子供のデータを使うようになります。
(Oosawaでの表示は変わりません。PovRayを使ってレンダリングするときに、子供のファイルを使うようにするだけです。どのように分割したデータを利用するかを、枠線などで表示します。)

[ダイヤログ]→[ツリー構造設定]で、設定ダイヤログを開きます。



□ エイリアス

レンダリング時に別のファイルを使用します。プレビューは荒いデータのファイルで、レンダリングは細かいデータのファイルで、というようなときに使います。
また、レンダリング時に16bitの.df3ファイルを使うといった使い方もできます。
(Oosawa自体は8bitのファイルしか読めません)

レンダリング時に使うファイル名の置換ルールを設定できます。



□ ツリー構造の種類

八分木ツリーとネスティッドグリッドを利用できます。

□ 最小深さ/最大深さ

何段階のツリーを使うかの設定をします。

□ ツリーのフォーカス

「カメラの位置」に設定すると、カメラに近い位置では細かいデータを使うようになります。その他アンカーの位置を基準にする設定などにできます。

□ 分割の閾値

値が大きいほど、より細かいデータを使うようになります。レンダリング速度との兼ね合いで決定します。

□ ツリーを使う

ツリー機能のon/offを行います。
また、周期境界データ用に、周囲にコピーしたデータでも同様にツリー構造を利用するかどうかも設定できます。

□ リアルタイムでファイルの有無のチェック

データの有無をチェックして、枠線の色で表示します。(赤線の枠は、より細かいデータを利用する条件を満たしているけれども、ファイルが無いデータブロックです) レンダリング時には、ファイルが無い部分はより粗いデータを使ってレンダリングするはずです。

□ ボックス間の隙間

理想的には各ボックスが隙間無く埋め尽くして表示されるべきなのですが、レンダリング時に重なったボックス表面の前後関係が判定できないという問題から、少しだけ間に隙間を入れます。
負の方向に大きいほど間隔が小さくなります。間隔は小さいほど良いのですが、レンダリング時に表示が壊れた場合には、0に近い値にします。


開発中に使ったデータでは、親が256x256x256で、深さ5までのツリー構造(8192x8192x8192 = 512GB相当)分のデータも、カメラの距離に応じてレンダリングすることで、レンダリングできました。
ここまでデータが細かいと、パラメーターによってはツリー構造を使っても一度に2G以上とか読みにいくので、64bitOSで64bitのPovRayを走らせないと厳しいかもしれません。精度を落とせばまだ平気だけど…


HotSpot

カメラ位置に応じて解像度を細かくするのはいいけれども、シミュレーションの中心とか、この辺は重要だからカメラから離れていても表示を細かくして欲しいという場所があったりします。
そういった場所を指示する為に、HotSpotという概念を導入しました。

HotSpotを置いておくと、HotSpotの周辺でツリーの切り方の閾値を細かくします。
(現状で、さらにHotSpot周辺では設定より1段深く子供のデータを探しにいくように実装しています)

■ ネスティッドグリッド構造のデータへの対応

最も単純な、1段階ごとにサイズが1/2になるネスティッドグリッド構造のデータに対応しています。

プレビュー時には対応しませんが、レンダリング時はデータの中心部では2倍ずつ細かいデータファイルを利用してレンダリングを実行します。


対応するファイル名は
somename_0.df3
somename_1.df3
somename_2.df3
...
というようになっています。デフォルト状態では時間進化の連番とデータの深さが区別が付かないので、八分木の場合と同様に「名前で開く」機能を使ってフォルダ名で時間進化データを扱うようにします。

また、時間進化しないデータであればタイムリマップ機能でも対応可能です。



□ グリッドのオフセット

デフォルトでは、中心に向かって細かいデータに切り替わっていきます。(つまりデータの座標で0.25〜0.75部分を次の細かさのデータが占めることになります。)
上下対称のシミュレーションなどでは、それでは困るので、基準をずらすことができます。

例えば横から見て下のような座標系の場合には、z方向に-0.25ずらして 0 〜 0.5の範囲に次の細かさのデータが来るようにします。



□ ボックスの角を丸める

場合によってはデータの切り替え部分が、かなり目立つ場合があります。
残念ながら、レンダリングの精度をうんと上げるしか根本解決はできないので、むちゃくちゃに遅くなります。

切れ目が直線であるためによく目立つ場合には、対症療法としてデータの切れ目の角を丸めて、ある程度目立たなくすることができます。

...