「ぎょーむ日誌」目次に戻る

三次元ライブラリ内の境界処理

久保拓弥 kubo@ees.hokudai.ac.jp
2001.09.10

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

ぎょーむ日誌の目次に戻る | トップペイジに戻る