🙄
Unityで点群データからBIMモデルを作成して建築構造物をレンダリングする方法についての検討
1. 全体像
点群 → 前処理 → 特徴抽出・セグメンテーション → 形状復元(メッシュ/パラメトリック)→ BIM化(IFC等)→ Unityで表示&インタラクション
- 点群形式: E57 / LAS(LAZ) / PLY / PCD
 - BIM形式: IFC(推奨)、RVT(Revit)、FBX/GLB(ジオメトリのみ)
 - Unity表示方法: 点群そのまま、生成メッシュ、BIMを取り込む
 
2. 実践パイプライン
方法1. 商用Scan-to-BIM+Unity(短期で高精度)
- Autodesk ReCap / Trimble RealWorks / Bentley / CloudCompareで前処理(ノイズ除去・ダウンサンプル)
 - Revit等でScan-to-BIM化(壁・床・柱・梁のパラメトリック化)
 - IFC/RVTをUnityにインポート(IFC読み込みライブラリ or FBX/GLB経由)
 - UnityでHDRP/URPレンダリング+メタデータ表示
 
長所: 精度・速度が出やすい / BIM属性豊富
短所: ライセンス費用
方法2. オープンソース+Unity(低コスト研究寄り)
- CloudCompare/Open3Dで前処理(ダウンサンプル・ノイズ除去・床抽出)
 - 平面検出(RANSAC)やクラスタリング(DBSCAN)、学習ベース(PointNet++)で分類
 - 平面輪郭抽出→押し出しで壁・スラブ生成 or メッシュ化(PoissonRecon)
 - IfcOpenShell(Python)等でIFC生成
 - Unityで表示+メタデータUI
 
長所: 無償・柔軟
短所: チューニング必要 / BIM属性付与が手作業
方法3. Unity内プロトタイプ(Unity単体)
- Unityで点群描画(ComputeBuffer / VFX Graph / Pcxアセット)
 - RANSACで平面検出(床・壁)
 - 輪郭抽出→押し出しで簡易壁メッシュ
 - C#スクリプトでBIM属性(コンポーネント)を付与
 
長所: Unityだけで完結 / 学習コスト低
短所: 精度・効率に限界
3. Unity内での最小ワークフロー
点群読み込み・表示
- 
.ply形式推奨(位置XYZ + 色RGB) - ComputeBufferとGPUシェーダで高速描画
 - 巨大データはタイル化・LODで最適化
 
平面検出(RANSAC)
- 大きな平面→床、次に大きい→壁群
 - 輪郭抽出→押し出しで壁メッシュ生成
 
BIM属性付与
public class BimElement : MonoBehaviour
{
    public string IfcType; // "IfcWall" など
    public string ElementId;
    public Dictionary<string, string> Properties = new();
}
4. 外部ツール併用のコツ
- CloudCompare: ノイズ除去、VoxelGrid軽量化、RANSAC Shape Detection
 - 
Open3D: 
segment_plane()、cluster_dbscan()、PoissonRecon - IfcOpenShell: IfcWall/IfcSlab生成、属性付与、IFC出力
 
5. Unityでのレンダリング最適化
- URP(Quest/モバイル)、HDRP(PC)を使い分け
 - LOD、オクルージョン、インスタンシングで負荷軽減
 - フロアごとのAdditive Scene化
 
6. 拡張案
- E57リーダー実装例追加
 - タイル分割&LOD対応
 - セクションカットや計測UI
 - IFC属性付与機能
 
Discussion