3D世界和粒子系统

Yuri引擎可以工作在3D模式下,在此模式下,精灵被划分为四种类型:背景、立绘、前景、贴图。前三种类型由三个3D模型组Model3DGroup去包装这些精灵对象。每个模型组中包含了多个3D模型GeometryModel3D,它由三角形顶点集合MeshGeometry3D和漫射照明材质DiffuseMaterial构成。 贴图类型的精灵与2D模式下的贴图没有差异,直接作为2D对象展现在三个3D模型组的上面。

光源

Yuri引擎默认使用环境光AmbientLight来照亮3D世界,在这种光源下,所有的漫射材质都被会被无差别地照亮,不会产生阴影效果。如果要实现更复杂的光照效果,请修改引擎的3D舞台页Yuri.PageView.Stage3D中的相关XAML内容。

摄像机

Yuri引擎默认使用透视摄像机PerspectiveCamera来获得3D世界在游戏屏幕2D平面上的投影。如果要实现更复杂的镜头效果,请修改引擎的3D舞台页Yuri.PageView.Stage3D中的相关XAML内容。

3D世界精灵的显示

以立绘图片为例,前端管理器ViewManager是这样渲染3D世界中的精灵对象的:

  • 根据立绘要显示的屏幕分区位置,在3D世界中放置一个3D模型GeometryModel3D对象
  • 根据模型信息描述子,设置该3D模型对象的三角形顶点、渲染方向
  • 将精灵图片作为漫射材质对象DiffuseMaterial的图像画笔ImageBrush

3D世界中的其他元素

选择项、文本层和按钮在3D舞台上的表现与2D舞台上完全一致,其本质是在3D世界之上叠加2D画布,并将这些2D对象渲染到这些2D画布上。

3D场景镜头系统

3D场景镜头类SCamera3D为游戏提供真实3D景深效果的镜头移动动画,以实现更流畅的关于镜头的演出。3D场景镜头特效是真正意义上的镜头动作,它是摄像机在3D世界中的移动所产生的视觉效果,而不是模型的变换。
基于屏幕分区机制,3D场景镜头系统可以提供这些服务:

方法名 作用
Translate(int r, int c) 将镜头中心平移到指定的区块
FocusOn(int r, int c, double ratio, bool immediate) 以某个区块为焦点调整焦距
ResetFocus() 重置镜头将中央和焦点都对准屏幕中心并采用1.0的对焦比例
Focus(double ratio) 在镜头聚焦的区块上调整焦距
PreviewEnterScene() 布置场景结束并准备进入时调用此方法以准备动画
PostEnterScene() 进入场景并做默认拉长焦距效果
LeaveSceneToBlackFrame() 离开场景并切入黑场
ResumeBlackFrame() 直接从黑场中恢复

同时3D场景镜头系统可以提供一些辅助函数:

方法名 作用
GetScreenCoordination(int r, int c) 获取屏幕分区的中心坐标
GetScreenDistance(int rA, int cA, int rB, int cB, double scale) 获取指定焦距下屏幕分区之间的曼哈顿距离
SkipAll() 立即跳过所有动画
IsAnyAnimation 获取是否有动画正在进行

3D场景镜头系统的技术实现相比2D场景镜头系统要简单得多,它本质上是对摄像头的依赖项属性Position施加一个插值动画。由于背景、立绘、前景这三个模型组在3D世界中和透视摄像机的距离是不一样的,因此当摄像机移动时,它们自然地就会产生带有景深效果的反向移动视觉效果了。因此,场景镜头动画的平移动作就是在X-Y平面上反向移动摄像机,缩放动作就是在Z轴方向上移动摄像机。

3D粒子系统

目前仍在完善中。

程序集信息

Property Value
层次结构 Yuri.PlatformCore.Graphic3D.SCamera3D
最低版本 1.0
并行安全