1. 動線シミュレーションに基づくドア配置最適化
ハイライト
- Python を用いて,間取り設計の最適化のためのドア配置最適化プログラムを開発
- 大規模な人の流れシミュレーションのために,2D ナビゲーションメッシュ(半エッジメッシュ,A*経路探索,ファンネルアルゴリズム) をゼロから実装
- 動的メッシュの切断/統合操作 と 履歴追跡 を活用したランタイム最適化システムを設計
- 高速処理のためにデータ指向設計(DOD)を適用
Demo

結果
苦労した部分
▶ 動的なメッシュ処理
関連コード:
Half–edge 構造に対して,基本的な操作を2種類実装した: Edge を切断する操作と,Edge を統合する操作. メッシュを更新する際に構造を壊さず,元のメッシュ情報を保持することが重要だった.
Half–edge 構造の活用:
履歴機能の実装:
🔼 デバッグ描画では,ドアコンポーネントを Edge 上で時計回りに移動させながら,
動的にメッシュを切断/統合しているが,初期に作成したジオメトリーの情報が保持されている.
u_geometry.py, g_mesh.py, s_door_system.pyHalf–edge 構造に対して,基本的な操作を2種類実装した: Edge を切断する操作と,Edge を統合する操作. メッシュを更新する際に構造を壊さず,元のメッシュ情報を保持することが重要だった.
Half–edge 構造の活用:
- 各 Edge に探索を効率化する情報(例:面,対角の頂点など)を組み込む.
- ジオメトリーの管理やデバッグを容易にするため,ジオメトリーに ID を付与し,デバッグ描画で確認できるようにした.
履歴機能の実装:
- 一連の更新を行っても,元の Edge を保存できるようにする.
- ジオメトリーの変更を追跡するために,履歴機能を導入.
- 履歴機能では,初期の Edge と Edge 上の位置(0–1)を記録することで,変更を管理できる.
🔼 デバッグ描画では,ドアコンポーネントを Edge 上で時計回りに移動させながら,
動的にメッシュを切断/統合しているが,初期に作成したジオメトリーの情報が保持されている.注目すべき部分
▶ ナビゲーションメッシュの実装
関連コード:
カスタマイズ性を重視し,ゼロからナビゲーションメッシュを実装することにした. ナビゲーションメッシュの実装には,メッシュの構築,A*経路探索,ファンネルアルゴリズムの実装など,多くの技術的課題があった. 特に,ファンネルアルゴリズムの実装では,複雑なエッジケースが多く,デバッグが困難だった.
実装の流れ:
u_cdt.py, u_path_finding.py, g_navmesh.pyカスタマイズ性を重視し,ゼロからナビゲーションメッシュを実装することにした. ナビゲーションメッシュの実装には,メッシュの構築,A*経路探索,ファンネルアルゴリズムの実装など,多くの技術的課題があった. 特に,ファンネルアルゴリズムの実装では,複雑なエッジケースが多く,デバッグが困難だった.
実装の流れ:
- 2Dメッシュの構築
CDT(Constrained Delaunay Triangulation)ライブラリのPython Bindingを使用して実装した.
生成したメッシュを前処理として Half-edge 構造に変換し,各 Edge に種類情報やフラグを記録することで, その後の最適化処理をスムーズかつ高効率に実行できるようにする. - A*経路探索の実装
メッシュの面(三角形)上で最短の三角形ルートを探索する. - ファンネルアルゴリズムの適用
A*で求めた三角形ルートに基づき,ファンネルアルゴリズムを使用して最適な移動経路を計算する.
▶ ランタイム最適化アルゴリズム
関連コード:
本プログラムは,動線を考慮した間取り最適化を目的とし,サンプリング点を設定して人の動線をシミュレーションする. 平均移動距離をロス関数とし,ドアの配置を最適化することを主眼としている.
最適化の手順:
u*loader.py, s*\*\*\*.py, o_optimizer.py, f_layout.py本プログラムは,動線を考慮した間取り最適化を目的とし,サンプリング点を設定して人の動線をシミュレーションする. 平均移動距離をロス関数とし,ドアの配置を最適化することを主眼としている.
最適化の手順:
- 初期設定の読み込み
ドアの初期設定,部屋の接続要件,および最適化パラメータをTOMLファイルに記述し,プログラムに読み込む.
Flood Algorithm を用いてメッシュ上の閉領域を検出し,部屋の接続要件を自動生成する. - 最適化処理
接続条件を基にドアの初期配置を自動生成する.
その後,MCMC(Markov Chain Monte Carlo)アルゴリズムを適用し,ドアの位置を動的に変更しながら最適な配置を探索する. - 最適配置の確定と履歴管理
最適なドア配置が決定した後,メッシュデータを更新し,最適化結果を反映する.
さらに,履歴管理機能を活用して変更を追跡し,最適な配置を維持できるようにする.
プレゼンテーションスライド
修士論文発表用スライド(修正版)
ライブラリ & 参考文献
- PythonCDT (制約付きドロネー三角形分割)
- ファンネルアルゴリズム: https://medium.com/@reza.teshnizi/the-funnel-algorithm-explained-visually-41e374172d2d
2. XenonVK::学習用 Vulkan エンジン
ハイライト
- Vulkan とゲームエンジンアーキテクチャを学習するための C++でゲームエンジン開発
- Blinn–Phong 反射モデル を使用した 3D Vulkan レンダラーを実装
- CMake ビルドシステムと GLSL シェーダーコンパイルを統合
- OBJ メッシュローディング,ゲームタイムシステム,マウス/キーボード入力 を追加
苦労した部分
▶ Vulkan APIとゲームエンジンの学習
関連分野: Vulkan API,ゲームエンジン設計,グラフィックスプログラミング
Vulkan API は,OpenGL と比べて新しくて非常に低レベルなグラフィックス API であり,リソースの管理や同期処理をすべて手動で行う必要があります. そのため,学習初期には「LittleVulkanEngine」という動画教材を参考し,描画パイプラインやリソース管理の枠組みを実装しました.
Vulkan API は,OpenGL と比べて新しくて非常に低レベルなグラフィックス API であり,リソースの管理や同期処理をすべて手動で行う必要があります. そのため,学習初期には「LittleVulkanEngine」という動画教材を参考し,描画パイプラインやリソース管理の枠組みを実装しました.
- 問題点: 基本的なフレームワークを実装しましたが,ローレベルでコードの複雑さと量に圧倒され,非常に時間がかかりました.
- 取り組み:
- レンダラーの実装を一時中止し,ゲームエンジンのアーキテクチャに力を入れました.
- 同時に比較的に簡単な2Dバージョンで,基本的なPrimitiveから簡単な物理アニメーションを実装してみました.
- LearnOpenGLのチュートリアルを参考にしながら,OpenGLの描画パイプラインを勉強しました.
- その後,ChatGPT,技術ブログや本を参考にしながら,Tickベースの時間管理や,ECS(Entity Component System)によるオブジェクト管理システムを実装.
- 改善と成果:
- 既存なエンジン構造を参考し,何度もリファクタリングすることで,内部処理の流れを理解でき,エンジンのアーキテクチャも整理されました.
- 結果的に,Validation Layerの警告に対応しながら,Vulkanの実装を再開することができました.
- 現在ではデバッグ用WireframeのRender Passの追加やデバッグなど,描画処理の安定化を進めています.
注目すべき部分
▶ CMake ビルドシステムと GitHub のCI環境
関連技術: CMake,クロスプラットフォーム開発,GitHub Actions,Vulkan,GLSL
私の開発環境は,Windows と MacOS の両方を使用しており,クロスプラットフォーム対応が必要でした. そのため,ビルドシステムには柔軟性と拡張性に優れたCMakeを導入しました.
私の開発環境は,Windows と MacOS の両方を使用しており,クロスプラットフォーム対応が必要でした. そのため,ビルドシステムには柔軟性と拡張性に優れたCMakeを導入しました.
- CMakeのビルドシステム:
- Windows / Linux / MacOS のすべてで同じコードベースをビルド可能に
- GLSLシェーダーのビルド時自動コンパイル機構をCMakeに組み込み
- GLM や GLFW などのライブラリも CMake を通じて自動で取得・ビルド
特に MacOS 上で Vulkan を扱う際には,Metal をバックエンドとするMoltenVKの導入が必要で,設定とデバッグには多くの調整が必要でした. - CI環境の構築:
- GitHub Actions により,自動ビルドワークフローを構築
- リポジトリへのプッシュやプルリクエスト時に自動でビルドを実行
- 現時点ではユニットテストは未実装ですが,今後の実装する予定
Demo


参考
- Brendan Galea: LittleVulkanEngine
- https://gameprogrammingpatterns.com/
- Game Engine Architecture by Jason Gregory
- Game Physics Engine Development by Ian Millington
- https://learnopengl.com/
- ChatGPT
3. その他のプロジェクト
A) アポロニアンガスケットジェネレーター (Rhinoceros/Python)

B) Voronoi 図の実験ツール (Python/GLSL)

C) [PG24] Free-form Floor Plan Design (Rust)

以上になります.ご覧いただきありがとうございます!!