Previze 虚拟制片预演系统-项目介绍

演示视频:Previze 虚拟制片预演系统功能演示 系统介绍:基于 UE5 的影视/舞台三维预演工具,覆盖场景搭建、灯光机位、动画时间轴到逐帧渲染的全流程;我独立完成了客户端主体开发、自研 Editor 插件,并设计了与云端资产系统的对接方案。 项目背景 在影视制作、舞台演出和虚拟拍摄场景中,导演、摄影和灯光团队往往需要在实拍前反复验证场景布局、灯光方案和机位调度。传统流程依赖多个软件切换,沟通成本高、试错代价大。 PreviewTool(虚拟预演系统) 是我从 2024 年起持续开发的 ToB 端产品: 预演系统(主体):面向导演、摄影、灯光师的实时三维预演工作台(本人独立设计与实现) Editor工具插件:Pak 资产的 Cook、打包与上传工具(本人独立设计与实现) Pak 资产管理后台:资产上传、分类与版本管理(需求与 API 契约由本人定义,CRUD 实现借助 AI 辅助开发) 项目目前处于可演示、可实际使用的阶段,已在内部预演流程中验证核心链路。 系统架构 技术栈 客户端开发(核心) 类别 技术 主语言 C++(Gameplay / UI / 动画 / 渲染 / 资产同步) UI 框架 UMG + C++(UUserWidget + BindWidget) 蓝图 Sku Actor 资产逻辑、部分交互;核心系统以 C++ 为主 输入与编辑 继承 RuntimeTransformer 的 Gizmo 变换、拖放放置、多选 动画 UTimelineComponent + UCurveFloat + 自研多轨道关键帧 渲染输出 UTextureRenderTarget2D + IImageWrapper,Timer 驱动逐帧导出 程序化 ProceduralMeshComponent(LED 幕墙 / 墙体生成) 媒体 MediaAssets(LED 屏本地视频播放) 插件 插件 类型 用途 CameraCapture(自研) Runtime 摄影机实时取景预览 (相关技术获得专利证书) PakTools(自研) Editor + Runtime CreatePak:Cook / 打 Pak / 上传;PakLoader:运行时挂载与加载 RuntimeTransformer Runtime 运行时 Gizmo 变换(基于商城插件二次修改) 配套后台(非主攻,了解联调) Django 4 + DRF + PostgreSQL + Redis + React 17 — 我负责 API 契约定义 与 UE 端同步实现,后台 CRUD 借助 AI 辅助搭建。...

六月 22, 2026 · Imrcao

预演系统-Pak资产挂载流程记录

这里记录程序线执行流程 一、pak资产挂载流程 目前有两个挂载入口: 0.1加载本地pak资产 /Game/Blueprints/UI/CoreUI/WPT_AssetLibraryMenu.WPT_AssetLibraryMenu蓝图中ConstructSkuClass函数调用void UCPT_UnitSkuButton::RequestMountPak(const FString& LocalPakPath)函数进行pak挂载请求; 0.2下载云端资产 void FCPT_AssetDownloadService::OnDownloadFinished函数中调用void UCPT_UnitSkuButton::RequestMountPak(const FString& LocalPakPath)函数进行pak挂载请求。 挂载委托关系梳理: UCPT_UnitSkuButton类 有代理:OnMountPakRequested(声明:DECLARE_DELEGATE_TwoParams(FOnMountPakRequested, UCPT_UnitSkuButton*, const FString&);) 有函数: void UCPT_UnitSkuButton::RequestMountPak(const FString& LocalPakPath) { OnMountPakRequested.ExecuteIfBound(this, LocalPakPath); } UCPT_AssetLibraryMenu类 有代理:DE_MountPakRequested(声明DECLARE_DELEGATE_TwoParams(FOnPakMountRequested, UCPT_UnitSkuButton*, const FString&)) 有函数: void UCPT_AssetLibraryMenu::RegisterSkuButton(UCPT_UnitSkuButton* Button) { Button->OnMountPakRequested.BindLambda([this](UCPT_UnitSkuButton* Btn, const FString& PakPath) { DE_MountPakRequested.ExecuteIfBound(Btn, PakPath); }); } UCPT_MainUI类 在函数void UCPT_MainUI::LoadLocalAssets()中进行了绑定: LeftMenuBar->AssetLibraryMenu->DE_MountPakRequested.BindUObject(this, &UCPT_MainUI::HandlePakMountRequested); 流程如下: 1、首先会在函数void UCPT_MainUI::LoadLocalAssets()中绑定DE_MountPakRequested代理。 2、然后在构建资产缩略图按钮时会调用RegisterSkuButton注册代理。 请求挂载:RequestMountPak -> 由于在(2)中绑定了lambda函数,所以会执行DE_MountPakRequested -> 由于在(1)中绑定代理,所以最终执行:HandlePakMountRequested。 流程图/拓扑图 整体挂载流程拓扑图 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 ┌─────────────────────────────────────────────────────────────────────────────┐ │ Pak 资产挂载流程总览 │ ├─────────────────────────────────────────────────────────────────────────────┤ │ │ │ 入口A:启动时加载本地pak 入口B:下载云端资产 │ │ ┌─────────────────────┐ ┌──────────────────────┐ │ │ │ UCPT_MainUI:: │ │ UCPT_UnitSkuButton:: │ │ │ │ LoadLocalAssets() │ │ RequestDownload() │ │ │ └─────────┬───────────┘ └──────────┬───────────┘ │ │ │ │ │ │ │ 读取本地清单 入队下载 │ │ │ │ manifest_cache....

五月 29, 2026 · Imrcao