CARLA
 
载入中...
搜索中...
未找到
OpenDriveGenerator.cpp
浏览该文件的文档.
1// Copyright (c) 2020 Computer Vision Center (CVC) at the Universitat Autonoma
2// de Barcelona (UAB).
3//
4// This work is licensed under the terms of the MIT license.
5// For a copy, see <https://opensource.org/licenses/MIT>.
6
7// 包含头文件,用于访问Carla游戏框架和相关类
8#include "Carla.h"
10#include "OpenDriveGenerator.h"
13
14// 禁用和启用UE4宏,以避免命名冲突
17#include <carla/rpc/String.h>
19
20// 包含Unreal Engine的头文件,用于访问游戏引擎的功能
21#include "Engine/Classes/Interfaces/Interface_CollisionDataProvider.h"
22#include "PhysicsCore/Public/BodySetupEnums.h"
23
24// AProceduralMeshActor类的构造函数,用于初始化ProceduralMeshActor
26{
27 // 设置PrimaryActorTick标志,表明这个Actor不需要每帧进行Tick
28 PrimaryActorTick.bCanEverTick = false;
29
30 // 创建一个默认的子对象UProceduralMeshComponent,并命名为"RootComponent"
31 MeshComponent = CreateDefaultSubobject<UProceduralMeshComponent>(TEXT("RootComponent"));
32
33 // 将这个MeshComponent设置为Actor的根组件
34 RootComponent = MeshComponent;
35}
36
37// AOpenDriveGenerator类的构造函数,用于初始化OpenDriveGenerator
38AOpenDriveGenerator::AOpenDriveGenerator(const FObjectInitializer &ObjectInitializer)
39 : Super(ObjectInitializer)
40{
41 PrimaryActorTick.bCanEverTick = false; // 设置PrimaryActorTick标志,表明这个Actor不需要每帧进行Tick
42 RootComponent = CreateDefaultSubobject<USceneComponent>(TEXT("SceneComponent")); // 创建一个默认的子对象USceneComponent,并命名为"SceneComponent"
43 SetRootComponent(RootComponent); // 将这个SceneComponent设置为Actor的根组件
44 RootComponent->Mobility = EComponentMobility::Static; // 设置组件的移动性为静态
45}
46
47// 加载OpenDrive文件
48bool AOpenDriveGenerator::LoadOpenDrive(const FString &OpenDrive)
49{
50 using OpenDriveLoader = carla::opendrive::OpenDriveParser; // 使用carla的OpenDriveParser
51
52 if (OpenDrive.IsEmpty()) // 检查OpenDrive字符串是否为空
53 {
54 UE_LOG(LogCarla, Error, TEXT("The OpenDrive is empty")); // 如果为空,记录错误日志
55 return false;
56 }
57
58 OpenDriveData = OpenDrive; // 将OpenDrive字符串存储在成员变量中
59 return true;
60}
61
62// 获取OpenDrive数据
64{
65 return OpenDriveData;
66}
67
68// 检查OpenDrive是否有效
70{
71 return UCarlaStatics::GetGameMode(GetWorld())->GetMap().has_value(); // 检查是否有有效的地图数据
72}
73
74// 生成道路网格
76{
77 if (!IsOpenDriveValid()) // 检查OpenDrive是否有效
78 {
79 UE_LOG(LogCarla, Error, TEXT("The OpenDrive has not been loaded")); // 如果无效,记录错误日志
80 return;
81 }
82
83 carla::rpc::OpendriveGenerationParameters Parameters; // 定义OpendriveGenerationParameters
84 UCarlaGameInstance * GameInstance = UCarlaStatics::GetGameInstance(GetWorld()); // 获取游戏实例
85 if(GameInstance) // 如果游戏实例存在
86 {
87 Parameters = GameInstance->GetOpendriveGenerationParameters(); // 获取OpendriveGenerationParameters
88 }
89 else
90 {
91 carla::log_warning("Missing game instance"); // 如果游戏实例不存在,记录警告日志
92 }
93
94 auto& CarlaMap = UCarlaStatics::GetGameMode(GetWorld())->GetMap(); // 获取Carla地图
95 const auto Meshes = CarlaMap->GenerateChunkedMesh(Parameters); // 生成网格
96 for (const auto &Mesh : Meshes) // 遍历每个网格
97 {
98 if (!Mesh->GetVertices().size()) // 如果网格顶点数为0,跳过
99 {
100 continue;
101 }
102 AProceduralMeshActor* TempActor = GetWorld()->SpawnActor<AProceduralMeshActor>(); // 生成一个新的ProceduralMeshActor
103 UProceduralMeshComponent *TempPMC = TempActor->MeshComponent; // 获取ProceduralMeshComponent
104 TempPMC->bUseAsyncCooking = true; // 设置异步烘焙
105 TempPMC->bUseComplexAsSimpleCollision = true; // 设置复杂碰撞为简单碰撞
106 TempPMC->SetCollisionEnabled(ECollisionEnabled::QueryAndPhysics); // 设置碰撞模式
107
108 const FProceduralCustomMesh MeshData = *Mesh; // 获取网格数据
109 TempPMC->CreateMeshSection_LinearColor( // 创建网格部分
110 0,
111 MeshData.Vertices,
112 MeshData.Triangles,
113 MeshData.Normals,
114 TArray<FVector2D>(), // UV0
115 TArray<FLinearColor>(), // VertexColor
116 TArray<FProcMeshTangent>(), // Tangents
117 true); // Create collision
118
119 ActorMeshList.Add(TempActor); // 将新生成的Actor添加到列表中
120 }
121
122 if(!Parameters.enable_mesh_visibility) // 如果不启用网格可见性
123 {
124 for(AActor * actor : ActorMeshList) // 遍历Actor列表
125 {
126 actor->SetActorHiddenInGame(true); // 设置Actor在游戏中隐藏
127 }
128 }
129}
130
131// 生成杆子(未实现)
133{
134 if (!IsOpenDriveValid()) // 检查OpenDrive是否有效
135 {
136 UE_LOG(LogCarla, Error, TEXT("The OpenDrive has not been loaded")); // 如果无效,记录错误日志
137 return;
138 }
139 /// TODO: To implement
140}
141
142// 生成生成点
144{
145 if (!IsOpenDriveValid()) // 检查OpenDrive是否有效
146 {
147 UE_LOG(LogCarla, Error, TEXT("The OpenDrive has not been loaded")); // 如果无效,记录错误日志
148 return;
149 }
150 auto& CarlaMap = UCarlaStatics::GetGameMode(GetWorld())->GetMap(); // 获取Carla地图
151 const auto Waypoints = CarlaMap->GenerateWaypointsOnRoadEntries(); // 生成路网上的生成点
152 for (const auto &Wp : Waypoints) // 遍历每个生成点
153 {
154 const FTransform Trans = CarlaMap->ComputeTransform(Wp); // 计算生成点的变换
155 AVehicleSpawnPoint *Spawner = GetWorld()->SpawnActor<AVehicleSpawnPoint>(); // 生成一个新的VehicleSpawnPoint
156 Spawner->SetActorRotation(Trans.GetRotation()); // 设置生成点的旋转
157 Spawner->SetActorLocation(Trans.GetTranslation() + FVector(0.f, 0.f, SpawnersHeight)); // 设置生成点的位置
158 VehicleSpawners.Add(Spawner); // 将新生成的Spawner添加到列表中
159 }
160}
161
162// 生成所有内容
164{
165 GenerateRoadMesh(); // 生成道路网格
166 GenerateSpawnPoints(); // 生成生成点
167 GeneratePoles(); // 生成杆子
168}
169
170// 开始游戏时调用
172{
173 Super::BeginPlay(); // 调用父类的BeginPlay
174
175 const FString XodrContent = UOpenDrive::GetXODR(GetWorld()); // 获取XODR内容
176 LoadOpenDrive(XodrContent); // 加载OpenDrive
177
178 GenerateAll(); // 生成所有内容
179
180 auto World = GetWorld(); // 获取世界
181 check(World != nullptr); // 检查世界是否为空
182
183 // Autogenerate signals
184 AActor* TrafficLightManagerActor = UGameplayStatics::GetActorOfClass(World, ATrafficLightManager::StaticClass()); // 获取TrafficLightManagerActor
185 if(TrafficLightManagerActor == nullptr) // 如果不存在
186 {
187 World->SpawnActor<ATrafficLightManager>(); // 生成一个新的TrafficLightManagerActor
188 }
189}
UE_LOG(LogCarla, Log, TEXT("UActorDispatcher::Destroying actor: '%s' %x"), *Id, Actor)
TSharedPtr< const FActorInfo > carla::rpc::ActorState UWorld * World
const boost::optional< carla::road::Map > & GetMap() const
bool LoadOpenDrive(const FString &OpenDrive)
OpenDRIVEϢΪַɿɲѯӳṹ
TArray< AVehicleSpawnPoint * > VehicleSpawners
const FString & GetOpenDrive() const
ַʽȡOpenDRIVEϢ
AOpenDriveGenerator(const FObjectInitializer &ObjectInitializer)
void GeneratePoles()
OpenDRIVEϢɸ
void GenerateRoadMesh()
OpenDRIVEϢɵ·е
virtual void BeginPlay() override
TArray< AActor * > ActorMeshList
float SpawnersHeight
ȷÿRoutePlannerķø߶
void GenerateSpawnPoints()
ص·ɵ㡣
bool IsOpenDriveValid() const
ǷѼOpenDriveЧԡ
UProceduralMeshComponent * MeshComponent
负责创建和分配交通灯组、控制器和组件的类。
Base class for spawner locations for walkers.
const carla::rpc::OpendriveGenerationParameters & GetOpendriveGenerationParameters() const
static UCarlaGameInstance * GetGameInstance(const UObject *WorldContextObject)
static ACarlaGameModeBase * GetGameMode(const UObject *WorldContextObject)
static FString GetXODR(const UWorld *World)
MapNameOpenDrive XMLҲļ򷵻ؿա
static void log_warning(Args &&... args)
Definition Logging.h:101
A definition of a Carla Mesh.
Seting for map generation from opendrive without additional geometry
声明并初始化成员变量 enable_mesh_visibility,初始值设为 true,意味着默认开启网格可见性相关设置(准确含义参考完整代码 bool enable_mesh_visibility