【Python】UnrealEngine5 アクターの行動ログをCSVに保存して3D可視化してみた【UE5】(11)

Unreal Engine 5

はじめに

今まで開発してきた要素技術を結集して,アクターの行動(位置,向き)をCSVに保存して,データを可視化してみました.

環境

  • Unreal Engine 5.0.3
  • Windows11
  • Editor Utility Widgetsを実行できる環境が必要です(下記の記事の環境からやっていきます)
【Blueprint】UnrealEngine5 現在時刻を文字列で取得する関数を作成してみた【UE5】(9)
UnrealEngine5のBlueprintで現在時刻を文字列で取得する関数がなかったので自作してみました.

データを取得

Pawnの位置と向きを取得

Pawnのキャラクターオブジェクトを変数に保存しておき,その後,Get Actor Locationで位置情報を取得します.また,Get Actor Rotationで向きを取得します.

file

タイムスタンプをカウンタの定義

今のタイムスタンプの値に,tickDelta timeを足すことでタイムスタンプを定義します.また,毎tickごとに上昇するカウンタを定義します.

最後に,前回作成した,現在の時刻を取得する関数をPythonで構築して変数に代入します.

file

データ保存部分

初期化部分

初期化部分では,まず,カウンタの値が1のとき,ブランチはFalseとなり今の時刻の文字列をファイル名Save File Nameにセットする.プロジェクトのSavedフォルダもSave Dirにセットする.

file

次に,出力したい変数を接続する.

file

Pythonコードには変数を受け取るようにする.

import utils

import importlib
importlib.reload(utils)

if(counter > 1):
    write_row   = [timestamp, date_str, x, y, z, roll, pitch, yaw]
else:
    write_row   = ["timestamp", "date_str", "x", "y", "z", "roll", "pitch", "yaw"]

file_name   = save_file_name + ".csv"

print(file_name)
# save_dir    = r"D:\Local_Project\1002_UE5\1002_11_Tanya_of_Air\TanyaOfAir_v3\Saved"
utils.write_data(write_row=write_row, save_dir=save_dir, file_name=file_name)

リストを保存するutils.write_dataの中身はこちら.

from datetime import datetime as dt
import csv

def get_now_str():
    tdatetime = dt.now()
    tstr = tdatetime.strftime('%Y-%m-%d_%H-%M-%S.%f')
    return tstr

def write_data(write_row, save_dir, file_name):
    with open(save_dir + '/' + file_name, 'a', newline="") as f:
        writer = csv.writer(f)
        writer.writerow(write_row)

最終的にはこのようになります.

実行結果

実行結果はこちら,タイムスタンプと位置情報が出力されていることが分かります.

PIE: サーバーにログインしました
PIE: PIE合計開始時間 0.568 秒。
LogBlueprintUserMessages: [NewEditorUtilityWidgetBlueprint_C_0] X=-9484.004 Y=-9067.141 Z=92.150
LogBlueprintUserMessages: [NewEditorUtilityWidgetBlueprint_C_0] 0.125
LogPython: 2022-11-05_14-29-23.497034.csv
LogBlueprintUserMessages: [NewEditorUtilityWidgetBlueprint_C_0] X=-9484.004 Y=-9067.141 Z=92.150
LogBlueprintUserMessages: [NewEditorUtilityWidgetBlueprint_C_0] 0.25
LogPython: 2022-11-05_14-29-23.497034.csv
LogBlueprintUserMessages: [NewEditorUtilityWidgetBlueprint_C_0] X=-9484.004 Y=-9067.141 Z=92.150
LogBlueprintUserMessages: [NewEditorUtilityWidgetBlueprint_C_0] 0.277067
LogPython: 2022-11-05_14-29-23.497034.csv
LogBlueprintUserMessages: [NewEditorUtilityWidgetBlueprint_C_0] X=-9484.004 Y=-9067.141 Z=92.150
LogBlueprintUserMessages: [NewEditorUtilityWidgetBlueprint_C_0] 0.312832
LogPython: 2022-11-05_14-29-23.497034.csv
LogBlueprintUserMessages: [NewEditorUtilityWidgetBlueprint_C_0] X=-9484.004 Y=-9067.141 Z=92.150
LogBlueprintUserMessages: [NewEditorUtilityWidgetBlueprint_C_0] 0.328898
LogPython: 2022-11-05_14-29-23.497034.csv
LogBlueprintUserMessages: [NewEditorUtilityWidgetBlueprint_C_0] X=-9484.004 Y=-9067.141 Z=92.150
LogBlueprintUserMessages: [NewEditorUtilityWidgetBlueprint_C_0] 0.34632
LogPython: 2022-11-05_14-29-23.497034.csv
LogBlueprintUserMessages: [NewEditorUtilityWidgetBlueprint_C_0] X=-9484.004 Y=-9067.141 Z=92.150
LogBlueprintUserMessages: [NewEditorUtilityWidgetBlueprint_C_0] 0.36336
LogPython: 2022-11-05_14-29-23.497034.csv
LogBlueprintUserMessages: [NewEditorUtilityWidgetBlueprint_C_0] X=-9484.004 Y=-9067.141 Z=92.150
LogBlueprintUserMessages: [NewEditorUtilityWidgetBlueprint_C_0] 0.381564
LogPython: 2022-11-05_14-29-23.497034.csv
LogBlueprintUserMessages: [NewEditorUtilityWidgetBlueprint_C_0] X=-9484.004 Y=-9067.141 Z=92.150
LogBlueprintUserMessages: [NewEditorUtilityWidgetBlueprint_C_0] 0.39985
LogPython: 2022-11-05_14-29-23.497034.csv

...

file

描画プログラム

import package

必要なパッケージをインポートします.

import pandas as pd
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

setting param

パラメータを設定します.

data_path = r"data\2022-11-05_14-46-05.930772.csv"

read csv

出力されたデータを表示します.

df = pd.read_csv(data_path)
print(df)
          timestamp                    date_str            x            y  \
    0      0.250000  2022-11-05_14-46-06.070584 -7013.766737 -6816.370786   
    1      0.269430  2022-11-05_14-46-06.089587 -7013.766737 -6816.370786   
    2      0.289272  2022-11-05_14-46-06.109588 -7013.766737 -6816.370786   
    3      0.309727  2022-11-05_14-46-06.130588 -7013.766737 -6816.370786   
    4      0.346642  2022-11-05_14-46-06.166589 -7013.766737 -6816.370786   
    ...         ...                         ...          ...          ...   
    3477  62.293470  2022-11-05_14-47-08.114840 -1130.888339   720.840797   
    3478  62.312889  2022-11-05_14-47-08.133047 -1130.888339   720.840797   
    3479  62.329176  2022-11-05_14-47-08.148943 -1130.888339   720.840797   
    3480  62.346533  2022-11-05_14-47-08.167305 -1130.888339   720.840797   
    3481  62.366535  2022-11-05_14-47-08.187876 -1130.888339   720.840797   

                  z  roll  pitch         yaw  
    0     92.150006  -0.0    0.0   41.206642  
    1     92.150006  -0.0    0.0   41.206642  
    2     92.150006  -0.0    0.0   41.206642  
    3     92.150006  -0.0    0.0   41.206642  
    4     92.150006  -0.0    0.0   41.206642  
    ...         ...   ...    ...         ...  
    3477  92.150005   0.0    0.0 -162.413651  
    3478  92.150005   0.0    0.0 -162.413651  
    3479  92.150005   0.0    0.0 -162.413651  
    3480  92.150005   0.0    0.0 -162.413651  
    3481  92.150005   0.0    0.0 -162.413651  

    [3482 rows x 8 columns]

Visual plot

3D グラフをプロットします.

# Figureを追加
fig = plt.figure(figsize = (8, 8))

# 3DAxesを追加
ax = fig.add_subplot(111, projection='3d')

# Axesのタイトルを設定
ax.set_title("", size = 20)

# 軸ラベルを設定
ax.set_xlabel("x", size = 14, color = "r")
ax.set_ylabel("y", size = 14, color = "r")
ax.set_zlabel("z", size = 14, color = "r")

# 軸
ax.set_xlim(-8000, 2000)
ax.set_ylim(-8000, 2000)
ax.set_zlim(0, 1000) 

# 曲線を描画
ax.scatter(df['x'].values, df['y'].values, df['z'].values, s = 5, c = "blue")

# 画像を保存
plt.savefig("sin.png")
# plt.show()

結論

アクターの行動をCSVに出力させてから,そのCSVを読み込み3Dプロットしてみました.

参考文献

【python】UnrealEngine5のEditor Utility Widgetを使ってpythonを使ってみる~Hello world~【UE5】
UnrealEngine5でpythonを使っていきます.PluginはPython Editor Script Pluginを使っていきます(私の場合は最初から入っていました).その結果,無事にHello worldまでいけました.
【python】UnrealEngine5のpythonでpipを使ってみる~Numpyのインストール~【UE5】
概要UnrealEngine5でpythonのpipを使っていきます.その結果無事にpipを使ってnumpyを入れてnumpyの関数を使うことができました.はじめに記事の背景最近,UnrealEngine5でPythonを使っ...
【python】UnrealEngine5のPythonでCSVを出力してみる【UE5】
UnrealEngine5のPythonでCSVを出力してみます.

コメント

タイトルとURLをコピーしました