You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用UE5 Python API渲染相机视角画面?硕士项目数据集制作求助

问题解决与代码修正

核心错误修复:Actor添加组件的正确方式

UE5 Python API中,Actor没有add_actor_component方法,需要使用unreal.EditorLevelLibrary.add_component_to_actor来将组件附加到Actor上。

黑图问题的额外修正

同时针对黑色纹理问题,补充了RenderTarget分辨率设置、SceneCaptureComponent激活、相机参数同步以及最终的图片导出步骤。

修改后的完整代码

import unreal

def capture_and_save_image(camera_actor, name, resolution=(1024, 1024)):
    # 验证相机Actor有效性
    if not camera_actor or not unreal.EditorLevelLibrary.is_valid(camera_actor):
        print("Camera Actor无效")
        return

    asset_tools = unreal.AssetToolsHelpers.get_asset_tools()
    package_path = "/Game/SavedPics"
    asset_name = f"{name}"

    # 创建或获取RenderTarget
    # 先检查是否已存在,避免重复创建
    existing_asset = unreal.EditorAssetLibrary.load_asset(f"{package_path}/{asset_name}")
    if existing_asset and isinstance(existing_asset, unreal.TextureRenderTarget2D):
        render_target = existing_asset
    else:
        factory = unreal.TextureRenderTargetFactoryNew()
        render_target = asset_tools.create_asset(
            asset_name=asset_name,
            package_path=package_path,
            asset_class=unreal.TextureRenderTarget2D,
            factory=factory
        )
        # 设置RenderTarget分辨率
        render_target.set_editor_property("size_x", resolution[0])
        render_target.set_editor_property("size_y", resolution[1])
        unreal.EditorAssetLibrary.save_loaded_asset(render_target)

    # 获取相机Actor上的CameraComponent,同步参数到SceneCaptureComponent
    camera_component = None
    for comp in camera_actor.get_components_by_class(unreal.CameraComponent):
        camera_component = comp
        break
    if not camera_component:
        print("相机Actor上未找到CameraComponent")
        return

    # 创建SceneCaptureComponent2D
    scene_capture_component = unreal.SceneCaptureComponent2D()
    # 将组件添加到Actor
    unreal.EditorLevelLibrary.add_component_to_actor(
        camera_actor,
        scene_capture_component,
        "SceneCaptureComponent"
    )

    # 同步原相机的参数
    scene_capture_component.set_editor_property("field_of_view", camera_component.field_of_view)
    scene_capture_component.set_editor_property("aspect_ratio", camera_component.aspect_ratio)
    # 设置捕获源和渲染目标
    scene_capture_component.texture_target = render_target
    scene_capture_component.capture_source = unreal.SceneCaptureSource.SCS_FINAL_COLOR_LDR
    # 激活组件
    scene_capture_component.set_editor_property("is_active", True)

    # 执行场景捕获
    scene_capture_component.capture_scene()
    # 强制更新内容
    scene_capture_component.update_content()

    # 将RenderTarget导出为图片文件(可选,根据需求添加)
    output_path = f"{unreal.Paths.project_saved_dir()}/SavedPics/{name}.png"
    unreal.EditorRenderTargetLibrary.render_target_to_file(render_target, output_path, unreal.RenderTargetFormat.RTF_PNG)

    # 可选:如果不需要保留SceneCaptureComponent,捕获后可以删除
    # unreal.EditorLevelLibrary.destroy_component(scene_capture_component)

关键修改点说明

  1. 组件添加方式:用unreal.EditorLevelLibrary.add_component_to_actor替代不存在的camera_actor.add_actor_component,这是UE5 Python中添加组件到Actor的标准方法。
  2. RenderTarget分辨率设置:创建RenderTarget后显式设置宽高,避免默认尺寸导致的异常。
  3. 相机参数同步:从原CameraComponent同步FOV、宽高比等参数,确保SceneCapture的视角与原相机一致。
  4. 组件激活:设置is_active=True确保组件正常工作。
  5. 场景捕获与导出:调用capture_scene()执行实际渲染,并用render_target_to_file将结果导出为图片文件(解决仅保存资产但无实际图片的问题)。
  6. 资产存在性检查:避免重复创建相同名称的RenderTarget资产。

内容的提问来源于stack exchange,提问作者William Bernard Freeman Pogrun

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 03:43:15