入门
本文介绍了UNIGINE专有的术语和概念,强烈建议所有新用户使用。
虚拟世界是如何组织的?#
项目#
在UNIGINE中创建应用程序时,它由项目表示。 项目是应用程序的代码,内容和元数据的“容器”。
一个项目可以包含一个或几个复杂的3D场景,这些场景称为 worlds 。
所有项目都通过 UNIGINE SDK浏览器进行管理。
世界#
基于UNIGINE的虚拟 世界 是3D场景,其中包含一组不同的场景图 节点 (例如静态网格物体,灯光,照相机等)放置到指定位置,并应用全局设置(渲染,物理等)整个场景。
UNIGINE中的场景图是节点的多根树(层次结构)。
每个世界都由一个扩展名为.world的XML文件表示。
通过SDK浏览器创建新的项目时,还会创建一个与您的项目同名的新世界。
要编辑现有世界并创建新世界,请使用 UnigineEditor 。您可以根据需要创建和使用任意多个世界。
节点#
就UNIGINE而言,添加到场景中的所有对象都称为节点。节点可以是不同类型,可以确定其视觉表示和行为。
有一组丰富的内置节点类型。尽管该集合涵盖了几乎所有必需的情况,但用户可以手动对其进行扩展。
您还可以通过向其添加 components 来扩展任何节点的基本功能。
每个节点都有一个变换矩阵,该矩阵对世界上该节点的位置,旋转和比例进行编码。
有一些直观显示的节点类型:对象,贴图和效果。其他节点类型(光源,播放器等)是不可见的。
节点参数通常存储在.world文件中,但也可以保存到扩展名为.node的单独XML文件中(以后可以通过称为.world file via the special nodes called Node References, which is used for node instancing)。
目的#
网眼#
网格是定义对象几何形状的多边形的集合。它具有以下属性:
- 每个网格具有一个或多个曲面。
- 每个表面的最大多边形数量为 2,147,483,647 (ObjectMeshStatic,ObjectMeshSkinned)或 65,535 (ObjectMeshDynamic)。
- 有2个UV纹理通道。
- 网格支持顶点颜色。
UNIGINE中的动画可以通过皮肤网格物体(基于骨骼),变形目标(关键帧)或动态网格物体(代码为
在运行时,网格以专有的UNIGINE 格式存储,扩展名为.mesh(静态网格+可选动画数据)和.anim(外部动画数据)。
将FBX模型导入到引擎时,它会自动转换为.mesh格式。
表面#
表面是对象几何体(即对象网格)的命名的不重叠子集。每个表面可以分配自己的材质或属性。也可以彼此独立地启用/禁用表面。
在下面的图片中,一个士兵3D网格由4个表面组成:眼睛,皮肤,包(防弹衣,收音机,包)和身体(工作服,鞋子,安全帽,手套)。
材质#
就UNIGINE而言, 材质 是一个规则,用于定义表面的外观:其与灯光,反射参数等的交互。它基于:
- 顶点,片段和几何形状着色器,它们根据不同的条件实际绘制材质。
- 用户定义的纹理传递给着色器。
- 状态,用于指定条件,并根据这些条件应用适当的着色器。
- 参数,用于定义如何使用着色器。
UNIGINE提供了一组丰富的 内置基础材质 。推荐的方法是从基础材质继承并调整新的用户材质。您还可以使用UUSL(Unified UNIGINE Shader Language)或HLSL 创建自定义着色器,但在后一种情况下,您需要自己随每个SDK版本一起迁移自定义着色器。
除了在某些表面上应用常规材质外,还有一种特殊类型的材质称为 后期材质 ,它们会应用到最终屏幕组成之上(例如夜间或热视觉效果)。您还可以使用自定义后期材质和自定义着色器创建自己的后效果。
物质层次#
材质在层次结构中进行组织,并带有参数继承和重载(类似于面向对象的编程)。 继承材质时,其所有参数均从父级继承。 如果为父项更改了参数值,则该参数值也会为子项自动更改,除非在此之前为子项覆盖(设置为其他值)。
示例:材质A具有两个参数(颜色:蓝色和1.4的镜面反射力),材质B继承自材质A,并且颜色参数被覆盖(红色)。如果我们将材质A中的镜面反射功率更改为2.0,则材质B将具有以下参数:红色(覆盖)和2.0的镜面反射功率值(继承)。
通过参数继承,可以非常方便地控制多个材质参数的值。
属性#
如何向虚拟世界添加内容?#
可以在您的世界或项目中使用的所有内容都是资源。资源可能来自使用第三方应用程序创建的文件,例如3D模型,音频文件,图像或UNIGINE Engine支持的任何其他类型。
资源系统的主要前端工具是 UnigineEditor Asset Browser中的 。它用于组织项目中的内容:创建,导入,查看,重命名资源,在文件夹之间移动资源和管理其层次结构。
每次创建或导入资源时, UnigineEditor 都会执行所有必要的工作,包括将资源(无论是JPG纹理还是FBX模型)转换为其资源引擎在运行时使用的本机格式(例如压缩的.texture纹理,.mesh几何图形,.anim动画等)。转换后生成的此类文件称为“ 运行时文件”,每次您修改相应资源时,UnigineEditor都会对它们进行更新。
建议您熟悉资源工作流程以了解所有详细信息。
UnigineEditor#
UnigineEditor 允许您组装虚拟世界:导入和设置节点,为其分配材质和属性,设置照明,调整全局设置(物理,渲染等)等等。它具有所见即所得方法:您可以立即以最终质量(在运行时)看到场景。
观看以下教程,了解如何将3D模型导入UNIGINE:
我们如何看待虚拟世界?#
对于视觉表示,UNIGINE使用标准的透视投影。也可以使用正交投影。
在UNIGINE中,查看世界的方式基于以下三个实体:
- A 相机 是一个包含2个矩阵的结构:视图和投影。通过这种结构,您可以设置摄影机参数:视野,蒙版,近距和远距剪切平面以及张贴材质。然后,将摄影机传递到视口,该视口将从此摄影机渲染图像。摄像机被分配给 Player ,它将进一步控制其位置。
- A 视口 接收摄像头,并在屏幕上从中渲染图像。此外,它提供了主渲染器的所有功能,例如,立方体贴图渲染,立体渲染,全景渲染等。
- A player 是一个通过输入设备(键盘,鼠标,操纵杆)控制的节点。它分配了一个相机。玩家更改位置后,其内部摄像机的视图矩阵也将更改。
UNIGINE具有多种类型的播放器:Player Dummy,Player Actor,Player Persecutor和Player Spectator。
灯光#
您的世界中的灯光是通过放置光源创建的。这些节点包含确定各种灯光特征(例如亮度,颜色等)的参数。您还可以使用基于物理的参数(例如色温和照度)来设置灯光。
有不同种类的灯,它们以不同的方式发光。例如,灯泡向各个方向发光-在UNIGINE中,它由 全方位照明 表示。投影仪或汽车前灯在特定方向上发出锥形光束- 投射光 。来自太阳的光束看起来是平行的,因为它们的光源太远了。为了在UNIGINE中模拟这种类型的照明,使用了 世界照明 。
要了解有关UNIGINE中照明的更多信息,请参见 Lighting Video Tutorial 。
渲染图#
UNIGINE结合了完整的延迟渲染器和正向渲染技术:
要了解有关应用的渲染技术的更多信息,请参见 Rendering Sequence 文章。
在 UnigineEditor 中,可以通过 Rendering Settings 部分,并保存到*.render文件中以备后用。每个新项目都包含低,中,高和超质量预设的设置,以及为实现VR最佳性能而优化的设置。现在,您只需在资源浏览器中双击其中的任何一个即可应用相应的设置。
我们如何听到声音?#
在视觉组件旁边,声音是实时技术的一个非常重要的领域。它是在虚拟世界中营造适当沉浸感的关键资源。例如,回声的滚动提示我们可以预期在一个高耸的穹顶中发生的场景。轻敲不稳的脚砸石头或以闪电般的速度轻敲汽车-所有这些都可以在听觉上建模。 UNIGINE提供了一种多声道声音系统,该系统支持基于双耳HRTF的声音,各种3D效果,声音遮挡以及多个混响区域。您可以分配任何 MP3,WAV 或 OGA 声音,以通过在声音级别上模拟它们的物理特性的对象的接触来播放。对于像汽车这样的移动声源,将应用 Doppler 效果,以便真实地模仿声源相对于听众的移动。
所有声音设置均可通过Sound Settings section in UnigineEditor. You can also save your presets to *.sound文件中,以备后用。
身体行为如何定义?#
UNIGINE具有类似于牛顿 physics 的内置简化游戏。物理属性的用例(物理比硬编码对象动画更可取)如下:
物理是使用自己的更新FPS 进行仿真的,并且在物理仿真距离内有效。物理属性只能应用于对象。
身体#
要为对象分配一些物理属性,使其可以参与对象之间的相互作用或外部物理力,它应具有 body 。主体有几种类型:Rigid, Rag Doll, Fracture, Rope, Cloth, Water, Path。
几乎像在现实世界中一样,人体的虚拟物理学遵循速度,力,质量,密度等的概念。
形状#
虽然 body 模拟各种类型的物理行为,但形状表示刚性的体积(球体,胶囊,圆柱体,盒子,凸包)身体占据了空间。物理模拟的对象通常具有单个主体和一个或多个形状,这些形状允许对象彼此碰撞。
碰撞检测#
联合#
全局物理设置#
有全局物理设置(重力,穿透因子等)会影响世界上存在的所有物理对象。
如何控制虚拟世界?#
编程语言#
要在UNIGINE中实现项目的逻辑,可以使用以下编程语言:
- C#在速度和易用性之间取得良好的平衡。这是在组件中实现应用程序逻辑并将它们分配给要执行的任何节点的最简单方法。
- C ++ ,以实现最佳性能并与现有代码库无缝集成。
- UnigineScript ,一种快速迭代的脚本语言,具有即时编译和数千个有用的功能。
所有 API都是统一的:每个类,方法和常量都可以通过任何API访问。但是,特定于语言的差异很小。
要了解更多信息,请参见以下用法示例文章:
混合语言#
您可以只使用一种语言:如果要确保最高性能是关键因素,请使用C ++;对于最佳平衡,请使用C#。如果为C# (.NET),UNIGINE将提供集成到UnigineEditor中的 C#组件系统。对于具有复杂逻辑的复杂应用程序,此方法被认为是最方便并确保良好性能。
或者,对于项目的不同部分,您可以使用不同的编程语言(C ++,C#和UnigineScript):例如,您可以将C ++用于基类和性能消耗较高的操作。并在UnigineScript中实现一些简单的应用程序逻辑。您还可以在使用其他API时从一个API调用方法,并手动扩展API功能。
运行时逻辑#
每个基于UNIGINE的应用程序都有其生命周期,它由某些阶段组成,其中某些阶段执行一次,其他阶段每帧重复一次。简而言之,这些阶段如下:
UNIGINE具有三个主要逻辑组件,它们每个都有一组功能(名为 init(), update(), postUpdate()等),其中包含要在引擎工作周期的相应阶段执行的操作。这些组件是:
-
System Logic是在整个应用程序生命周期中运行的代码(即使在世界之间切换时,其范围也存在)。
-
World Logic是虚拟世界的逻辑。该逻辑仅在加载世界后才生效。
-
Editor Logic。如果您需要实现自己的编辑器,将使用此组件。 它有更多的实现方法,让您清楚地了解当前的引擎事件(节点已创建、属性已删除、材质已更改等)。
强烈建议您熟悉执行顺序以了解详细信息,包括多线程模式。
组件系统#
组件系统使您能够通过一组构件-组件来实现应用程序的逻辑,并将这些块分配给节点基本功能。您可以通过代码或UnigineEditor将组件添加到节点。
每个组件的逻辑在以下功能内实现:init(), update(), postUpdate()等。与主要逻辑组件一样,这些功能在引擎工作周期的相应阶段执行>。
仅当相应的节点和属性启用时,某个组件的逻辑才有效。因此,您可以在运行时在必要时启用/禁用每个特定组件的逻辑。
您可以将与不同组件相对应的几个属性分配给单个节点。可以在运行时更改组件逻辑的执行顺序以适应您的需求,从而为您提供了出色的灵活性和自由度,以实现您所想到的任何功能。
在UNIGINE中,组件系统有两种实现:
交叉口检测#
UNIGINE具有快速的 交叉点检测算法。它可用于射线投射,计算视线(LOS)或地势高度(HOT)等。
也可以在节点的边界体积和另一个具有指定大小的边界体积之间找到交点。
样本和演示#
UNIGINE提供了丰富的内置示例和 demo项目,涵盖了使用引擎的基本原理(使用内置节点进行操作,输出呈现, GUI设置等)。三种编程语言中的每一种都有不同的示例。所有示例均附带完整的源代码。要检查它们,请转到SDK browser -> Samples。
其中还包含一组扩展的 艺术样本 ,以方便您说明使用内容的各个方面:您可以学习如何使用 UNIGINE内置的在具有不同设置的对象中,设置 LOD 和材质,调整渲染设置,或使用植被。这些艺术品示例可以通过 UNIGINE SDK浏览器作为演示获得:转到Samples -> Demos并安装Art Samples演示。
如何优化项目的绩效?#
UNIGINE提供广泛的各种优化,以确保您的应用程序以最佳和最快的速度运行。但是为了启用它们,您应该做自己的工作:准备和设置项目内容时遵循建议,例如,使用 LOD ,位掩码和其他技术。
飞行员#
平滑的alpha混合细节级别(LOD)用于降低3D对象的几何复杂度,当这些对象远离相机时,可以减轻渲染器上的负担。
通常,LOD用于:
- 将网格的高多边形曲面切换为低多边形的曲面。
- 将具有复杂材质的曲面切换为具有简化的优化材质的曲面。
- 将多个高多边形曲面切换到单个简化的曲面。
- 将一种 node 类型切换为另一种类型(例如,将高多边形网格切换为广告牌,即始终面向摄像机的两个多边形对象)。
在LOD之间切换不仅取决于距相机的距离,还取决于距特定物体的距离。
UNIGINE提供了两种 LOD 切换机制:
- 禁用一个LOD,并在由两个值定义的指定 distance 启用另一个LOD:第一个LOD的最大可见距离(Max Visibility)和第二个LOD的最小可见距离(Min Visibility)。
- 以两个值定义的指定间隔将一个LOD平滑地淡入到另一个LOD:第一个LOD的最小淡入距离(Min Fade)和第一个LOD的最大淡入距离/第二个LOD的最小淡入距离(Max Fade )。
有关详细信息,请参见设置对象LODs文章。
位屏蔽#
位掩码定义两个实体是否相互影响。它可以用于:
- 渲染一些对象到视口,而不渲染其他对象。
- 将碰撞应用于某些物体,而不应用于其他物体。
- 为某些对象渲染阴影,而不为其他对象渲染。
- 对某些对象应用物理相互作用,而对另一些对象忽略。
位掩码 算法使用二进制运算符和比较两个节点中每个节点的32位掩码。如果蒙版匹配,则一个对象将影响另一对象;如果不这样做,对象将不会交互。
如果两个掩码具有至少一个匹配位,则掩码匹配。例如。以下两个掩码匹配,因为它们具有 4 个匹配位:
您可以通过观看以下教程来了解有关内容优化的更多信息:
现在,您准备开始使用UNIGINE。享受吧!