3.2K Views
February 01, 25
スライド概要
FutureSoftware代表の和田です。 SE・プログラム・インフラ構築・スマホアプリ・クラウド関連等々システムの事ならなんでも対応可能です。 今後はゲームエンジン関係の仕事も広げようとUnrealEngineの事をつぶやいています 透明な名刺が特徴です
02/01/2025 Unreal Engine Meetup in Shizuoka Unreal 3Dで眺める静岡県 Shizuoka Prefecture in Unreal 3D
Introduction Unreal Engine Meetup in Shizuoka FutureSoftware 代表 Toshiyuki Wada (ぽちお) WEBシステム・AIシステム・モバイルアプリ・インフラ構 築・シス テム 設 計 等 システムの 事 なら 何 でもやってます。 (C++/Java/PHP/Python/JS(TS)/Kotlin/Swift等を習得) UnrealEngine歴は4年 UnrealEngine静岡実行委員会・UE5勉強会「UE5Night」運 営・UE5ぷちコン友の会運営
Contents Unreal Engine Meetup in Shizuoka TABLE OF CONTENTS 01 | Unreal 3DS 02 | Virtual Shizuoka MotionJPEGを使った簡易的な 2画面立体視の仕組み Virtual Shizuokaの点群データ を使ったデモゲームの紹介 03 | Data Conversion 04 | UE5自動化のすゝめ 点群データからメッシュデータへ 変換 Editor Utility Widget & Python Scriptによる処理の自動化
Section 01 Unreal Engine Meetup in Shizuoka Unreal 3DS MotionJPEGを使った簡易的な2画面立体視の仕組み
Unreal 3DS Unreal 3DSとは? Qiita Unreal Engine (UE) Advent Calendar 2024の為に開発 した2画面&立体視の仕組みです。 Google Cardboardを参考にしており、超低コストでVR体験が できます。 仕組みは単純で、ゲームカメラとは別に配置した立体視用のカ メラ画像を、UnrealEngineに組み込んだWEBサーバ経由でス マホに転送し続けているだけです。 スマホを2,000~3,000 円 で 売 ってるVRゴーグルにセットすれ ば、簡易VRヘッドセットの完成!! Unreal Engine Meetup in Shizuoka
小難しい話しは置いといて・・・ Unreal Engine Meetup in Shizuoka なんか楽しそう な仕組みを作 りたかった こんな動機で作ったものですが、モバイルアプリ開発の環境設定しなくていいし、VRヘッドセットも不要なの で、気軽にVRを楽しめるという意味では良い開発ができたかな?と思っています。
Unreal 3DS 解説 Unreal Engine Meetup in Shizuoka SceneCaptureカメラ(2つ) 左右の画像を合成 WEBサーバから画像を配信 (パラパラ漫画のように ) スマホの WEBブラウザで VR体験 https://ueblog.futuresoftware.dev/archives/2041
Section 02 Unreal Engine Meetup in Shizuoka Virtual Shizuoka Virtual Shizuokaの点群データを使ったデモゲームの紹介
Virtual Shizuoka 静岡県をデジタル化!? 点群データやフォトグラメトリなど、デジタルツインに関連する技術 が発展することで、災害対策やシミュレーション、都市計画、環境 保全、観光、教育、建築、自動運転等様々な分野にメリットがあり ます。 また、 世 界 的 に 見 ても「フューチャー・ナウ・プロジェクト」として 気 候 変 動の危 機に直 面しているツバルが国 家をデジタルツインで バックアップするというニュースが話題になってます。 その可能性に無料で触れることができる Virtual Shizuokaはとても 素晴らしい取り組みだと思います。 Unreal Engine Meetup in Shizuoka
小難しい話しは置いといて・・・ Unreal Engine Meetup in Shizuoka ゲームの中で 空から自宅を 見たい! 注:自宅はこんなに広くありません 正直、知ってるエリアの3Dデータを眺めているだけでもテンション爆上がりです! まだ2歳の息子だって、UnrealEngineでVirtualShizuokaのデータを開いてるだけで寄ってきます!
そして、ここは静岡新聞社 Unreal Engine Meetup in Shizuoka 新聞社と言えば報道用ヘリコプター! ヘリコプターで自 分の住んでい るエリアを 飛 び 回 って、3 Dで 空 から眺めてみたい!!
ヘリコプターゲーム作ってみた Unreal Engine Meetup in Shizuoka
感想 すごく楽しい・・・ Unreal 3DS&点群のドット感の組 み合わせも独特の雰囲気で悪くな い!! Unreal Engine Meetup in Shizuoka
Section 03 Unreal Engine Meetup in Shizuoka Data Conversion 点群を3Dモデル(メッシュ)化してみよう
Data Conversion 点群を3Dモデルに簡易変換 今回は以下の仕組みで変換してみました。 1.Las2Mesh(https://github.com/ksasao/Las2Mesh)を使用し て点群形式(las)を、3Dモデル形式(ply)に変換 2.Blenderを使用して3Dモデル形式(ply)をデシメート(メッシュ の頂点・面を削減)しながら、UnrealEngineで取り込めるFBX形 式に変換 3.FBXをUnrealEngineに取り込み、頂点カラーで着色するマ テリアルを適用する Unreal Engine Meetup in Shizuoka
ただ・・・ Unreal Engine Meetup in Shizuoka VirtualShizuokaの点群データの数、半端ない!! 膨大なデータ データ変換時間 ヘリコプターゲームで使用し た点群データは345個 ! 情報量が多いので、変換・デ シメートに時間が掛かる インポート時間 どうしよう・・・ UEへのインポートも時間が 掛かる パソコンの前に張り付く時間 がもったいない・・・
アンケート取ってみました Unreal Engine Meetup in Shizuoka あなたはデータ変換中に何をしますか? 100 % 80 % 60 % 40 % 20 % 0% 間食 寝る 遊ぶ Youtube X(twitter) 回答者: 1人(ぽちお)
・・・てことで Unreal Engine Meetup in Shizuoka そうだ!自動化しよう! PC稼働中は限界までスペックを使い倒してこそ意味がある!!CPUがアイドルしてるなんで勿体ない!!
Section 04 Unreal Engine Meetup in Shizuoka UE5自動化のすゝめ Editor Utility Widget と Python Scriptを使った自動化について
UE5自動化について Unreal Engine Meetup in Shizuoka UE5には様々な自動化の方法があります Editor Utility Widget Python Editor Script Plugin ブループリントベースでエディタ操 作をカスタマイズできる仕組み。 アクタの配置から、データテーブル への登録等様々な操作が行える。 Unreal Python APIを使用したエ ディタ操作が行える。 バッチ処理・大量アセットインポート ・カスタムツールの作成などが行え る。 Etc… ・Procedural Content Generation ・自動テストフレームワーク ・パッケージ化の自動化(UBT) などなど
Editor Utility Widget Unreal Engine Meetup in Shizuoka
Editor Utility Widget Unreal Engine Meetup in Shizuoka 地図を自動的に配置させる為のロジックは以下のようになっています。 BPだけで組めるので、簡単に自動化ツールを作成することができます。 Virtual Shizuoka の点群データファイル名は”08AB1234”のよ うになっており、3桁目・5桁目・7桁目が南北方向の、4桁目・6桁 目・8桁目が東西方向の座標となっており、1つの点群データが 40000×30000サイズになっている為、ファイル名から表示すべき 座標を算出しています。 08ND7763 08ND7772 08ND7773 08ND7783 08ND7774
Editor Utility Widget Unreal Engine Meetup in Shizuoka 補助的な関数は、このようなロジックとなっています。ファイル 名から指定した桁数を抜き出して、英字を数字に変換していま す。
Python Editor Script Plugin Unreal Engine Meetup in Shizuoka Unreal Python APIを使用して様々な自動化プロセスを組み込むことができます。Pythonを利用しているの で、Unreal Engine Editor外のリソース(PC内のファイル等)を直接扱う事もできるという利点があります。今回 は、Blenderが出力したFBXファイルを取り込む際に利用しています。 マテリアルも自動で 割り当て 今回は全345ファイル FBXのインポートだけならドラッグ&ドロップだけで良いじゃん!って感じですが、「FBXが大きすぎて (50~100MB)インポート時に落ちる可能性がある」&「マテリアルも割り当て状態でインポートしたい」という理 由でPythonによるインポートを採用しました。
Python Editor Script Plugin
Unreal Engine Meetup in Shizuoka
import os
import unreal
# アセットをインポート
asset_tools.import_asset_tasks([import_task])
def import_fbx_and_assign_material_with_skip(source_folder, destination_folder, material_path,
batch_size=3):
# インポートされたアセットをロード
imported_asset = editor_asset_lib.load_asset(asset_path)
# Unreal Engineの必要なAPIを取得
asset_tools = unreal.AssetToolsHelpers.get_asset_tools()
editor_asset_lib = unreal.EditorAssetLibrary
# 指定されたマテリアルが存在するか確認
material = editor_asset_lib.load_asset(material_path)
if not material:
unreal.log_error(f "Material at '{material_path}' could not be found.")
return
# 指定フォルダ内のすべてのFBXファイルをリストアップ
fbx_files = [os.path.join(source_folder, f ) for f in os.listdir(source_folder) if f.endswith(".fbx")]
batch_counter = 0
for fbx_file in fbx_files:
# FBXファイル名(拡張子なし)とアセットパスを取得
asset_name = os.path.splitext(os.path.basename(fbx_file))[0]
asset_path = f "{destination_folder}/{asset_name}"
# アセットがすでに存在するか確認
if editor_asset_lib.does_asset_exist(asset_path):
unreal.log(f "Skipped: {asset_name} (already exists in {destination_folder})")
continue
# インポートタスクを設定
import_task = unreal.AssetImportTask()
import_task.filename = fbx_file
import_task.destination_path = destination_folder
import_task.automated = True
import_task.save = True
# アセットが正しくロードされたか確認
if not imported_asset:
unreal.log_warning(f "Asset '{asset_name}' could not be loaded.")
continue
# インポートされたアセットが Static Meshの場合、マテリアルを適用
if isinstance(imported_asset, unreal.StaticMesh):
static_mesh = imported_asset
static_mesh.set_material(0, material)
unreal.EditorAssetLibrary.save_loaded_asset(static_mesh)
unreal.log(f "Material '{material_path}' assigned to '{asset_name}'.")
else:
unreal.log_warning(f "Asset '{asset_name}' is not a Static Mesh.")
# バッチ処理のカウントを増加
batch_counter += 1
# 指定されたバッチサイズごとにメモリを解放
if batch_counter >= batch_size:
unreal.log("Batch processed, clearing memory.")
unreal.SystemLibrary.collect_garbage()
batch_counter = 0
unreal.log("FBX import and material assignment completed.")
source_folder = "H:/UnrealEngineSampleProjects/LiDARShizuoka" # FBXが格納されたフォルダ
destination_folder = "/Game/VirtualShizuoka" # FBXをインポートする先
material_path = "/Game/LiDAR/M_VirtualShizuokaMap" # 共通マテリアル
import_fbx_and_assign_material_with_skip(source_folder, destination_folder, material_path)
Python Editor Script Plugin Unreal Engine Meetup in Shizuoka Python Editor Script Pluginを使ったPython Scriptの実行方法はとても簡単です! プラグインが有効になっていることを確認します。 (UE5.5ではデフォルトで有効になっていました ) [ツール] -> [Pythonスクリプトを実行 ]を選択し、ファイル選択ダイアログで実行した いPythonファイルを開くだけです
マテリアルについて Unreal Engine Meetup in Shizuoka 点群データに頂点カラーが含まれてい る為、点群データを変換した FBXでも、 このマテリアルを適用すれば色が付き ます。
Las2MeshとBlenderも自動化
Unreal Engine Meetup in Shizuoka
Las2Meshでlasをplyに一括変換
(.batファイルとして作成 )
Blender用のPython Scriptを使って plyをデシメートし
てFBXとして出力
@echo off
REM LASファイルが格納されたフォルダを指定
set "INPUT_FOLDER=H:\UnrealEngineSampleProjects\LiDARShizuoka"
import bpy
import os
REM las2mesh.exe のパスを指定
set "LAS2MESH_EXE=C:\las2mesh_v0.2\las2mesh.exe"
REM 出力形式の指定 (ply形式)
set "OUTPUT_FORMAT=ply"
REM フォルダ内のすべてのLASファイルを処理
for %%f in ("%INPUT_FOLDER%\*.las") do (
REM ファイル名のみ取得(拡張子を除く)
setlocal enabledelayedexpansion
set "FILENAME=%%~nf "
endlocal
REM las2meshを実行し、ply形式で出力
"%LAS2MESH_EXE%" "%%f " -n -o "%INPUT_FOLDER%\%%~nf.%OUTPUT_FORMAT%"
echo %%f を変換中...
)
echo 全てのファイルが変換されました。
pause
input_dir = "H:\\UnrealEngineSampleProjects\\LiDARShizuoka"
output_dir = "H:\\UnrealEngineSampleProjects\\LiDARShizuoka"
# 出力ディレクトリが無い場合は作成
if not os.path.exists(output_dir):
os.makedirs(output_dir)
# 入力ディレクトリのファイルを全て取得
for file_name in os.listdir(input_dir):
if file_name.endswith(".ply"):
input_path = os.path.join(input_dir, file_name)
output_path = os.path.join(output_dir, os.path.splitext(file_name)[0] + ".fbx")
bpy.ops.wm.read_factory_settings(use_empty=True)
bpy.ops.import_mesh.ply(filepath=input_path)
imported_objects = bpy.context.scene.objects
for obj in imported_objects:
if obj.type == 'MESH':
# モディファイヤーでデシメート
mod = obj.modifiers.new(name="Decimate", type='DECIMATE')
mod.ratio = 0.5
bpy.context.view_layer.objects.active = obj
bpy.ops.object.modifier_apply(modifier="Decimate")
bpy.ops.export_scene.fbx(filepath=output_path)
print(f "Converted: {file_name} to {output_path}")
Thank you Unreal Engine Meetup in Shizuoka THANK YOU! Do you have any questions? [email protected] @toshiyuki_wada