Unreal Engine で BIM のメタデータいじってみる

### まえがき
なかむらた と申します。
Unreal Engine とか XR の分野から 建設ドメイン も部分的にやっている人間です。
BIMとかを触ることはあっても作る/使う ことは自分はないです。建設現場とかに行く人間ではないです。
そこまで、長年やってきたとかでもないので、認識甘かったり、情報間違ってるかもしれません。ご容赦を

これは Unreal Engine (UE) Advent Calendar 2023の16日目の記事です。

https://qiita.com/advent-calendar/2023/ue

なので、主にUnreal Engine 界隈メインの読者を想定していて、BIM関連の軽い説明も書いておきます。

# 今回作ったもの

<blockquote class="twitter-tweet" data-media-max-width="560"><p lang="ja" dir="ltr">「Unreal Engine で BIM のメタデータいじってみる」<a href="https://t.co/bdIcGa8l62">https://t.co/bdIcGa8l62</a> <a href="https://twitter.com/hashtag/Qiita%E3%82%A2%E3%83%89%E3%82%AB%E3%83%AC?src=hash&amp;ref_src=twsrc%5Etfw">#Qiitaアドカレ</a> <a href="https://twitter.com/hashtag/Qiita?src=hash&amp;ref_src=twsrc%5Etfw">#Qiita</a> <br>Unreal Engine (UE) Advent Calendar 2023 書きました！<a href="https://twitter.com/hashtag/UnrealEngine?src=hash&amp;ref_src=twsrc%5Etfw">#UnrealEngine</a> <a href="https://twitter.com/hashtag/BIM?src=hash&amp;ref_src=twsrc%5Etfw">#BIM</a> <a href="https://twitter.com/hashtag/Datasmith?src=hash&amp;ref_src=twsrc%5Etfw">#Datasmith</a> <a href="https://t.co/uzFJqMptYV">pic.twitter.com/uzFJqMptYV</a></p>&mdash; なかむらた Nakamurata (@isutothukue) <a href="https://twitter.com/isutothukue/status/1736171756552065499?ref_src=twsrc%5Etfw">December 16, 2023</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

# BIM とは
主に建設業関連の用語です！
BIM = Building Information Modeling

自分なりの説明だと、
建物の3Dモデルに、材料とかコストとかの属性データが付加された、建築物のデータベース。
建設に関わる、設計、施工、維持管理、等々を長期的視点で効率化していくための一手段。
とかいう風に認識してます。(ゆるゆる)

知ってる人も多いと思うんで軽く。
詳しくは自分で調べてください！

# Revit とは
BIMでデファクトスタンダードみたいになってるソフトウェアです。
https://www.autodesk.co.jp/products/revit/


# IFC とは

* BIMの情報を保存するフォーマットの一つ。

|　　　　　　　　  　　　　　　　　   　　　　　　　　　　　　　　　　　　　　　　　　　|
|:-:|
|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/442991/25d30ed8-8a84-c0ed-8aff-277a0f35cef1.png)[IFC勉強会: IFCおよび関連技術とその動向　buildingSMART Japan 足立嘉信](https://www.slideshare.net/YoshinobuAdachi/ifc-ifc) 様 より引用|


IFC勉強会: IFCおよび関連技術とその動向　buildingSMART Japan 足立嘉信 様

https://www.slideshare.net/YoshinobuAdachi/ifc-ifc

国土地理院さんの資料も非常に僕は助かりました。

https://www.gsi.go.jp/common/000199470.pdf

IFCファイル自体はテキストエディタとかで中身見て解読できる

https://qiita.com/kiyuka/items/00434f1b8e0b38c621fb


# Revit で Datasmith に書き出す。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/442991/feb9adf9-4590-8cb0-23b9-10098555d02e.png)

[Revit 用 Datasmith エクスポータ プラグイン](https://docs.unrealengine.com/4.27/ja/WorkingWithContent/Importing/Datasmith/SoftwareInteropGuides/Revit/InstallingExporterPlugin/) を使ってExpoortすればよい

# Datasmith　に関して
Epic曰く
>Datasmith は、コンテンツを Unreal Engine 5 に取り込むときに役に立つ各種ツールおよびプラグインをまとめたものです。

とのこと

https://www.unrealengine.com/ja/datasmith

他BIM/CADソフトとかからdatasmith形式にデータを変換してExportするSDK提供してたり、
フォーマット作ってたり、
Unreal Engine 内 のデフォルトプラグインとして機能提供してたり、

自分の認識ではDatasmithは幅広い範囲を守備していて、もわっとしている印象だったが、
どうやらもやっと広範囲という認識でよかったらしい。


例えば Revit からDatasmithを書き出すと、以下のように、
一つの udatasmithファイル と、そこから参照される、udsmeshとかいう謎ファイルがたくさんといくつかの画像ファイルが作成される。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/442991/2f4752df-a6d6-4fc9-4868-8dc5020a89a0.png)

udatasmith形式はテキストエディタ等で解読できる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/442991/f21a0ad6-c1de-ef66-3f12-3047a7c90364.png)
IFCに似てる
※udsmeshファイルはバイナリでテキストエディタ等で見れない
※rvtファイル (Revitのプロジェクトを保存するフォーマット) は余裕でバイナリ。


# Unreal で BIM を表示してみる

Datasmithここからインポート (昔とUI変わってよく迷子になる)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/442991/21853366-eedf-1fa4-a894-eb1e05130c76.png)

.uatasmith フォーマットは当然、IFCファイルも直でインポート可能

<details><summary>以下のフォーマットがインポートできる</summary>


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/442991/21566e5a-4ceb-f397-4faf-552ffd56a53c.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/442991/57065483-146f-471a-4331-32dfcb0d205a.png)



</details>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/442991/c348983c-665c-ffd4-803c-27c1cb4f73ad.png)


Datasmith形式ではなくIFCファイルを直接読み込んだ場合、この後に使うメタデータの情報がほとんど欠けている。
自分の設定不足なのか、そういう読み込み方なのかはわかりません。

# メタデータを利用する

ビジュアライゼーションやシミュレーションとか、用途によってはBIMをUnreal Engine に持ってくるだけで意味がある場合もありますが、まあメタデータいじりたいですよね。


https://docs.unrealengine.com/4.27/ja/WorkingWithContent/Importing/Datasmith/Overview/UsingDatasmithMetadata/

各 StaticMesh ごとに、メタデータが入っている。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/442991/58f1600b-02ad-38f5-a62c-5e7a777a16a7.png)

<details><summary>壁とかだとこんなメタデータが入ってた</summary>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/442991/6db8b0b0-ae80-a023-38a7-99aded224343.png)

</details>

メタデータいじってるところはこんな感じです。
今回は Widget Blueprint 内に処理書いてます。
BIMのメタデータのうち、 Element Category に着目して、
コンストラクタで、それぞれのメタデータを持つ、Array of Actor Object References を作っておき、
ボタンを押したら、表示非表示の切り替えをArrayの数だけループで回してます。
(グループ化とかタグとかの方が絶対効率的だとは思う...)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/442991/a1e889e1-773b-b389-cc23-b5adaba54327.png)

そんな感じで、

<blockquote class="twitter-tweet" data-media-max-width="560"><p lang="ja" dir="ltr">「Unreal Engine で BIM のメタデータいじってみる」<a href="https://t.co/bdIcGa8l62">https://t.co/bdIcGa8l62</a> <a href="https://twitter.com/hashtag/Qiita%E3%82%A2%E3%83%89%E3%82%AB%E3%83%AC?src=hash&amp;ref_src=twsrc%5Etfw">#Qiitaアドカレ</a> <a href="https://twitter.com/hashtag/Qiita?src=hash&amp;ref_src=twsrc%5Etfw">#Qiita</a> <br>Unreal Engine (UE) Advent Calendar 2023 書きました！<a href="https://twitter.com/hashtag/UnrealEngine?src=hash&amp;ref_src=twsrc%5Etfw">#UnrealEngine</a> <a href="https://twitter.com/hashtag/BIM?src=hash&amp;ref_src=twsrc%5Etfw">#BIM</a> <a href="https://twitter.com/hashtag/Datasmith?src=hash&amp;ref_src=twsrc%5Etfw">#Datasmith</a> <a href="https://t.co/uzFJqMptYV">pic.twitter.com/uzFJqMptYV</a></p>&mdash; なかむらた Nakamurata (@isutothukue) <a href="https://twitter.com/isutothukue/status/1736171756552065499?ref_src=twsrc%5Etfw">December 16, 2023</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


# インポート時にもメタデータいじれるらしい

https://docs.unrealengine.com/4.27/ja/WorkingWithContent/Importing/Datasmith/Overview/CustomizingImportProcess/

Gameplay Tag とかを使えばもっとスマートな処理できそう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/442991/ddd4bed4-fca9-6063-55bf-c018528b051b.png)


* インポート時にメタデータを読みながら、Gameplay Tag をつける。
  (例えばレベル(階層)ごと、とか、部材、カテゴリー(壁とかドアとか)ごととか)
* gameplay tag 使ってランタイムに表示非表示に切り替える

とかとか、開発はしてないですが、多分そんなことはできそうですね。

# その他参考ページ　(もっとやりこみたい方向け)
[Epic公式ドキュメント : Datasmith関連のC++ API](
https://docs.unrealengine.com/5.3/en-US/API/Runtime/DatasmithCore/)

[Epic公式ドキュメント : Datasmith エクスポート SDK ガイドライン](
https://docs.unrealengine.com/4.27/ja/WorkingWithContent/Importing/Datasmith/datasmith-sdk/)

姉妹機能として Datasmith runtime plugin もあります。
https://docs.unrealengine.com/5.2/ja/using-datasmith-at-runtime-in-unreal-engine/

共同作業&ビジュアライズ等の用途で、Directlink っていう機能もあります。



# 以上！　なかむらた でした！