三次元ライブラリ内の境界処理
久保拓弥 kubo@ees.hokudai.ac.jp
2001.09.10
-
この改造は三次元ライブラリ lib_fvision
において,
X-Y-Z それぜれの境界が
吸収 (absorptive)・
反射 (reflective)・
周期的 (periodic) のいずれでも
自由にとれるようにすることである.
-
この境界処理に直接的に関与するクラスは
下のとおりである.
三次元ライブラリの元締の Fvision.
三次元区画を管理する Voxels (とその部品 Voxel).
視線 Gaze と視点 Eye.
-
Fvision 中の SkyWatch 関数においては,
Eye によって特定された視線の起点から
動点を移動しつつ
(移動ヴェクトルはGaze と Voxels で算出),
その過程で衝突するモノを見つけることであった.
ここでのおもな処理は
「指定領域からの逸脱」Voxels 内で判定→観天の中止,
「当たり判定」
Voxels から報告された「あたったもの一覧」リストを
Eye に渡す.
(Fvision は虚業家なので自分では何も計算してない).
-
この関数から呼び出される「境界における処理」を追加する.
これは主に Voxels 内で行われる.
Voxels は初期化のときに X-Y-Z それぞれの
境界が (上下ともに)
absorptive/reflective/periodic いずれをとるかを決める.
-
この次より下は
Fvision::SkyWatch が呼ばれたあとの処理である.
-
Voxels::ResetLastVisitor
ですべての Voxel の最終訪問者を初期化.
Eye::PrepareSkyWatch で視線群の準備.
Eye が領域外のときは SkyWatch をここで終了.
下は Eye::NextGaze によって取りだされた
Gaze のひとつのインスタンス gaze に共通する処理である.
-
Voxels::CalcMovingVector で gaze の最初の
移動ヴェクター Voxels::xyz_move を決める
(すでに構築ずみ).
これはひとつの Voxel から必ず隣に移るような
移動量を保証している.
Voxels::crashed を NONE,
Voxels::continue を true
に設定.
-
Voxels::continue が false になるか
gaze の traveling_range が
Gaze::traveling_range_max を
超えるまで下の処理を続ける.
-
現在の Gaze の動点が位置している Voxel における
障害物との当たり判定.
この部分はすでに作ってあるとおり.
Voxels::CheckHitVit で当たりの有無,
さらに必要ならば hit_vit をひとつずつ取りだし
gaze とともに Eye に渡す.
-
この当たり処理が終ったあとで
Eye::CheckContinue が true なら
下の処理を行うなる.
false なら 7. にもどる (次の gaze).
-
gaze を Voxels::MovePoint に渡して
動点を動かす Voxels 内の処理.
次の項目から関数・変数の前の Voxels:: を省略.
終ったら 7. にもどる (次の gaze).
-
crashed が前の処理で NONE 以外に変えられている場合:
まず
gaze の動点に (前の処理で加工された) xyz_move を加えて
境界上まで移動.
-
crashed が ABSORPTIVE ならば
continue を false にする.
-
crashed が REFLECTIVE ならば
用意されていた反射後の移動ヴェクター
xyz_move_next で xyz_move を置き換える.
crashed を NONE にする.
-
crashed が PERIODIC
用意されていた反射後の移動ヴェクター
xyz_move_next で gaze の動点を移動する
(「パックマンのワープ」的な移動).
xyz_move はそのまま.
crashed を NONE にする.
Voxels から Fvision への処理に戻る.
-
crashed が前の処理で NONE であるときは以下のように
処理していく.
gaze の動点に xyz_move を加えて
next_point とする.
InRegion( next_point ) が true ならば,
gaze の動点を移し Voxels での処理を終える.
Voxels 内の値はすべてそのまま.
-
もし next_point が領域外であるなら,
どのカベにぶつかったかを判定する.
これは総当たりで泥くさくやるしかない.
ぶつかったカベ crashed_border を記録し,
衝突点 crash_point を計算する.
xyz_move = crash_point - 現在の動点,
と変更する.
-
ぶつかったカベの種類によって,
以下のように処理する.
-
もし crashed_border の属性が absorptive
であるならば,
crashed を ABSORPTIVE とする.
Voxels から Fvision への処理に戻る.
-
もし crashed_border の属性が reflective
でるならば,
crashed を REFLECTIVE とする.
カベに反射したあとの移動ヴェクトルを計算して
xyz_move_next に設定しておく.
Voxels から Fvision への処理に戻る.
-
もし crashed_border の属性が periodic
でるならば,
crashed を PERIODIC とする.
カベを「通り抜けた」あとの移動ヴェクトルを計算して
xyz_move_next に設定しておく.
Voxels から Fvision への処理に戻る.
ぎょーむ日誌の目次に戻る
|
トップペイジに戻る