CARLA
 
载入中...
搜索中...
未找到
StaticMeshFactory.cpp
浏览该文件的文档.
1// 版权所有 (c) 巴塞罗那自治大学 (UAB) 2020 计算机视觉中心 (CVC)。
2//
3// 本作品根据 MIT 许可证的条款进行许可。
4// 有关副本,请参阅 <https://opensource.org/licenses/MIT>。
5
6
7
8// 包含静态网格物体工厂相关的头文件,可能定义了创建静态网格物体相关的类、结构体等基础内容
9#include "StaticMeshFactory.h"
10// 包含Carla中用于Actor蓝图功能库的头文件,里面应该有和Actor蓝图操作相关的函数等定义
12// 包含虚幻引擎中静态网格物体Actor的头文件,用于操作相关的Actor类型(继承自Actor,代表场景中的静态网格物体实体)
13#include "Engine/StaticMeshActor.h"
14// 包含Carla游戏中Carla剧集相关的头文件,可能和游戏中的场景、关卡等相关概念有关联(具体依Carla框架而定)
16
17// AStaticMeshFactory类的成员函数,用于获取Actor定义相关信息,返回一个包含FActorDefinition类型元素的数组
18TArray<FActorDefinition> AStaticMeshFactory::GetDefinitions()
19{
20 // 使用别名ABFL来简化UActorBlueprintFunctionLibrary的书写,方便后续代码使用(一种代码简洁性的写法)
22 // 通过UActorBlueprintFunctionLibrary中的MakeGenericDefinition函数创建一个通用的Actor定义(名为StaticMeshDefinition)
23 // 参数依次为:定义的名称(这里是"static"),类型("prop"),分类("mesh"),具体含义取决于Carla框架中对Actor定义的规范
24 auto StaticMeshDefinition = ABFL::MakeGenericDefinition(
25 TEXT("static"),
26 TEXT("prop"),
27 TEXT("mesh"));
28 // 设置这个Actor定义对应的类为AStaticMeshActor类,表明这个定义关联到具体的静态网格物体Actor类型
29 StaticMeshDefinition.Class = AStaticMeshActor::StaticClass();
30 // 向StaticMeshDefinition的Variations数组中添加一个Actor变化(FActorVariation类型)的元素,用于描述Actor的可变属性
31 // 这里属性名为"mesh_path",类型是字符串类型(EActorAttributeType::String),初始值为空字符串,并且不是必需属性(false表示非必需)
32 StaticMeshDefinition.Variations.Emplace(FActorVariation{
33 TEXT("mesh_path"),
35 {""}, false});
36 // 同样添加一个名为"mass"的Actor变化元素,类型是浮点型,初始值为空字符串,非必需属性,用于描述Actor质量相关的可变属性
37 StaticMeshDefinition.Variations.Emplace(FActorVariation{
38 TEXT("mass"),
40 {""}, false});
41 // 再添加一个名为"scale"的Actor变化元素,类型是浮点型,初始值为"1.0f",非必需属性,可能用于描述Actor的缩放相关可变属性
42 StaticMeshDefinition.Variations.Emplace(FActorVariation{
43 TEXT("scale"),
45 {"1.0f"}, false});
46 // 返回包含这个定义的数组(目前数组中就这一个元素,即刚刚配置好的StaticMeshDefinition)
47 return { StaticMeshDefinition };
48}
49
50// AStaticMeshFactory类的成员函数,用于生成一个Actor(在指定的变换位置和根据给定的Actor描述信息),返回生成结果(FActorSpawnResult类型)
52 const FTransform &SpawnAtTransform,
53 const FActorDescription &ActorDescription)
54{
56 // 获取当前所在的世界指针,如果为空,表示没有有效的世界场景,那就无法生成Actor(后续会进行相应错误处理)
57 auto *World = GetWorld();
58 if (World == nullptr)
59 {
60 // 使用UE_LOG宏输出错误日志信息,表示在空世界中无法生成网格物体Actor
61 UE_LOG(LogCarla, Error, TEXT
62 ("AStaticMeshFactory: cannot spawn mesh into an empty world."));
63 // 返回一个默认构造的空的FActorSpawnResult,表示生成失败
64 return {};
65 }
66
67 // 从Actor描述信息(ActorDescription)的可变属性中获取名为"scale"的属性值,并转换为浮点数类型,若获取失败则使用默认值1.0f
68 float Scale = ABFL::RetrieveActorAttributeToFloat("scale", ActorDescription.Variations, 1.0f);
69 // 创建一个新的变换(FTransform类型)对象ScaledTransform,初始值为传入的生成位置变换(SpawnAtTransform)
70 FTransform ScaledTransform(SpawnAtTransform);
71 // 设置ScaledTransform的缩放比例为通过前面获取到的Scale值构成的三维向量(用于对生成的Actor进行缩放设置)
72 ScaledTransform.SetScale3D(FVector(Scale));
73
74 // 创建Actor生成参数对象,用于配置生成Actor时的一些碰撞处理等相关参数
75 FActorSpawnParameters SpawnParameters;
76 // 设置Actor生成时碰撞处理的覆盖方式为总是生成(即使有碰撞也强制生成,具体碰撞处理逻辑依虚幻引擎的机制)
77 SpawnParameters.SpawnCollisionHandlingOverride =
78 ESpawnActorCollisionHandlingMethod::AlwaysSpawn;
79 // 在世界(World)中按照给定的Actor描述信息中的类(ActorDescription.Class)、缩放后的变换(ScaledTransform)以及生成参数(SpawnParameters)生成一个静态网格物体Actor
80 auto *StaticMeshActor = World->SpawnActor<AStaticMeshActor>(
81 ActorDescription.Class, ScaledTransform, SpawnParameters);
82
83 // 将生成的静态网格物体Actor的根组件转换为静态网格物体组件(UStaticMeshComponent类型),方便后续对网格物体相关属性进行操作
84 auto *StaticMeshComponent = Cast<UStaticMeshComponent>(
85 StaticMeshActor->GetRootComponent());
86
87 if (StaticMeshComponent)
88 {
89 // 检查Actor描述信息的可变属性中是否包含名为"mesh_path"的属性(意味着是否有指定网格物体的路径相关信息)
90 if (ActorDescription.Variations.Contains("mesh_path"))
91 {
92 // 从Actor描述信息的可变属性中获取名为"mesh_path"的属性值,并转换为字符串类型,若获取失败则使用默认值空字符串
93 FString MeshPath = ABFL::ActorAttributeToString(
94 ActorDescription.Variations["mesh_path"], "");
95
96 // 根据获取到的网格物体路径(MeshPath)加载对应的静态网格物体资源(UStaticMesh类型),nullptr表示默认的加载路径相关上下文(可能是全局范围查找等情况)
97 UStaticMesh *Mesh = LoadObject<UStaticMesh>(nullptr, *MeshPath);
98 // 先将静态网格物体组件的移动性设置为可移动(EComponentMobility::Movable,方便后续设置网格物体等操作)
99 StaticMeshComponent->SetMobility(EComponentMobility::Movable);
100 // 尝试将加载的静态网格物体(Mesh)设置到静态网格物体组件上,如果设置失败则输出警告日志信息
101 if (!StaticMeshComponent->SetStaticMesh(Mesh))
102 UE_LOG(LogCarla, Warning, TEXT("Failed to set the mesh"));
103 // 再将静态网格物体组件的移动性设置回静态(EComponentMobility::Static,完成设置网格物体后的状态调整)
104 StaticMeshComponent->SetMobility(EComponentMobility::Static);
105
106 // 检查Actor描述信息的可变属性中是否包含名为"mass"的属性(意味着是否有指定质量相关信息)
107 if (ActorDescription.Variations.Contains("mass"))
108 {
109 // 从Actor描述信息的可变属性中获取名为"mass"的属性值,并转换为浮点数类型,若获取失败则使用默认值0.0f
110 float Mass = ABFL::RetrieveActorAttributeToFloat("mass", ActorDescription.Variations, 0.0f);
111 if (Mass > 0)
112 {
113 // 如果质量大于0,将静态网格物体组件的移动性设置为可移动,使其可以参与物理模拟等操作
114 StaticMeshComponent->SetMobility(EComponentMobility::Movable);
115 // 开启静态网格物体组件的物理模拟功能,使其能受物理引擎影响(如重力、碰撞等)
116 StaticMeshComponent->SetSimulatePhysics(true);
117 // 设置静态网格物体组件的碰撞配置文件名称为"PhysicsActor",用于定义其碰撞相关的行为(依虚幻引擎中碰撞配置设定)
118 StaticMeshComponent->SetCollisionProfileName("PhysicsActor");
119 // 设置静态网格物体组件的质量(以千克为单位),使用获取到的Mass值进行设置
120 StaticMeshComponent->SetMassOverrideInKg("", Mass);
121 }
122 }
123 }
124 }
125 // 返回包含生成的静态网格物体Actor指针的生成结果对象(FActorSpawnResult类型),表示生成操作完成并返回对应的Actor信息
126 return FActorSpawnResult(StaticMeshActor);
127}
128 }
129 return FActorSpawnResult(StaticMeshActor);
130}
UE_LOG(LogCarla, Log, TEXT("UActorDispatcher::Destroying actor: '%s' %x"), *Id, Actor)
TSharedPtr< const FActorInfo > carla::rpc::ActorState UWorld * World
return FActorSpawnResult(StaticMeshActor)
TArray< FActorDefinition > GetDefinitions() final
FActorSpawnResult SpawnActor(const FTransform &SpawnAtTransform, const FActorDescription &ActorDescription) final
TMap< FString, FActorAttribute > Variations
用户选择了参与者的变化版本。请注意,此时是 由不可修改的属性表示