添加新车

这个教程详细介绍了如何向 Carla 添加新的车辆。教程分为两个部分,一个用于四轮车辆,另一个用于两轮车辆。教程概述了建模车辆时必须满足的基本要求,以确保车辆在 Carla 中运行良好,并提供了在将车辆导入虚幻引擎后所需的配置说明。

重要

本教程仅适用于使用源代码构建并有权访问虚幻引擎编辑器的用户。


添加 4 轮车辆

添加到 Carla 的车辆需要使用可在 此处 找到的通用基础骨架。此链接将下载一个名为 VehicleSkeleton.rar 的文件夹,其中包含两种不同格式的基本框架,一种为 ASCII,另一种为二进制。您使用的格式取决于您的 3D 建模软件要求。

骨架骨骼的位置可以更改,但任何其他操作(例如旋转、添加新骨骼或更改当前层次结构)都会导致错误。


绑定并建模车辆

本节详细介绍了车辆建模阶段的最低要求,以确保其可以在 Carla 中成功使用。该过程包括将骨架正确绑定到车辆的底座和车轮、创建物理资源和光线投射传感器网格,以及导出为正确的格式。

1. 导入基础骨架。

将基础骨架导入您首选的三维建模软件中。常见的编辑器包括 Maya 和 Blender。

2. 绑定骨骼。

根据下面的命名法将骨骼绑定到车辆网格的相应部分。确保轮子的骨骼在网格内居中。

  • 左前轮: Wheel_Front_Left
  • 右前轮: Wheel_Front_Right
  • 左后轮: Wheel_Rear_Left
  • 右后轮: Wheel_Rear_Right
  • 网格的其余部分: VehicleBase

警告

不要对骨骼名称或层次结构进行任何更改,也不要添加任何新骨骼。

3. 为您的车辆建模。

车辆应拥有大约 50,000 - 100,000 个 tris。我们使用实际汽车的尺寸和比例来建模车辆。

我们建议您将车辆分为以下材质:

  1. Bodywork: 车辆的金属部分。该材质已更改为虚幻引擎材质。可以添加徽标和细节,但为了可见,必须使用虚幻引擎编辑器中的 Alpha 通道将它们绘制为不同的颜色。
  2. Glass_Ext: 一层玻璃,可以从车辆外部看到内部。
  3. Glass_Int: 一层玻璃,允许从车辆内部到外部的可见性。
  4. Lights: 头灯、指示灯等。
  5. LightGlass_Ext: 一层玻璃,允许从外部到内部的灯光可见性。
  6. LightGlass_Int: 一层玻璃,允许从内部到外部看到光。
  7. LicensePlate: 29x12 厘米的矩形平面。您可以使用 Carla 提供的 .fbx 以获得最佳结果,请在 此处 下载。纹理将在虚幻引擎中自动分配。
  8. Interior: 任何其他不适合上述部分的细节都可以进入 内饰.

材料(Material)应使用格式 M_CarPart_CarName 命名,例如 M_Bodywork_Mustang

纹理(Textures)应使用格式 T_CarPart_CarName命名,例如 T_Bodywork_Mustang。纹理的大小应为 2048x2048。

虚幻引擎会自动创建(Level of Details, LOD),但您也可以在 3D 编辑器中手动创建它们。Tri 计数如下:

  • LOD 0: 100,000 tris
  • LOD 1: 80,000 tris
  • LOD 2: 60,000 tris
  • LOD 3: 30,000 tris

4. 创建物理资源网格。

物理资源网格是一个附加网格,允许虚幻引擎计算车辆的物理特性。它应该尽可能简单,减少多边形数量,并且应该覆盖除车轮之外的整个车辆。请参阅下图的示例。

physical asset mesh

物理资源网格应导出为单独的.fbx文件。最终文件应满足以下要求:

  • 有一个基础网格。这应该是物理资源网格的副本。它应该与原始车辆具有相同的名称。
  • 物理资源网格体必须使用格式 UCX_<vehicle_name>_<number_of_mesh>命名, 否则虚幻引擎将无法识别。
  • 网格不得超出原始模型的边界。
  • 网格应与原始模型具有相同的位置。

base mesh

将最终 .fbx 网格导出为名为 SMC_<vehicle_name>.fbx的文件。

5. 为光线投射传感器创建网格。

光线投射传感器网格设置将由光线投射传感器(RADAR、LiDAR 和 Semantic LiDAR)检测到的车辆形状。该网格应该具有比物理资产网格稍微更明确的几何形状,以提高传感器仿真的真实感,但出于性能原因,不如汽车网格那么详细。

创建光线投射传感器网格时请考虑以下几点:

  • 网格应覆盖车辆的各个方面,包括车轮、后视镜和格栅。
  • 轮子应为不超过 16 圈的圆柱体。
  • 如果需要,可以将各种网格连接在一起。
  • 网格不得超出原始模型的边界。
  • 网格应该与原始网格具有相同的位置。

collision mesh

将最终网格导出名为 SM_sc_<vehicle_name>.fbx.fbx 文件。

5. 导出车辆网格。

选择所有主要车辆网格和骨架底座并导出为.fbx


导入并配置车辆

本节详细介绍了将车辆导入虚幻引擎以在 Carla 中使用的过程。在虚幻引擎编辑器中执行这些步骤。

1. 创建车辆文件夹。

Content/Carla/Static/Vehicles/4Wheeled 里创建一个名为 <vehicle_name> 的新文件夹。

2. 导入 .fbx

在新的车辆文件夹中,通过在Content Browser中右键单击并选择 导入到 Game/Carla/Static/Vehicles/4Wheeled/<vehicle_name> 来导入主车辆骨架.fbx

在弹出的对话框中:

  • 将导入内容类型 Import Content Type 设置为Geometry and Skinning Weights
  • Normal Import Method 设置为 Import Normals
  • (可选)将Material Import Method设置为Do not create materials。取消选中Import Textures以避免虚幻引擎创建默认材质。

骨架网格体将与两个新文件<vehicle_name>_PhysicsAssets and <vehicle_name>_Skeleton一起出现。

将其余.fbx文件与主车辆骨架.fbx文件分开导入。

3. 设置物理资源网格。

  1. 从内容浏览器Content Browser <vehicle_name>_PhysicsAssets
  2. Skeleton Tree面板中右键单击 Vehicle_Base 的网格体,然后转到Copy Collision from StaticMesh
  3. 搜索并选择您的SMC_<vehicle_name>文件。您应该会看到物理资源网格的轮廓出现在视口中。
  4. Vehicle_Base 中删除默认的胶囊形状。
  5. 选择所有轮子:
    • 转到Tools面板并将“基元类型Primitive Type”更改为Sphere
    • 转到详细信息Details面板并将物理类型Physics Type更改为Kinematic
    • 将线性阻尼Linear Damping设置为0。这将消除车轮上的任何额外摩擦。
  6. 为所有网格启用Simulation Generates Hit Event
  7. 单击Re-generate Bodies
  8. 将车轮球体调整至车轮尺寸。
  9. 保存并关闭窗口。

Collision mesh

4. 创建动画蓝图。

  1. 在内容浏览器Content Browser中,右键单击车辆文件夹并选择Animation -> Animation Blueprint
  2. 在父类Parent Class中搜索并选择VehicleAnimInstance
  3. 在目标骨架Target Skeleton中搜索并选择<vehicle_name>_Skeleton
  4. OK并将蓝图重命名为AnimBP_<vehicle_name>

5. 配置动画蓝图。

为了简化配置动画蓝图的过程,我们将从本地 Carla 车辆复制现有的动画蓝图:

  1. 转到Content/Carla/Static/Vehicle并选择任何 Carla 车辆文件夹。打开其动画蓝图。
  2. My Blueprint面板中,双击AnimGraph。您将看到图表出现在视口中。
  3. 单击并拖动以选择Mesh Space Ref PoseWheel HandlerComponent To Local组件。右键单击并选择复制。
  4. 返回您自己的车辆动画蓝图并将复制的内容粘贴到图形区域中。
  5. 单击Component To Local组件中的站立人物并将其拖动到Output Pose中的人物,以将组件连接在一起。
  6. 单击左上角的Compile。您现在应该看到一条脉动的线流过整个序列。
  7. 保存并关闭窗口。

add_vehicle_step_04

6. 准备车辆和车轮蓝图。

  1. 在内容浏览器Content Browser中,转到Content/Carla/Blueprints/Vehicles并创建一个新文件夹<vehicle_name>
  2. 在该文件夹内,右键单击并转到Blueprint Class。在弹出窗口中打开All Classes部分。
  3. 搜索BaseVehiclePawn并按Select
  4. 将文件重命名为BP_<vehicle_name>
  5. 转到 Carla/Blueprints/Vehicles 中任何本地 Carla 车辆的文件夹。从内容浏览器Content Browser中,将四轮蓝图复制到您自己车辆的蓝图文件夹中。重命名文件以将旧车辆名称替换为您自己的车辆名称。

Copy wheel blueprints

7. 配置轮子蓝图。

  1. 在车辆蓝图文件夹中,打开所有四个车轮蓝图。
  2. Class Defaults面板中,将 Collision Mesh 设置为 Wheel_Shape省略此步骤将导致车辆车轮陷入地面
  3. 根据您的车辆规格调整车轮形状半径、宽度、质量和阻尼率的值。
  4. 将轮胎配置Tire Config设置为CommonTireConfig
  5. 在前轮上根据您的喜好设置转向角度 Steer Angle(默认为70)。取消选中Affected by Handbrake
  6. 在后轮上将转向角度 Steer Angle 设置为 0。检查 Affected by Handbrake
  7. 设置悬架值时,您可以使用 此处 的值作为指导。
  8. 编译并保存。

wheel shape

8. 配置车辆蓝图。

  1. 从内容浏览器 Content Browser 中,打开您的BP_<vehicle_name>
  2. Components 面板中,选择 Mesh (VehicleMesh) (Inherited)
  3. Details 面板中,转到 Skeletal Mesh 并搜索并选择车辆的基础骨架文件(位于 Carla/Static/Vehicles/4Wheeled/<vehicle_name> 文件夹中)。
  4. 转到 Details 面板中的 Anim Class。搜索并选择您的 AnimBP_<vehicle_name> 文件。
  5. Components 面板中,选择 Custom Collision (Inherited)
  6. Details 面板中选择 Static Mesh 并搜索您的 SM_sc_<vehicle_name> 光线投射传感器网格体。
  7. Components 面板中,选择 VehicleMovement (MovementComp) (Inherited)
  8. Details 面板中,搜索 wheel 。您将找到每个轮子的设置。对于每一个,单击 Wheel Class 并搜索与正确车轮位置相对应的BP_<vehicle_name>_<wheel_name>文件。

wheel blueprint

如果您的车辆有任何与基础网格分开的附加网格(门、灯等):

  1. 将它们拖到Components面板中的 Mesh (VehicleMesh) (Inherited) 层次结构中。
  2. 选择层次结构中的额外网格并在Details面板中搜索 Collision
  3. 将碰撞预设 Collision Presets 设置为 NoCollision
  4. 选择层次结构中的任何灯光网格。在 Details 面板中搜索 Tag 并添加标签 emissive

单击 SaveCompile

9. 将车辆添加到蓝图库中。.

  1. Content/Carla/Blueprint/Vehicle 中,打开 VehicleFactory 文件。
  2. Generate Definitions 选项卡中,双击 Vehicles
  3. Details 面板中,展开 Default Value 部分并向车辆数组添加一个新元素。
  4. 填写您车辆的 MakeModel
  5. 使用您的 BP_<vehicle_name> 文件填写 Class 值。
  6. (可选)为车辆提供一组推荐颜色。
  7. 编译并保存。

vehicle factory

10. 测试车辆

启动 Carla,打开终端 PythonAPI/examples 并运行以下命令:

python3 manual_control.py --filter <model_name> # The make or model defined in step 9

笔记

即使您在品牌和型号中使用了大写字符,它们在传递给过滤器时也需要转换为小写字符。


添加 N 轮车辆

添加 N 轮车辆遵循与上述 4 轮车辆相同的导入管道,但有几个步骤不同。

5. 配置 N 轮车辆的动画蓝图

搜索 BaseVehiclePawnNW 并按 Select

n_wheel_base

6. 准备车辆和车轮蓝图

转到 Carla/Blueprints/Vehicles 中所有本地 Carla 车辆的文件夹。从内容浏览器中,将四轮蓝图复制到您自己车辆的蓝图文件夹中。重命名文件以将旧车辆名称替换为您自己的车辆名称。

复制四个轮子,然后再次复制其他轮子。如果是 6 轮车辆,您将需要 6 个不同的车轮:FLW、FRW、MLW、MRW、RLW、RRW。

n_wheel_bps

7. 配置轮子蓝图

对于 4 轮车辆,请遵循上述第 7 节。 N 轮车辆的主要区别在于手刹和转向参数的影响。在某些车辆(例如长轴距卡车)中,前 2 对车轮将进行转向,其中一组可能比其他车轮转向更多。最后面的一对可能会受到手刹的影响,具体情况取决于您正在建模的车辆。

8. 配置车辆蓝图

在“详细信息”面板中,搜索wheel。您将找到每个轮子的设置。对于每一个,单击车轮类别并搜索 BP__ 对应于正确车轮位置的文件。

这是正确的,但只是为了指定,在 N 轮车辆的情况下,您需要设置所有车轮。这是 6 轮车辆的示例:

n_wheel_config

最后,一个额外的考虑因素是设置差速器。对于 4 轮车辆,我们有不同的差速器预设(限滑、开放 4W 等),但对于 N 轮车辆,您需要选择要在哪些车轮上应用扭矩。本例中我们选择只有中后轮有扭矩,前轮没有扭矩,您可以指定其他配置。这些数字将与本文上方的图像相同(例如,0 将是左前轮,如上所述)。

n_wheel_mech

所有其他参数,如发动机、变速箱、转向曲线,均与四轮车辆相同。


添加 2 轮车辆

添加 2 轮车辆与添加 4 轮车辆类似,但由于动画的复杂性,您需要设置额外的骨骼来引导驾驶员的动画。 是两轮车辆参考骨架的链接。

与 4 轮车辆一样,将模型朝向正“x”,每个骨骼轴朝向正 x,z 轴朝上。

Bone Setup:
  - Bike_Rig:                   # 网格的原点。将其放置在场景的0点
    - BikeBody:                 # 模型身体的中心。
      - Pedals:                 # 如果车辆是自行车,将脚踏板绑在这块骨头上,就会随着自行车的加速度而旋转。
        - RightPedal:           # 如果车辆是自行车,则设置驾驶员的脚部位置并与脚踏板一起旋转。
        - LeftPedal:            # ^
      - RearWheel:              # 车辆后轮
      - Handler:                # 与车辆的前轮一起旋转,将车辆操纵器固定在其上。
        - HandlerMidBone:       # 定位在前轮骨架上,以确定操纵器与车轮的方向
        - HandlerRight:         # 设置驾驶员的手的位置,无需将其绑定到任何东西。
        - HandlerLeft:          # ^
      - Frontwheel:             # 车辆的前轮。
      - RightHelperRotator:     # 这四块额外的骨头是为一个过时的系统提供的,该系统通过使用传统的隐形车轮使自行车稳定 
        - RightHelprWheel:      # ^
      - LeftHelperRotator:      # ^
        - LeftHelperWheel:      # ^
      - Seat:                   # 设置驾驶员髋骨的位置。无需将其绑在任何东西上,只需小心放置即可。

1. 将 fbx 作为 Skelletal Mesh 导入到其自己的 Content/Carla/Static/Vehicles/2Wheeled 文件夹中。导入时,选择“General2WheeledVehicleSkeleton”作为骨架,应自动创建并链接物理资源。

2. 调整物理资源。删除自动创建的框并向 BikeBody 骨骼添加框,尝试尽可能匹配形状,确保启用生成命中事件。为每个轮子添加一个球体并将其“物理类型”设置为“运动学”。

3. 创建 Content/Blueprints/Vehicles/<vehicle-model> 文件夹

4. 在该文件夹内创建两个派生自“VehicleWheel”类的蓝图类。调用 <vehicle-model>_FrontWheel<vehicle-model>_RearWheel。将其 "Shape Radius" 设置为与网格轮半径完全匹配(小心,半径不是直径)。将其“轮胎配置”设置为“CommonTireConfig”。在前轮上取消选中“受手刹影响”,在后轮上将“转向角”设置为零。

5. 在同一文件夹内创建一个派生 Base2WheeledVehicle 的蓝图类,并调用它 <vehicle-model> 。打开它进行编辑,选择组件“Mesh”,将“Skeletal Mesh”和“Anim Class”设置为相应的。然后选择 VehicleBounds 组件并设置大小以覆盖车辆区域(如上图所示)。

6. 选择组件“VehicleMovement”,在“Vehicle Setup”下展开“Wheel Setups”,设置各个车轮。

  • 0: 轮类=<vehicle-model>_FrontWheel, 骨骼名称=FrontWheel
  • 1: 轮类=<vehicle-model>_FrontWheel, 骨骼名称=FrontWheel
  • 2: 轮类=<vehicle-model>_RearWheel, 骨骼名称=RearWheel
  • 3: 轮类=<vehicle-model>_RearWheel, 骨骼名称=RearWheel
    (您会注意到,我们基本上在每个骨骼中放置了两个轮子。unreal 提供的车辆类别不支持车轮编号不同于 4 的车辆,因此我们必须让它相信车辆具有4个轮子)

7. 选择变量 "is bike" ,如果您的型号是自行车,则勾选它。这将激活踏板旋转。如果您要安装摩托车,请不要标记。

8. 找到变量 back Rotation 并将其设置为更合适的位置,更好地选择组件 SkeletalMesh(驱动程序)并将其沿 x 轴移动,直到其位于座椅位置。

9. 测试一下,进入CarlaGameMode蓝图并将“Default Pawn Class”更改为新创建的自行车蓝图。