获取对象边界框
本示例演示如何根据对象的语义标签获取其边界框。由于需要在虚幻编辑器中运行 Python 脚本,因此此方法仅适用于自定义关卡。
首先,您需要配置虚幻编辑器以使用 Python。请参阅虚幻的 Python 配置指南。
确保您的自定义关卡已设置语义标签。请参阅添加自定义语义标签部分。然后,您可以使用语义标签更新 map_label2id。
import os
import csv
import unreal
def get_id(label):
# 请在 map_label2id 中填写您世界地图的标签及其对应的数字
map_label2id = {
"None": 0, # None = 0u
"Asphalt": 1, # Asphalt = 1u
"Bench": 2, # Bench = 2u
... # 在此处添加更多标签
"Any": 255 # Any = 0xFF
}
return map_label2id.get(label, -1) # 如果未找到标签,则返回 -1
if __name__ == '__main__':
# 获取编辑器参与者子系统
actor_subsystem = unreal.get_editor_subsystem(unreal.EditorActorSubsystem)
# 获取当前关卡中的所有参与者
actors = actor_subsystem.get_all_level_actors()
# 调整保存 CSV 文件的路径
csv_path = os.path.expanduser("/path/to/file.csv")
# 如果您想要朝向边界框(能紧贴着物体旋转)而不是轴对齐边界框(必须平行于世界坐标系的坐标轴),请将值设置为 False
getAxisAligned = True
# 打开 CSV 文件进行写入
with open(csv_path, mode="w", newline="") as csvfile:
writer = csv.writer(csvfile)
# 写入头
# writer.writerow(["UniqueID", "ClassName", "ClassID", "OriginX", "OriginY", "OriginZ", "ExtentX", "ExtentY", "ExtentZ"])
writer.writerow([
"UniqueID", "ClassName", "ClassID",
"OriginX", "OriginY", "OriginZ",
"ExtentX", "ExtentY", "ExtentZ",
"RotRoll_deg", "RotPitch_deg", "RotYaw_deg"
])
unique_id_counter = 0
for actor in actors:
class_name = str(actor.get_folder_path())
class_id = get_id(class_name)
if getAxisAligned:
################################################
## 选项 1:返回轴对齐的边界框 ##
################################################
origin, extent = actor.get_actor_bounds(False)
writer.writerow([
unique_id_counter,
class_name,
class_id,
origin.x, origin.y, origin.z,
extent.x, extent.y, extent.z
])
else:
############################################
## 选项 2:返回朝向边界框 ##
############################################
origin, extent = actor.get_actor_bounds(False)
rotation = actor.get_actor_rotation() # 返回虚幻引擎旋转器:俯仰角、偏航角、横滚角
writer.writerow([
unique_id_counter,
class_name,
class_id,
origin.x / 100, -origin.y / 100, origin.z / 100,
extent.x / 100, extent.y / 100, extent.z / 100,
rotation.roll, rotation.pitch, rotation.yaw,
])
unique_id_counter += 1
print(f"Saved actor bounds to {csv_path}")
要运行 Python 脚本,您可以转到“工具”>“执行 Python 脚本”。

以下是我们商务园区关卡边界框的示例。
