Choose your operating system:
Windows
macOS
Linux
nDisplay中的投影策略
在开发新功能时,Epic Games采用的一种策略是评估能否用现有工具来为 虚幻引擎(UE4) 添加新功能。经过反复研究,我们发现以下技术可以帮助我们实现"可缩放显示"这一目标。
以下是当前支持的投影策略:
策略 |
描述 |
---|---|
|
简单(将改名为"屏幕") |
|
摄像机 |
|
手动 |
|
基于网格体(在4.25版本中添加) |
|
Picp_mesh |
|
MPCDI |
|
PICP_MPCDI |
|
Easyblend |
简单策略(将改名为"屏幕"策略)
简单策略 是指用于在常规2D平面显示器上进行渲染的标准策略。此策略需要将3D空间中的矩形用于构建摄像机视锥。必须在配置文件中定义矩形(屏幕),然后在简单投影策略中引用:
[screen] id="scr_demo" loc="X=2,Y=0,Z=0" rot="P=0,Y=0,R=0" size="X=1,Y=1"
[viewport] id="vp_demo" x="0" y="0" width="800" height="800" projection="proj_simple_demo"
[projection] id="proj_simple_demo" type="simple" screen="scr_demo"
在上述示例中,我们定义了一个位于nDisplay根前面2米的投影屏幕。屏幕尺寸为1x1米。
摄像机策略
由于无法使用nDisplay从常规的虚幻引擎摄像机或电影摄像机获取视图,因此引入了 摄像机策略。你可以通过此策略将任何UE4摄像机的视图映射到nDisplay视口中。
[viewport] id="vp_demo" x="0" y="0" width="800" height="800" projection="proj_camera_demo"
[projection] id="proj_camera_demo" type="camera"
配置文件的核心理念之一就是将nDisplay拓扑与应用程序及其内容(资产)完全分开。这样,任何配置文件都可以与任何应用程序结合使用。这正是为什么必须通过蓝图或C++ API手动设置摄像机的原因。
同样的理由适用于下文中的 网格体策略 。
手动策略
考虑到某些校准系统nDisplay还不支持,我们设计了一种通用方案,引入了全新的 手动投影策略。它的核心理念是允许用户为特定视口手动设置视锥。
立体渲染需要两个视锥。这可以通过投影矩阵或视锥角完成。以下是每种方案的示例,包括了单视锥和双视锥的设置:
### 案例1:自定义矩阵中的视锥
[viewport] id=vp_1 x=0 y=0 width=1000 height=600 projection=proj_manual_1
[viewport] id=vp_2 x=0 y=0 width=1000 height=600 projection=proj_manual_2
[projection] id=proj_manual_1 type="manual" rot="P=0,Y=0,R=0" matrix_left="[0.5 0 0 0] [0 0.999999 0 0] [1 0 0 1] [0 0 1 0]" matrix_right="[0.500001 0 0 0] [0 1 0 0] [-1 0 0 1] [0 0 1 0]"
[projection] id=proj_manual_2 type="manual" rot="P=0,Y=0,R=0" matrix="[0.500001 0 0 0] [0 1 0 0] [-1 0 0 1] [0 0 1 0]"
### 案例2:自定义角的视锥
[viewport] id=vp_1 x=0 y=0 width=1000 height=600 projection=proj_manual_1
[viewport] id=vp_2 x=0 y=0 width=1000 height=600 projection=proj_manual_2
[projection] id=proj_manual_1 type="manual" rot="P=0,Y=0,R=0" frustum_left="l=-15 r=0 t=10 b=-10" frustum_right="left=0 right=15 top=10 bottom=-10"
[projection] id=proj_manual_2 type="manual" rot="P=0,Y=0,R=0" frustum="l=0 r=15 t=10 b=-10"
基于网格体和PICP_Mesh
我们添加了两种新的 投影策略,以便简化扭曲渲染工作流:
一种是通用型策略,称为
"网格体(mesh——"
一种用于摄象机内特效(In Camera VFX),称为
"picp_mesh"
(Picture in Camera Perspective(picp))相比 PFM(便携式浮动贴图)工作流,现在可以直接指定网格体,以便有效地扭曲渲染输出。
一般用途
*` [projection] id="proj_picpmesh_right" type="mesh" `
扭曲网格体的源由指定给具有"网格体"投影集视口的SceneMeshComponent引用表示:
[viewport] id="warped_viewport" x="0" y="0" width="1152" height="960" projection="proj_picpmesh_right"
用于扭曲映射的UV信道0。
摄象机内特效
基于网格体的"picp_mesh"扭曲策略专为摄像机内特效(IncameraVFX)的视锥渲染而创建。
[projection] id="proj_picpmesh_up" type="picp_mesh"
对于网格体分配,应使用PICP Module API,而非DisplayClusterProjectionAPI。
MPCDI 和 PICP_MPCDI
对于那些依赖MPCDI行业协议标准的复杂项目来说,我们会集成MPCDI标准。
MPCDI(多投影通用数据交换) 标准由"VESA多投影仪自动校准"(MPAC)任务小组开发。这是投影校准系统与多显示器配置中的设备进行通信的标准数据格式。
该标准为多投影仪系统提供了一种生成数据的方法;通过利用该数据和各类设备,可以将单个显示组件组合成单一、无缝的图像。引入系统的任何新硬件都可以轻松地与标准集成。
MPCDI被行业中的内容生产商和供应商广泛使用,例如:
Scalable Display Technologies
VIOSO
Dataton Watchout
7thSense Design
支持MPCDI标准使nDisplay能够以标准化和正规化的方式读取和存储描述复杂投影仪系统的数据,以便我们可以轻松地与行业内的其他工具进行通信和连接。
由于MPCDI为最新执行标准,因此引擎中还没有预览功能。为了解决这个问题,我们正在研究一种运行时在虚幻编辑器中预览MPCDI文件数据的解决方案。
当前,用户能够利用MPCDI文件生成的网格体数据,为物理显示器生成程序化的网格体。
有两种使用mpcdi投影策略的方法。第一种是本机方法,用户必须指定要使用的.mpcdi文件、缓冲区和区域。第二种是用户明确指定存储在.mpcdi中的文件(本质上就是文件存档)。
使用.mpcdi文件
[projection] id=proj_mpcdi_demo type="mpcdi" file="D:\config.mpcdi" buffer="Mosaic" region="displayOrigin" origin=mpcdi_origin
明确规范
[projection] id="proj_mpcdi_demo" type="mpcdi" pfm="geom_left.pfm" alpha="geom_left_a.png" beta="geom_left_b.png" scale=1 origin=stage_origin
EasyBlend(可扩展显示)
EasyBlend 校准数据的集成工作通过 Scalable SDK 完成,该SDK启用了扭曲/混合/梯形失真功能。这满足了使用多投影仪在非平面和复杂显示表面(例如曲面或圆顶形表面)上显示的要求。
Scalable Display Technologies 是一家专注于为复杂投影系统开发软件和SDK的公司。他们的SDK旨在通过扭曲和混合技术,为单幅图像的放大显示提供解决方案。考虑到Scalable Display Technologies已经有了现成的EasyBlend解决方案,并且可以处理大幅图像的扭曲和混合效果,因此我们选择将其集成到虚幻引擎中。
通过集成行业标准中间件Scalable SDK和EasyBlend,虚幻引擎支持扭曲和混合效果,适用于所有受支持模式、MPCDI的本地扭曲和混合、以及自定义实现。
我们实现了EasyBlend的集成,以便在配置复杂的投影系统方面提供无缝体验。使用第三方工具或软件完成校准后,用户只需在nDisplay配置文件中指定一些参数即可使其运行。
[projection] id=proj_easyblend_1 type="easyblend" file="E:\LocalCalibrationFlat\ScalableData.pol" origin=easyblend_origin_1 scale=0.1
[projection] id=proj_easyblend_2 type="easyblend" file="E:\LocalCalibrationFlat\ScalableData.pol_1" origin=easyblend_origin_1 scale=0.1
[projection] id=proj_easyblend_3 type="easyblend" file="E:\LocalCalibrationFlat\ScalableData.pol_2" origin=easyblend_origin_1 scale=0.1