当前位置: 首页 > news >正文

虚幻引擎5-Unreal Engine笔记之摄像头camera

虚幻引擎5-Unreal Engine笔记之摄像头camera

在这里插入图片描述

code review!

目录

  1. 第一部分:摄像头的基础概念
    • 1.1 UE5 中摄像头的定义与作用
    • 1.2 UE5 中摄像头的类型与分类
  2. 第二部分:摄像头的代码结构与分类
    • 2.1 摄像头是类还是组件?
    • 2.2 组件的本质:组件也是类
    • 2.3 组件与类的生命周期与实例化
    • 2.4 摄像头类与组件的选择场景
  3. 第三部分:摄像头的进阶组件与功能
    • 3.1 弹簧臂(Spring Arm Component)
    • 3.2 Actor 与 Camera 的相对位姿运动
    • 3.3 输入映射:操作映射与轴映射控制的是 Camera 还是 Actor?
    • 3.4 增强输入系统(Enhanced Input System)
  4. 第四部分:摄像头的实用插件与扩展
    • 4.1 摄像机相关插件概述
    • 4.2 如何获取和使用插件
    • 4.3 自定义摄像机插件开发
  5. 第五部分:摄像头的操作与应用
    • 5.1 添加和设置 Cine Camera Actor
    • 5.2 使用 Sequencer 制作摄像头动画
    • 5.3 游戏中的动态摄像头控制
    • 5.4 景深与后处理效果
  6. 第六部分:常见问题与调试技巧
    • 6.1 摄像头视角问题
    • 6.2 Sequencer 动画不生效
    • 6.3 景深效果不明显
    • 6.4 弹簧臂碰撞问题
    • 6.5 输入映射无效
    • 6.6 组件未正确附加或初始化
  7. 第七部分:总结与学习建议
    • 7.1 摄像头类型选择建议
    • 7.2 学习路径建议
    • 7.3 资源与社区

第一部分:摄像头的基础概念

1.1 UE5 中摄像头的定义与作用

  • 定义:在 UE5 中,摄像头是一个用于定义视角和渲染画面的工具,可以模拟真实世界中的摄像机效果,用于游戏视角控制、过场动画或电影化渲染。
  • 作用
    • 控制玩家或观众的视角(例如第一人称、第三人称)。
    • 制作电影化镜头效果(如景深、变焦)。
    • 在关卡中捕获特定画面或动画。

1.2 UE5 中摄像头的类型与分类

UE5 提供了多种摄像头实现方式,根据用途和功能可以分为以下几类:

类型描述主要用途
Cine Camera Actor独立的 Actor 类,专为电影化内容设计过场动画制作,高级参数控制
Camera Component组件,可附加到任何 Actor 上游戏中动态视角控制
Camera Actor基础 Actor 类,包含 Camera Component简单摄像头需求或测试用途
Player Camera Manager用于管理玩家视角切换和行为游戏逻辑中的视角管理

建议:初学者可以从 Cine Camera Actor 开始学习,因为其功能全面且与 Sequencer(序列编辑器)结合紧密,适合电影化内容制作。

第二部分:摄像头的代码结构与分类

2.1 摄像头是类还是组件?

在 UE5 中,摄像头既可以是类,也可以是组件,具体取决于上下文和使用方式。以下是详细分类与解释:

2.1.1 组件形式:Camera Component (UCameraComponent)
  • 定义UCameraComponent 是 UE5 中一个独立的组件(Component),可以附加到任何 AActor(如角色、Pawn 或其他对象)上,用于定义视角和渲染内容。
  • 用途:通常用于游戏中控制玩家的视角(例如第一人称或第三人称视角)。它提供基本的摄像头功能,如位置、旋转、视野(Field of View, FOV)等。
  • 使用方式
    • 在编辑器中,通过蓝图或代码将 Camera Component 添加到一个 Actor 上。
    • 例如,在一个 Character 类中添加 Camera Component,并通过蓝图或 C++ 代码控制其行为。
    • 可以通过 SetActiveCameraPlayerControllerSetViewTarget 将其设置为当前活动的视角。
  • 代码示例(C++)
    UCameraComponent* Camera = CreateDefaultSubobject<UCameraComponent>(TEXT("PlayerCamera"));
    Camera->SetupAttachment(RootComponent);
    Camera->SetRelativeLocation(FVector(0.0f, 0.0f, 50.0f));
    
  • 特点
    • 轻量级,功能基础,适合实时交互。
    • 必须依附于 Actor,无法独立存在。
2.1.2 组件形式:Cine Camera Component (UCineCameraComponent)
  • 定义UCineCameraComponentUCameraComponent 的子类,专为电影化效果设计,提供了更多高级参数。
  • 用途:用于精确控制镜头效果(如焦距、光圈)。
  • 特点:功能丰富,适合静态镜头和动画制作。
2.1.3 类形式:Camera Actor (ACameraActor)
  • 定义ACameraActor 是一个独立的 Actor 类,继承自 AActor。它是一个可以在关卡中放置的对象,用于定义一个摄像头的视角。
  • 本质ACameraActor 内部包含一个 UCameraComponent 作为其核心组件,负责处理摄像头的视角、视野(FOV)等功能。
  • 用途:用于在关卡中放置一个简单的摄像头,适合测试或基础视角需求。
  • 特点:可以直接拖入关卡,作为独立对象存在。
  • 类还是组件
    • 当你在 Place Actors 面板中看到 Camera Actor 并将其拖入关卡时,你实际上是在实例化一个 ACameraActor 类。这是一个完整的 Actor 对象,因此它是一个“类”的实例。
    • 虽然 ACameraActor 依赖于 UCameraComponent(一个组件)来实现摄像头功能,但你在编辑器中操作的是 ACameraActor 这个 Actor 类,而不是直接操作组件。
  • 为什么是类
    • 在 UE5 编辑器中,Place Actors 面板列出的是可以直接放置到关卡中的对象,这些对象通常是 AActor 的子类(如 ACameraActor)。
    • 组件(例如 UCameraComponent)不能直接放置到关卡中,必须附加到一个 Actor 上。因此,你拖入关卡的 Camera Actor 是类(ACameraActor)的实例,而不是组件。
  • 代码示例(C++)
    ACameraActor* CameraActor = GetWorld()->SpawnActor<ACameraActor>(FVector::ZeroVector, FRotator::ZeroRotator);
    
2.1.4 类形式:Cine Camera Actor (ACineCameraActor)
  • 定义ACineCameraActor 是一个独立的 Actor 类,内部包含一个 UCineCameraComponent
  • 用途:专门用于电影化内容制作,常与 Sequencer 结合。
  • 特点:提供高级电影镜头控制,适合过场动画。
  • 代码示例(C++)
    ACineCameraActor* CineCamera = GetWorld()->SpawnActor<ACineCameraActor>(FVector::ZeroVector, FRotator::ZeroRotator);
    
2.1.5 总结:类与组件的区别
类型是否独立存在主要特点典型用途
组件(如 UCameraComponent)否,依附于 Actor模块化,动态控制,需附加到 Actor游戏中动态视角(如玩家角色)
类(如 ACameraActor)是,独立 Actor可直接放置于关卡,独立存在电影化内容,测试或静态镜头

2.2 组件的本质:组件也是类

在 UE5 中,组件和 Actor 一样,都是以类的形式存在于代码层面。以下是对组件本质的详细解析:

2.2.1 组件的定义
  • 在 UE5 中,组件是附加到 AActor(或其子类)上的模块化功能单元,用于扩展 Actor 的行为或属性。例如,UCameraComponent 是一个组件类,负责处理摄像头的功能。
  • 组件本身并不是独立的实体,不能直接放置在关卡中,而是必须依附于一个 Actor。
2.2.2 组件是类
  • 组件在代码层面是一个类,属于 UE5 的反射系统(Reflection System),通常以 U 开头(表示 Unreal Object,例如 UActorComponentUCameraComponent)。
  • 这些类定义了组件的属性和行为,可以通过 C++ 或蓝图进行实例化和操作。
  • 例如,UCameraComponent 是一个继承自 USceneComponent 的类,而 USceneComponent 又继承自 UActorComponent。它们都是类,定义了组件的具体功能。
2.2.3 类与实例的关系
  • 在 UE5 中,类(如 UCameraComponent)是代码中的定义,而当你将一个组件添加到 Actor 上时(通过编辑器或代码),你实际上是创建了该类的一个实例。
  • 例如,在蓝图编辑器中添加一个 Camera Component 到角色上时,UE5 会实例化一个 UCameraComponent 类的对象,并将其附加到该 Actor 上。
2.2.4 组件与 Actor 的关系
  • Actor(如 ACameraActor)是一个独立的类,可以直接放置在关卡中,本身也是一个类(继承自 AActor)。
  • 组件(如 UCameraComponent)是依附于 Actor 的类,无法独立存在。Actor 可以拥有多个组件,每个组件提供不同的功能。
  • 例如,ACameraActor 是一个 Actor 类,内部默认包含一个 UCameraComponent 实例,负责摄像头功能。
2.2.5 代码示例
  • 定义一个自定义组件类(C++)
    class UMyCustomComponent : public UActorComponent
    {GENERATED_BODY()
    public:UMyCustomComponent();virtual void BeginPlay() override;
    };
    
  • 在 Actor 中创建并附加组件实例
    UMyCustomComponent* CustomComponent = CreateDefaultSubobject<UMyCustomComponent>(TEXT("CustomComponent"));
    
2.2.6 蓝图中的组件
  • 在蓝图编辑器中,组件也是以类的形式存在的。你可以通过 Add Component 按钮选择一个组件类(例如 Camera Component),然后 UE5 会为你的 Actor 创建该类的一个实例。
  • 蓝图中的组件类同样可以被继承和扩展,创建自定义的组件蓝图类。
2.2.7 总结
  • 在 UE5 中,组件是一个类,通常继承自 UActorComponent 或其子类(如 USceneComponent)。
  • 组件类定义了功能和行为,而在实际使用时,UE5 会创建这些类的实例并附加到 Actor 上。
  • 因此,无论是 Actor(如 ACameraActor)还是组件(如 UCameraComponent),在 UE5 中都是以类的形式存在,只是它们的用途和生命周期不同。

2.3 组件与类的生命周期与实例化

  • Actor 的实例化
    • Actor(如 ACameraActor)可以在关卡中直接实例化(通过 Place Actors 面板或代码中的 SpawnActor 方法)。
    • 实例化后,Actor 作为一个独立对象存在于关卡中,拥有自己的生命周期(如 BeginPlayTickEndPlay)。
  • 组件的实例化
    • 组件(如 UCameraComponent)只能通过附加到 Actor 上进行实例化(通过 CreateDefaultSubobject 或蓝图的 Add Component)。
    • 组件的生命周期依附于其所属的 Actor,当 Actor 被销毁时,组件也会被销毁。
  • 代码示例(Actor 与组件的生命周期)
    void AMyActor::BeginPlay()
    {Super::BeginPlay();// 组件初始化逻辑UCameraComponent* Camera = FindComponentByClass<UCameraComponent>();if (Camera){Camera->SetFieldOfView(90.0f); // 在 Actor 初始化时修改组件属性}
    }
    

2.4 摄像头类与组件的选择场景

场景推荐类型原因
关卡中独立摄像头对象ACameraActor / ACineCameraActor可直接放置,适合电影化或静态镜头
附加到角色或 PawnUCameraComponent模块化设计,适合动态视角控制
混合使用(动画+游戏逻辑)两者结合满足复杂需求,如过场动画与玩家视角

第三部分:摄像头的进阶组件与功能

3.1 弹簧臂(Spring Arm Component)

  • 定义USpringArmComponent 是一种特殊的组件,用于在角色和摄像头之间创建一个“弹簧臂”,可以平滑地控制摄像头与角色的距离和角度,广泛用于第三人称视角游戏。
  • 作用
    • 自动处理摄像头与角色之间的碰撞,避免摄像头穿墙。
    • 提供平滑的跟随效果,增强游戏体验。
  • 使用步骤
    1. 在蓝图或代码中,将 Spring Arm Component 附加到角色 Actor 上。
    2. Camera Component 附加到 Spring Arm Component 上,作为其子组件。
    3. Spring Arm Component 的属性中调整参数:
      • Target Arm Length:设置弹簧臂的长度(摄像头与角色的距离)。
      • Enable Camera Lag:启用摄像头延迟,产生平滑跟随效果。
      • Do Collision Test:启用碰撞检测,避免摄像头穿过物体。
  • 代码示例(C++)
    USpringArmComponent* SpringArm = CreateDefaultSubobject<USpringArmComponent>(TEXT("SpringArm"));
    SpringArm->SetupAttachment(RootComponent);
    SpringArm->TargetArmLength = 300.0f; // 摄像头距离角色300单位
    SpringArm->bEnableCameraLag = true; // 启用平滑跟随
    SpringArm->bDoCollisionTest = true; // 启用碰撞检测UCameraComponent* Camera = CreateDefaultSubobject<UCameraComponent>(TEXT("Camera"));
    Camera->SetupAttachment(SpringArm); // 摄像头附加到弹簧臂
    
  • 应用场景:常用于第三人称射击游戏或动作游戏,确保摄像头跟随角色时既平滑又不被障碍物遮挡。

3.2 Actor 与 Camera 的相对位姿运动

  • 定义:在 UE5 中,摄像头可以相对于 Actor 进行相对位姿(位置和旋转)运动,这种关系通常通过组件的层级结构或代码逻辑实现。
  • 实现方式
    1. 通过组件层级:将 Camera Component 附加到 Actor 或其他组件(如 Spring Arm Component)上,摄像头会随父组件移动。
      • 例如,摄像头附加到角色头部时,会随角色移动而移动。
    2. 通过代码动态调整:在游戏运行时,通过蓝图或 C++ 动态修改摄像头的相对位置和旋转。
      • 例如,切换第一人称和第三人称视角时调整摄像头位置。
  • 代码示例(动态调整相对位置)
    void AMyCharacter::SwitchCameraView()
    {if (bIsFirstPerson){CameraComponent->SetRelativeLocation(FVector(0.0f, 0.0f, 50.0f)); // 第一人称视角}else{CameraComponent->SetRelativeLocation(FVector(-300.0f, 0.0f, 100.0f)); // 第三人称视角}bIsFirstPerson = !bIsFirstPerson;
    }
    
  • 注意事项
    • 确保摄像头的 Mobility 设置为 Movable,以便动态调整。
    • 使用 Spring Arm Component 时,相对位姿由弹簧臂参数控制,无需手动计算。
  • 应用场景:实现视角切换、动态镜头效果(如角色受伤时镜头抖动)。

3.3 输入映射:操作映射与轴映射控制的是 Camera 还是 Actor?

  • 定义:在 UE5 中,输入映射(Input Mapping)分为操作映射(Action Mapping)和轴映射(Axis Mapping),用于处理玩家的输入(如按键或鼠标移动)。输入映射是 UE5 输入系统的核心机制,允许开发者自定义玩家如何与游戏交互。
  • 控制对象
    • 操作映射(Action Mapping):通常用于触发离散事件(如跳跃、开火),一般直接作用于 Actor(如角色跳跃)。
    • 轴映射(Axis Mapping):通常用于连续输入(如鼠标移动、摇杆控制),可以控制 Actor 或 Camera,具体取决于设计逻辑。
      • 控制 Camera:例如,鼠标移动控制摄像头旋转(如第一人称射击游戏中的视角旋转)。
      • 控制 Actor:例如,摇杆控制角色移动方向。
  • 输入映射的设置
    • 输入映射在 Project Settings > Input 中配置,开发者可以定义多个输入绑定,并为每个输入分配不同的键或设备(如键盘、鼠标、游戏手柄)。
    • 每个映射可以设置修饰键(如 Shift、Ctrl)以实现组合输入,或者设置触发条件(如按下、释放)。
  • 实现方式
    1. Project Settings > Input 中设置输入映射。
      • 添加轴映射(如 MouseXMouseY)用于控制摄像头旋转。
      • 添加操作映射(如 Jump)用于控制角色行为。
    2. 在角色蓝图或 C++ 中绑定输入逻辑。
  • 代码示例(C++ 中控制摄像头旋转)
    void AMyCharacter::SetupPlayerInputComponent(UInputComponent* PlayerInputComponent)
    {Super::SetupPlayerInputComponent(PlayerInputComponent);PlayerInputComponent->BindAxis("MouseX", this, &AMyCharacter::AddYawInput);PlayerInputComponent->BindAxis("MouseY", this, &AMyCharacter::AddPitchInput);PlayerInputComponent->BindAction("Jump", IE_Pressed, this, &AMyCharacter::Jump);
    }void AMyCharacter::AddYawInput(float Value)
    {AddControllerYawInput(Value); // 控制摄像头水平旋转
    }void AMyCharacter::AddPitchInput(float Value)
    {AddControllerPitchInput(Value); // 控制摄像头垂直旋转
    }
    
  • 输入映射的高级配置
    • 输入优先级:可以通过设置输入绑定的优先级来处理多个输入冲突的情况。例如,某些操作映射可以覆盖轴映射,确保关键动作(如暂停游戏)优先执行。
    • 输入上下文:可以通过切换输入上下文来实现不同游戏模式下的输入差异。例如,在驾驶模式和步行模式下,同一按键可以绑定到不同的行为。
    • 输入设备支持:UE5 支持多种输入设备(如键盘、鼠标、游戏手柄、触摸屏),开发者可以在输入映射中为每种设备定义不同的绑定,增强跨平台兼容性。
  • 调试输入映射
    • 使用 ShowDebug Input 命令可以在游戏中查看当前的输入状态,确认输入是否被正确识别。
    • 在 C++ 中使用 UE_LOG 或蓝图中的 Print String 节点输出输入值,检查逻辑是否按预期执行。
  • 总结
    • 轴映射(如鼠标移动)通常控制摄像头旋转,因为玩家视角由摄像头决定。
    • 操作映射和部分轴映射(如 WASD 移动)通常控制 Actor,因为角色移动是游戏逻辑的核心。
    • 具体设计取决于游戏类型和需求,可以通过 Player ControllerPawn 灵活切换控制目标。
    • 输入映射提供了高度自定义的灵活性,开发者可以根据项目需求设计复杂的交互逻辑。
输入类型典型控制对象常见用途示例
操作映射 (Action Mapping)Actor离散事件触发跳跃、开火、交互
轴映射 (Axis Mapping)Camera / Actor连续输入控制鼠标旋转视角、摇杆移动角色

3.4 增强输入系统(Enhanced Input System)

  • 定义:增强输入系统(Enhanced Input System)是 UE5 引入的一种新型输入处理框架,相较于传统输入映射系统,它提供了更模块化、更灵活的输入处理方式,特别适合处理复杂的输入需求和跨平台开发。
  • 主要特点
    • 输入上下文(Input Mapping Context):允许开发者为不同的游戏状态或角色模式定义不同的输入映射集合。例如,步行模式和驾驶模式可以有独立的输入上下文,互不干扰。
    • 输入修饰符(Input Modifiers):支持对输入值进行预处理(如反转轴向、应用死区、缩放输入值),可以在输入到达游戏逻辑前进行调整。
    • 输入触发器(Input Triggers):支持定义复杂的触发条件(如按住一段时间后触发、双击触发),比传统输入映射的简单按下/释放更灵活。
    • 模块化设计:增强输入系统基于组件(如 UEnhancedInputComponent)构建,允许更细粒度的输入绑定控制。
  • 与摄像头控制的关系
    • 增强输入系统可以更精确地控制摄像头的行为。例如,通过输入修饰符调整鼠标灵敏度,或者通过输入触发器实现特定视角切换(如双击鼠标右键切换第一/第三人称视角)。
    • 支持多设备输入(如触摸屏滑动控制摄像头旋转),适合移动平台或混合输入设备项目。
  • 启用与设置
    1. Project Settings > Plugins 中启用 Enhanced Input 插件。
    2. Project Settings > Input 中创建 Input Mapping Context(IMC),并定义输入动作(Input Actions)和绑定。
    3. 在角色或控制器中添加 Enhanced Input Local Player Subsystem,并应用相应的输入上下文。
  • 代码示例(C++ 中使用增强输入系统控制摄像头)
    void AMyCharacter::SetupPlayerInputComponent(UInputComponent* PlayerInputComponent)
    {Super::SetupPlayerInputComponent(PlayerInputComponent);// 获取增强输入组件if (UEnhancedInputComponent* EnhancedInputComponent = Cast<UEnhancedInputComponent>(PlayerInputComponent)){// 绑定输入动作EnhancedInputComponent->BindAction(CameraYawAction, ETriggerEvent::Triggered, this, &AMyCharacter::AddYawInput);EnhancedInputComponent->BindAction(CameraPitchAction, ETriggerEvent::Triggered, this, &AMyCharacter::AddPitchInput);}
    }void AMyCharacter::AddYawInput(const FInputActionValue& Value)
    {float YawValue = Value.Get<float>();AddControllerYawInput(YawValue); // 控制摄像头水平旋转
    }void AMyCharacter::AddPitchInput(const FInputActionValue& Value)
    {float PitchValue = Value.Get<float>();AddControllerPitchInput(PitchValue); // 控制摄像头垂直旋转
    }
    
  • 蓝图中的增强输入系统
    • 在蓝图编辑器中,可以通过 Add Mapping Context 节点为玩家控制器或角色应用输入上下文。
    • 使用 Enhanced Input Action 节点绑定输入动作,并在蓝图中实现对应的逻辑(如调整摄像头位置或旋转)。
  • 应用场景
    • 适合需要复杂输入逻辑的游戏项目(如支持多模式、多设备的 AAA 级游戏)。
    • 用于实现精细的摄像头控制效果(如基于输入速度动态调整视角旋转速度)。
  • 与传统输入系统的对比
特性传统输入系统增强输入系统
输入映射方式全局映射,单一上下文多上下文,支持动态切换
输入处理灵活性基本按键绑定,修饰有限支持输入修饰符和复杂触发条件
跨平台支持需手动适配多设备内置多设备支持,易于适配
代码/蓝图集成简单绑定,功能有限模块化组件,高度可定制
  • 注意事项
    • 增强输入系统需要额外的学习成本,初学者可以先掌握传统输入映射,再过渡到增强输入系统。
    • 确保项目中所有相关角色或控制器都使用了增强输入组件,否则可能导致输入不一致。
    • 在切换输入上下文时,注意清理或禁用不必要的映射,避免输入冲突。

第四部分:摄像头的实用插件与扩展

4.1 摄像机相关插件概述

插件名称功能用途
Camera Shake Editor直观编辑摄像头抖动效果模拟爆炸、地震或受伤镜头抖动
Cinematic Camera Rig Rail模拟真实摄像机轨道,沿路径平滑移动电影化镜头或复杂动画
Virtual Camera Plugin通过外部设备实时控制 UE5 摄像头虚拟制片,模拟真实摄像机操作
Third Person Camera System开箱即用的第三人称摄像头系统快速开发第三人称游戏

4.2 如何获取和使用插件

  • 获取方式
    • 打开 UE5 编辑器,进入 Edit > Plugins 查找内置插件。
    • 访问 Epic Games Marketplace 下载免费或付费插件。
  • 使用步骤
    1. 启用插件:勾选插件并重启编辑器。
    2. 配置插件:根据插件文档设置参数或添加相关 Actor。
    3. 集成到项目:将插件功能与现有摄像头系统结合。
  • 注意事项
    • 确保插件与 UE5 版本兼容。
    • 阅读插件文档,了解其功能和限制。

4.3 自定义摄像机插件开发

  • 背景:如果现有插件无法满足需求,开发者可以基于 UE5 的插件系统开发自定义摄像机功能。
  • 步骤
    1. 创建一个新的 UE5 插件(通过 Edit > Plugins > New Plugin)。
    2. 定义自定义组件或 Actor,继承自 UCameraComponent 或其他相关类。
    3. 实现特定功能(如自定义镜头效果或输入控制)。
    4. 打包和分发插件供团队使用。
  • 应用场景:为特定项目开发独特的摄像机行为或效果。

第五部分:摄像头的操作与应用

5.1 添加和设置 Cine Camera Actor

以下是使用 Cine Camera Actor 的基础步骤,适合电影化内容制作。

5.1.1 添加摄像头到场景
  • 打开 UE5 编辑器,在左侧 Place Actors 面板搜索 Cine Camera Actor
  • 拖入关卡中,会出现一个摄像头图标。
5.1.2 调整位置与方向
  • 使用移动和旋转工具调整摄像头的位置和朝向。
  • Details 面板中查看和修改 LocationRotation 参数。
5.1.3 设置摄像头参数
  • Details 面板的 Camera Settings 中:
    • Focal Length(焦距):控制视野范围,小数值视野宽,大数值视野窄。
    • Aperture(光圈):影响景深效果,小数值景深浅(背景模糊)。
    • Focus Settings(对焦设置):设置对焦距离或启用自动对焦。
  • 这些参数模拟真实摄像机效果,适合电影化镜头。
5.1.4 预览摄像头视角
  • 选中摄像头,按 Ctrl + Shift + P 或点击工具栏的 Pilot 按钮进入预览模式。
  • Eject 或再次按快捷键退出预览。

5.2 使用 Sequencer 制作摄像头动画

Sequencer 是 UE5 中用于创建动画和过场动画的工具,与 Cine Camera Actor 结合紧密。

5.2.1 创建 Sequencer
  • 在工具栏点击 Cinematics > Add Level Sequence
  • 命名并保存序列文件。
5.2.2 添加摄像头到 Sequencer
  • 在 Sequencer 窗口点击 + Track,选择 Cine Camera Actor,绑定关卡中的摄像头。
  • 创建一个摄像头轨道,用于记录动画。
5.2.3 设置关键帧
  • 移动时间轴播放头到特定时间点,调整摄像头位置、旋转或参数。
  • 点击 + 或按 S 键添加关键帧,Sequencer 会自动插值生成平滑动画。
5.2.4 播放与优化
  • 点击播放按钮预览动画。
  • 使用曲线编辑器(Curve Editor)调整关键帧细节。

5.3 游戏中的动态摄像头控制

对于游戏项目,可以通过以下方式实现动态摄像头控制。

5.3.1 为角色添加 Camera Component
  • 在蓝图中,选中角色(如 Pawn 或 Character),点击 Add Component,选择 Camera
  • 调整 Camera Component 的位置(例如第三人称视角时放置在角色后方)。
5.3.2 设置玩家视角
  • 在角色蓝图中使用 Set View Target 节点,将玩家视角绑定到 Camera Component。
  • 或者通过 Player Camera Manager 动态切换视角。
5.3.3 使用蓝图控制动画
  • 通过 Timeline 节点控制摄像头移动。
  • 动态调整摄像头参数(如 Focal Length)。

5.4 景深与后处理效果

增强摄像头画面的视觉表现,通常需要结合景深和后处理。

5.4.1 景深效果(Depth of Field)
  • Cine Camera Actor 中启用 Focus Settings
  • 调整光圈值(小值如 1.4 产生浅景深)和对焦距离。
5.4.2 后处理体积(Post Process Volume)
  • 在关卡中添加 Post Process Volume
  • 调整曝光、颜色校正、镜头光晕等参数,增强电影感。

第六部分:常见问题与调试技巧

6.1 摄像头视角问题

  • 问题:视角不对或画面异常。
  • 解决:检查摄像头旋转和位置,确保未被遮挡。

6.2 Sequencer 动画不生效

  • 问题:动画未播放或效果不对。
  • 解决:确认摄像头轨道绑定正确,播放模式设置为 Evaluate Sequencer

6.3 景深效果不明显

  • 问题:背景模糊效果不明显。
  • 解决:降低光圈值(如 1.4),调整对焦距离。

6.4 弹簧臂碰撞问题

  • 问题:摄像头穿墙或卡住。
  • 解决:确保 Spring Arm ComponentDo Collision Test 已启用,调整碰撞半径或臂长。

6.5 输入映射无效

  • 问题:输入未触发摄像头或角色行为。
  • 解决:检查 Project Settings > Input 中的映射是否正确绑定,确认蓝图或代码逻辑无误。

6.6 组件未正确附加或初始化

  • 问题:通过代码或蓝图添加的组件(如 UCameraComponent)未生效。
  • 解决
    • 确认组件是否正确创建和附加到 Actor 上(检查 CreateDefaultSubobjectSetupAttachment)。
    • 确认组件的初始化逻辑是否在 BeginPlay 或其他生命周期函数中正确执行。
    • 使用日志输出或调试工具(如 UE_LOG)检查组件是否被实例化。

第七部分:总结与学习建议

7.1 摄像头类型选择建议

用途推荐类型适用场景
游戏视角控制Camera Component动态交互,玩家角色视角
电影化内容Cine Camera Actor过场动画,Sequencer 制作
简单测试Camera Actor快速放置,预览或测试

7.2 学习路径建议

  • 初学者:先掌握 Cine Camera Actor 的基本操作和 Sequencer 动画制作。
  • 进阶开发者:深入学习蓝图和 C++ 代码控制摄像头,结合后处理效果和弹簧臂组件。
  • 高级用户:探索 Player Camera Manager、输入映射逻辑和自定义插件开发。

7.3 资源与社区

  • 官方文档:Epic Games 提供的 UE5 文档,包含摄像头和相关组件的详细说明。
  • 社区资源:Unreal Engine 论坛、Reddit 和 YouTube 教程,获取最新的技巧和案例。
  • Marketplace:下载免费或付费的摄像机系统插件,加速开发流程。

相关文章:

虚幻引擎5-Unreal Engine笔记之摄像头camera

虚幻引擎5-Unreal Engine笔记之摄像头camera code review! 目录 第一部分&#xff1a;摄像头的基础概念 1.1 UE5 中摄像头的定义与作用1.2 UE5 中摄像头的类型与分类 第二部分&#xff1a;摄像头的代码结构与分类 2.1 摄像头是类还是组件&#xff1f;2.2 组件的本质&#xff…...

mysql的基础命令

1.SQL的基本概念 SQL 是用于管理和操作关系型数据库的标准编程语言。是所有关系型数据库&#xff08;如 MySQL、PostgreSQL、Oracle 等&#xff09;的通用语言。 SQL语句分类 DDL: Data Defination Language 数据定义语言 CREATE&#xff0c;DROP&#xff0c;ALTER DML: Da…...

去中心化算力池:基于IPFS+智能合约的跨校GPU资源共享平台设计

点击 “AladdinEdu&#xff0c;同学们用得起的【H卡】算力平台”&#xff0c;H卡级别算力&#xff0c;按量计费&#xff0c;灵活弹性&#xff0c;顶级配置&#xff0c;学生专属优惠。 一、问题背景&#xff1a;高校算力孤岛的困境 现状痛点 各高校GPU集群利用率差异显著&…...

数据库(二):ORM技术

什么是 ORM&#xff1f; ORM&#xff08;Object-Relational Mapping&#xff09; 是一种用于实现 对象模型&#xff08;面向对象&#xff09;与关系模型&#xff08;数据库&#xff09;之间映射的技术&#xff0c;使程序员可以通过操作对象的方式访问数据库数据&#xff0c;而无…...

Oracle基础知识

目录 1.别名的使用 2.AND的优先级高于OR 3.where后面可以接别名&#xff0c;order by后面不可以 4.Oracle中SQL的执行顺序(重点) 5.dual万用表 6.是否区分大小写 7.Oracle常用数据类型 8.Oracle常用函数 (1)length字符、lengthb字节和cast强制类型转换 (2)数据类型转…...

使用 vite-plugin-dynamic-base 实现运行时动态设置上下文路径

我们一般会在编译之前设置上下文&#xff0c;那么如何在编译之后动态设置上下文的路径&#xff1f; 本文使用的技术栈是 Go&#xff08;Gin&#xff09; Vue.js&#xff08;Vite&#xff09; 本文使用到的第三方包&#xff1a;https://github.com/chenxch/vite-plugin-dynam…...

spark-shuffle 类型及其对比

1. Hash Shuffle 原理&#xff1a;将数据按照分区键进行哈希计算&#xff0c;将相同哈希值的数据发送到同一个Reducer中。特点&#xff1a;实现简单&#xff0c;适用于数据分布均匀的场景。但在数据分布不均匀时&#xff0c;容易导致某些Reducer处理的数据量过大&#xff0c;产…...

力扣-快乐数

1.题目要求 2.题目链接 202. 快乐数 - 力扣&#xff08;LeetCode&#xff09; 3.题目分析 首先,因为需要频繁地用到数字变为各个位上的平方的过程,我们可以将"对于一个正整数,每一次将该数替换为它每个位置的数字的平方和"这一操作抽象出来&#xff0c;定义成一个…...

每日算法刷题Day10 5.19:leetcode不定长滑动窗口求最长/最大4道题,结束定长滑动窗口,用时1h

不定长滑动窗口 不定长滑动窗口主要分为三类&#xff1a;求最长子数组&#xff0c;求最短子数组&#xff0c;以及求子数组个数。 注&#xff1a;滑动窗口相当于在维护一个队列。右指针的移动可以视作入队&#xff0c;左指针的移动可以视作出队。 滑动窗口【基础算法精讲 03】…...

FreeSWITCH 纯内网配置

纯内网&#xff0c;且同一个网段&#xff0c;Fs 可简化配置&#xff0c;要点是: 1. 不需要事先配置 directory&#xff0c;任意号码都可以注册&#xff0c;且无挑战 2. 呼叫无挑战 不需要考虑那么多安全问题 配置如下&#xff1a; 1. 全局变量 <X-PRE-PROCESS cmd"…...

STL中list的模拟

这里写目录标题 list 的节点 —— ListNodelist 的 “导览员” —— ListIteratorlist 的核心 —— list 类构造函数迭代器相关操作容量相关操作 结尾 在 C 的 STL&#xff08;标准模板库&#xff09;中&#xff0c;list 是一个十分重要的容器&#xff0c;它就像一个灵活的弹簧…...

【iOS】类结构分析

前言 之前我们已经探索得出对象的本质就是一个带有isa指针的结构体&#xff0c;这篇文章来分析一下类的结构以及类的底层原理。 类的本质 类的本质 我们在main函数中写入以上代码&#xff0c;然后利用clang对其进行反编译&#xff0c;可以得到c文件 可以看到底层使用Class接…...

Android 万能AI证件照 v1.3.2

在日常的生活和工作场景里&#xff0c;证件照的身影随处可见。找工作投简历时&#xff0c;它是展现你形象的 “第一张名片”&#xff1b;办理各类证件&#xff0c;缺了它可不行&#xff1b;参加各种考试报名&#xff0c;同样需要它。可以说&#xff0c;证件照虽小&#xff0c;却…...

【Java】封装在 Java 中是怎样实现的?

包 关于包有两个关键字 package : 声明当前类属于哪个包 和 import : 允许当前类使用其他类或接口时不使用全限定名 , 也就是导包 . IDEA 的普通项目文件包括 src : 包含源码和资源文件 和 out : 包含编译产物字节码文件 . 在 IDEA 开发环境建包会在 src 源码目录中生成 , 可…...

牛客网 NC14736 双拆分数字串 题解

牛客网 NC14736 双拆分数字串 题解 题目分析 解题思路 通过分析&#xff0c;我们可以发现&#xff1a; 当n≤3时&#xff0c;无法构造出双拆分数字串&#xff0c;因为数字位数太少对于n>3的情况&#xff0c;我们可以构造两种特殊形式&#xff1a; 当n为奇数时&#xff0c…...

超长文本注意力机制如何突破传统 O(n²) 瓶颈

介绍了当前在超长文本&#xff08;可达百万级及以上 Token&#xff09;生成与预测中&#xff0c;注意力机制如何突破传统 O(n) 瓶颈&#xff0c;并阐释多种高效注意力算法如何支持 超长上下文处理能力。 概览 当前主流 Transformer 在处理长序列时&#xff0c;由于每个 Token…...

异丙肌苷市场:现状、挑战与未来展望

摘要 本文聚焦异丙肌苷市场&#xff0c;深入分析了其市场规模与增长趋势、应用价值与市场驱动因素、面临的挑战以及竞争格局。异丙肌苷作为一种具有重要应用价值的改性核苷衍生物&#xff0c;在药物研发和治疗领域展现出潜力&#xff0c;但市场发展也面临诸多挑战。文章最后为…...

JAVA面向对象——对象和类的基本语法

JAVA面向对象——对象和类的基本语法 一、面向对象编程基础 1. 程序中的数据存储方式 基本类型&#xff1a;变量&#xff08;如 int max 15;&#xff09;。数据结构&#xff1a;数组&#xff08;一维/二维&#xff09;、对象&#xff08;特殊数据结构&#xff0c;用于存储复…...

【windows】音视频处理工具-FFmpeg(合并/分离)

一、FFmpeg介绍 FFmpeg是一个‌开源的跨平台音视频处理框架。 法国计算机程序员 Fabrice Bellard 于 2000 年创建。 “FF”&#xff08;代表 “Fast Forward”&#xff0c;快进之意&#xff09;与 “mpeg”&#xff08;流行的视频压缩标准 MPEG&#xff0c;即运动图像专家组&am…...

Java并发编程:从基础到高级实战

在现代软件开发中&#xff0c;并发编程已成为不可或缺的核心技能。随着多核处理器的普及和分布式系统的发展&#xff0c;能否编写高效、线程安全的并发程序直接决定了应用程序的性能和可靠性。Java作为一门成熟的企业级编程语言&#xff0c;提供了丰富的并发编程工具和API&…...

在 Excel 中使用东方仙盟软件————仙盟创梦IDE

安装插件 用仙盟创梦编写插件代码 源码 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using ExcelDna.Integration;namespace 东方仙盟.仙盟创梦IDE_招标系统 {public static class 仙盟创梦_招标专…...

win7无线网络名称显示为编码,连接对应网络不方便【解决办法】

使用多个网络时可能需要切换到打印机的网络来打印东西&#xff0c;但是win7的编码问题导致不知道哪个网络是对应网络&#xff0c;可以使用批处理命令来自动连接道指定网络 将这个代码用文本文件打开后粘贴&#xff0c;然后另存为ansi格式的bat文件 代码中使用两种方式进行连接…...

.NET 10 - 尝试一下Minimal Api的Validation新特性

1.简单介绍 2025年11月微软将会发布.NET10&#xff0c;这是LTS(Long Term Support)版本。当前.NET10已经处于Preview4版本&#xff0c;微软对Runtime, Library, SDK, C#, Asp.NET Core, MAUI等都做了很多enhancement。近些年微软对Minimal Api一直在持续地更新。在.NET8中, Mi…...

C# Task 与 SynchronizationContext

示例代码 using System; using System.Collections.Concurrent; using System.Threading; using System.Threading.Tasks;namespace Test {internal class Program{static void Main(string[] args){_mainThreadSynchronizationContext new ThreadSynchronizationContext(&qu…...

iOS Runtime与RunLoop的对比和使用

Runtime 机制 核心概念 Objective-C 的动态特性&#xff1a;Objective-C 是一门动态语言&#xff0c;很多工作都是在运行时而非编译时决定的消息传递机制&#xff1a;方法调用实际上是发送消息 objc_msgSend(receiver, selector, ...)方法决议机制&#xff1a;动态方法解析、…...

JavaSenderMail发送邮件(QQ及OFFICE365)

前言 这是今天处理的公司安排的一个任务&#xff1a;客户系统发送offices365邮件报错535 之前没怎么解除邮件业务&#xff0c;于是先搭个简单的QQ邮件Demo熟悉一下吧&#xff0c;没有啥公网内网的麻烦&#xff08;之前听说有内网限制&#xff0c;我还处理了一些环境上的问题&…...

八股文--JVM(2)

⭐️⭐️6.类加载 类加载器 JVM只会运行二进制文件&#xff0c;类加载器的作用就是将字节码加载到JVM中&#xff0c;从而让程序启动 1.启动类加载器 ----JAVA_HOME/jre/libC编写加载的是JAVA_HOME/jre/lib 2.拓展类加载器 ----JAVA_HOME/jre/lib/ext 3.应用类加载器 ----C…...

【HTML-3】HTML 中的水平线与换行:基础元素详解

在网页设计中&#xff0c;合理的布局和内容分隔对于提升用户体验至关重要。HTML 提供了两个简单但强大的元素来实现这些功能&#xff1a;水平线 (<hr>) 和换行 (<br>)。本文将深入探讨这两个元素的用法、最佳实践以及现代替代方案。 1. 水平线 <hr> 元素 1…...

绿色云计算:数字化转型与可持续发展的完美融合

目录 引言 绿色云计算的概念与定义 云计算的环境影响与绿色云计算的重要性 绿色云计算的技术实践与策略 绿色云计算的案例研究与最佳实践 绿色云计算的挑战与限制 绿色云计算的未来趋势与预测 结论与展望 引言 随着云计算技术的迅猛发展和广泛应用&#xff0c;其环境影…...

AMO——下层RL与上层模仿相结合的自适应运动优化:让人形行走操作(loco-manipulation)兼顾可行性和动力学约束

前言 自从去年24年Q4&#xff0c;我司侧重具身智能的场景落地与定制开发之后 去年Q4&#xff0c;每个月都会进来新的具身需求今年Q1&#xff0c;则每周都会进来新的具身需求Q2的本月起&#xff0c;一周不止一个需求 特别是本周&#xff0c;几乎每天都有国企、名企通过我司找到…...

大模型——多模态检索的RAG系统架构设计

文章目录 1. 系统架构设计核心组件 2. 跨模态向量空间对齐方案方法一&#xff1a;预训练对齐模型&#xff08;如CLIP&#xff09;方法二&#xff1a;跨模态投影网络方法三&#xff1a;联合微调 3. 混合检索策略4. 关键问题解决Q: 如何解决模态间向量尺度不一致&#xff1f;Q: 如…...

BUUCTF——Kookie

BUUCTF——Kookie 进入靶场 一个登录页面 左上角提示让以admin身份登录 找到了cookie 应该与cookie相关 测试了一下admin admin没登上 We found the account cookie / monster 回头看了一下 这个是不是账号密码 测试一下 成功登入 但是没有flag 应该还是跟cookie相关 …...

代码随想录算法训练营

力扣684.冗余连接【medium】 力扣.冗余连接Ⅱ【hard】 一、力扣684.冗余连接【medium】 题目链接&#xff1a;力扣684.冗余连接 left x300 视频链接&#xff1a;代码随想录 题解链接&#xff1a;灵茶山艾府 1、思路 可以从前向后遍历每一条边&#xff08;因为优先让前面的边连上…...

服务器磁盘不同格式挂载区别

在Linux系统中&#xff0c;磁盘不同格式挂载的核心区别主要体现在‌文件系统类型‌和‌挂载方式‌两个方面&#xff0c;以下为具体差异分析&#xff1a; 一、文件系统类型区别 磁盘格式即文件系统类型的选择直接影响挂载后的性能和功能&#xff1a; ‌常见文件系统比较‌ ‌e…...

AI智能分析网关V4人员摔倒检测打造医院/工厂等多场景智能安全防护体系

一、方案背景​ 随着全球老龄化加剧&#xff0c;我国老年人口占比持续攀升&#xff0c;老年人摔倒伤亡事件频发&#xff0c;居家、养老机构等场景的摔倒防控成为社会焦点。同时&#xff0c;工厂、医院、学校等人员密集场所也易发生意外摔倒安全事故。传统人工监控存在视觉疲劳…...

window 显示驱动开发-准备 DMA 缓冲区

显示微型端口驱动程序必须及时准备 DMA 缓冲区。 当 GPU 处理 DMA 缓冲区时&#xff0c;通常调用显示微型端口驱动程序来准备下一个 DMA 缓冲区&#xff0c;以便提交到 GPU。 若要防止 GPU 耗尽&#xff0c;显示微型端口驱动程序在准备和提交后续 DMA 缓冲区时所花费的时间必须…...

程序设计实践--排序(1)

&#xff11;、插入排序&#xff08;一个数组&#xff09; #include<bits/stdc.h> using namespace std; const int N1e35; int a[N]; int n; int main(){cin>>n;for(int i1;i<n;i){cin>>a[i];}for(int i1;i<n;i){int va[i];int ji-1;while(j>1&am…...

window 显示驱动开发-GDI 硬件加速

Windows 7 引入的 GDI 硬件加速功能在图形处理单元 (GPU) 上提供加速的核心图形设备接口 (GDI) 操作。 若要指示 GPU 和驱动程序支持此功能&#xff0c;显示微型端口驱动程序必须将DXGKDDI_INTERFACE_VERSION设置为 > DXGKDDI_INTERFACE_VERSION_WIN7。 显示微型端口驱动程…...

驱动开发硬核特训 · Day 31:理解 I2C 子系统的驱动模型与实例剖析

&#x1f4da; 训练目标&#xff1a; 从驱动模型出发&#xff0c;掌握 I2C 子系统的核心结构&#xff1b;分析控制器与从设备的注册流程&#xff1b;结合 AT24 EEPROM 驱动源码与设备树实例&#xff0c;理解 i2c_client 与 i2c_driver 的交互&#xff1b;配套高质量练习题巩固理…...

网络安全之网络攻击spring临时文件利用

0x00 传统攻击流程 我们之前传统的攻击流程由以下几个步骤来完成 攻击者找到可以控制目标JDBC连接fakeServer的地方目标向fakeServer发起连接请求fakeServer向目标下发恶意数据包目标解析恶意数据包并完成指定攻击行为&#xff08;文件读取、反序列化&#xff09;&#xff0c…...

统一端点管理(UEM):定义、优势与重要性

统一终端管理&#xff08;UEM&#xff09;​​是一种通过单一平台集中管理、监控和保护企业所有终端设备&#xff08;如笔记本电脑、移动设备、服务器、物联网设备等&#xff09;的综合性策略。其核心在于跨操作系统&#xff08;Windows、macOS、iOS、Android等&#xff09;实现…...

什么是Rootfs

Rootfs (Root Filesystem) 详解 buildroot工具构建了一个名为"rootfs.tar"的根文件系统压缩包。 什么是rootfs Rootfs&#xff08;Root Filesystem&#xff0c;根文件系统&#xff09;是操作系统启动后挂载的第一个文件系统&#xff0c;它包含系统正常运行所需的基…...

黑马Java基础笔记-13常用查找算法

查找算法 基本查找(也叫顺序查找&#xff0c;线性查找) 二分查找&#xff08;需要有序数据&#xff09; public static int binarySearch(int[] arr, int number){//1.定义两个变量记录要查找的范围int min 0;int max arr.length - 1;//2.利用循环不断的去找要查找的数据wh…...

#渗透测试#批量漏洞挖掘#LiveBos UploadFile(CVE-2021-77663-2336) 任意文件上传漏洞

免责声明 本教程仅为合法的教学目的而准备&#xff0c;严禁用于任何形式的违法犯罪活动及其他商业行为&#xff0c;在使用本教程前&#xff0c;您应确保该行为符合当地的法律法规&#xff0c;继续阅读即表示您需自行承担所有操作的后果&#xff0c;如有异议&#xff0c;请立即停…...

Git 和 GitHub 学习指南本地 Git 配置、基础命令、GitHub 上传流程、企业开发中 Git 的使用流程、以及如何将代码部署到生产服务器

Windows 上 Git 安装与配置 下载安装&#xff1a;访问 Git 官方网站下载适用于 Windows 的安装程序。运行安装包时会出现许可协议、安装目录、组件选择等界面&#xff08;如下图&#xff09;。在“Select Components”页面建议勾选 Git Bash Here 等选项&#xff0c;以便在资源…...

SUI批量转账几种方法介绍

一、Sui区块链简介 Sui是由前Meta&#xff08;Facebook&#xff09;工程师创建的下一代Layer 1区块链&#xff0c;采用基于Move编程语言的新型智能合约平台。Sui的设计专注于高吞吐量、低延迟和可扩展性&#xff0c;使其特别适合需要处理大量交易的场景。 Sui的核心特点&…...

Vue2到Vue3迁移问题解析

1. 响应式系统的变化 问题&#xff1a;Vue3 使用 Proxy 替代 Object.defineProperty&#xff0c;导致部分 Vue2 的响应式写法失效。解析&#xff1a; 数组直接索引修改&#xff1a;// Vue2&#xff1a;需使用 Vue.set 或 splice this.$set(this.items, 0, new value); this.it…...

【解决】rpm 包安装成功,但目录不存在问题

开发平台&#xff1a;RedHat 8   一、问题描述 [rootproxy ~]# rpmbuild -ba /root/rpmbuild/SPECS/nginx.spec # rpmbuild 制作 .rpm 包 [rootproxy ~]# yum -y install /root/rpmbuild/RPMS/x86_64/nginx-1.22.1-1.x86_64.rpm # 安装 .rpm包 …...

深度学习框架显存泄漏诊断手册(基于PyTorch的Memory Snapshot对比分析方法)

点击 “AladdinEdu&#xff0c;同学们用得起的【H卡】算力平台”&#xff0c;H卡级别算力&#xff0c;按量计费&#xff0c;灵活弹性&#xff0c;顶级配置&#xff0c;学生专属优惠。 一、显存泄漏&#xff1a;深度学习开发者的"隐形杀手" 在深度学习模型的训练与推…...

PyTorch中单卡训练、DataParallel(DP)和DistributedDataParallel(DDP)

PyTorch中提供了单卡训练、DataParallel&#xff08;DP&#xff09;和DistributedDataParallel&#xff08;DDP&#xff09;&#xff0c;下面是相关原理与实现代码。 代码下载链接&#xff1a;git代码链接 一、单卡训练 原理 单卡训练是最基础的模型训练方式&#xff0c;使用…...