• 游戏物理引擎+特效系统


    原文链接:游戏开发入门(六)游戏物理引擎_游戏开发物理引擎-CSDN博客

    游戏开发入门(七)特效系统_csdn 游戏效果开发-CSDN博客

    1.游戏应用物理的目的就是为了真实

    2.物理引擎:
    可以认为属于游戏引擎的一个构成部分,但是可以独立剥离开来。游戏中的物理模拟的计算都是通过物理引擎根据真实世界物理定律来计算与实现的。市面上主流的物理引擎现在有两款,Havok与PhysX,其他的还有Open Dynamics Engine,Newton Game Dynamics,Tokamak Game Physics

    3.物理引擎带来的表现上的优势

    • a.增加动画表现的丰富性,减少美术的工作量(柔体物理)
    • b.增加游戏的真实性
    • c.快速模拟各种现实中常见的情形(如秋千,用代码现写一个成本高的离谱)
    • d.减少逻辑代码的工作量(比如正常情况下,玩家遇到障碍会停止,在物理世界这是很自然的,但是在非物理世界却很难处理)

    4.如何赋予游戏对象物理?
    给游戏模型创建一个物理包围盒,该包围盒与模型始终保持位置一致,物理引擎作用与该物理包围盒,进而就能影响整个游戏对象了。

    5.物理类型与应用

    • a.刚体物理 刚体是指在运动中和受力作用后,形状和大小不变,而且内部各点的相对位置不变的物体。在游戏中,刚体物理的应用最为广泛。常见的地形,建筑,玩家等基本上都赋予的是刚体物理,游戏中的弓箭,实体子弹也都是通过物理引擎来模拟计算的。其中涉及到速度、加速度、力旋转、动量、摩擦、冲量等
    • b.破碎物理 一个对象受到一定力会破碎,理论上破碎效果可以通过动画师来制作动画,但是想根据不同力的大小产生不同的表现效果,那动画的工作量就显得过于繁重,破碎物理可以完美的解决这个问题。
    • c.粒子物理 游戏中的烟尘,雪花,雨水等,这些粒子在很多游戏中并没有添加物理(因为开销比较大),不过添加物理后可以很方便的处理很多问题,比如雨水穿过房顶的问题
    • d.流体物理 游戏中的瀑布,一些河流等。我们常见的海水一般并不是使用流体物理来做的,因为使用UV动画来处理可以极大的减少运算开销,而且现在的贴图效果表现也很不错

    6.物理引擎的起源与应用
    军事战争,其实这个很容易理解,国外的有些战争题材的游戏稍加修改就可以被用来模拟训练。既然物理引擎的目的就是仿真,那么他的仿真程度越高,其可以应用的场景就越多。

    7.游戏中常见的物理现象

    • a.重力,浮力 虽然这是现实世界中最常见的现象,但是很多游戏中并没有通过物理引擎去模拟重力,而是采用相对简单的逻辑代码模拟
    • b.碰撞 碰撞是最为常见的现象,任何角色在移动过程中碰到障碍都要停止移动,或者互相给力产生位移
    • c.变形 包括布料,头发等容易产生形变的物体
    • d.流体移动 液体的模拟 目前来看一般只有大型游戏或者有特殊需求的游戏才会使用,开销比较大
    • e.破碎 事先对物体进行破碎处理,将其模型与物理绑定拆分成多个碎片,受力后分散
    • f.受物理约束的移动 考虑到摩天轮、钟摆、秋千等在现实世界中受约束的模拟,我们可以对这些物体做特殊处理,这种处理就是物理约束

    8.Unity中的物理引擎(与Unreal相同)
    NVIDIA的PhysX引擎
    Unity中物理是以组件的形式存在的,把组件赋予一个OBject就可以赋予其对应的特性。
    物理组件大概分为6种:RigidBody刚体,Colider碰撞盒,Joint约束关节(前三个是刚体组件),Cloth布料(柔体组件),constant force恒力,CharacterController角色控制器

    9.关于刚体物理常见的应用

    • a.给各个对象添加碰撞实体(球形SphereCollider,长方体BoxCollider,胶囊体CapsuleCollider,轮子WheelCollider,三角网格MeshCollider,地形TerrainCollider),根据这些碰撞实体去进行物理模拟运算
    • b.设置各种铰链约束(joint)
    • c.Ragdoll布娃娃系统 一般针对玩家角色,用来模拟死亡后效果
    • d.碰撞筛选 可以选择特定标记的碰撞盒之间相互碰撞,不标记就不会产生碰撞

    10.关于刚体与碰撞盒的关系
    刚体是赋予物体物理属性的实体(质量,重力,摩擦系数等),而碰撞盒是用来模拟物理之间产生碰撞以及碰撞结果的只有刚体没有碰撞盒,就会互相穿过。只有碰撞盒没有刚体,那么碰撞的力无法正确计算,也没有意义

    11.Trigger
    触发器是游戏中经常用到的一个技术,简单来说就是设定一个区域,玩家或者NPC进去该区域触发某个事件

    12.关于Joint的理解
    在Unity里面叫做关节(铰链),一般在物理引擎中其实现原理就是物理约束。本质上就是给其6个自由度中的某几个自由度做限制,比如该物体只能在XoY平面移动。在Unity里面提供了默认的几个常用的关节类型(unreal中需要自己配置约束),可以方便的实现诸如弹簧、钟摆等效果。

    13.物理材质
    物理材质就是模拟现实中物体的材质,他的主要功能有两个,第一个是表示当前碰撞体的物理表面类型,进而可以根据类型去做特殊处理,第二个是配置摩擦力等参数,可以模拟现实中不同材质物体运动碰撞的效果。

    14.Character controller
    他在Unity中的概念与unreal等其他引擎的差距很大。Unity中是指一个只受玩家作用,而不受其他碰撞体影响的一个偏物理概念。unreal中单纯是指一个控制玩家角色的控制器。

    15.布料系统的实现原理

    a.弹簧系统 一般采用的是弹簧—质点模型
    https://www.cnblogs.com/shushen/p/5473264.html
    http://blog.csdn.net/silangquan/article/details/15746855
    b.Long Range Attachment 个人感觉这一点不算什么技术原理,理解弹簧质点模型就可以了
    c.碰撞检测 布料是由多个顶点构成的,为了保证不会穿模,需要保证每一个点都能产生正确的碰撞
    d.动画融合 如果物理模拟的结果不是很理想,可以让美术手动做一个动画,然后按照一定权重相结合。
    e.风扰动 类似植物,可以主动添加一个风扰动来模拟布料飘动的效果
    f.重力和阻尼 阻尼越大,其飘动所需要的力就越大

    1.什么是特效?
    在我工作的环境内,特效基本上就是指粒子特效。但更通用的定义应该是指为了体现出游戏中的某些特殊效果增加一些在现实中不常见的表现。这些表现包括但不限制于场景光影特效,UI表现特效,技能特效,雨水,沙尘等等。

    2.特效在项目使用中的问题
    没有一个完善,通用的特效系统,导致每个项目在运行时都需要手动重新搭建一个适合自己项目的类似系统,或者完全不构建系统,进而造成开发效率的降低。然而对于当前市面上的大部分游戏,特效的应用极为广泛,构建一个特效系统确实是有意义的。特效系统的定义不确定性以及难以抽象的特点,也是导致没有出现特效系统的原因之一。

    3.如何抽象一个特效系统的功能?

    a.分析实际项目中的“特效”有哪些?

    • UI特效(在某些情况下与材质特效是相同的)
    • 粒子特效(动作,技能,附魔等) 材质特效(角色颜色变化等)
    • 后处理(景深,光晕等,课程前面没有这方面内容,不过后面在系统设计的时候提到了镜头管理,镜头管理一般包含摄像机处理与后处理)

    b.这些“特效对游戏的作用”是什么?

    • 强化反馈(UI新手引导特效)
    • 增强视觉表现(技能表现)
    • 特殊效果表现(boss不同阶段的形态与颜色,植被燃烧消失,景深效果)

    c.这些“特效”用到的资源是什么形式?(格式因引擎而异)

    • 图片
    • shader文件(一般来说,现在引擎里面的所有渲染内容都与shader有关,因为考虑到有一些传统游戏框架这里把shader单独拿出来作为一种形式)
    • 粒子文件
    • 集成于引擎中,没有单独的文件(拖尾渲染,后处理)

    d.分析共同点

    • 纯表现
    • 从开始到结束一般没有交互,不接收输入
    • 随时间产生变化

    e.总结
    多种表现效果在同一个固定时间区间内的非线性排列

    • 固定时间轴动画驱动
    • 支持多样化的表现效果元素混合编辑功能
    • 提供对多种表现效果元素在同一时间轴内的非线性排列功能

    4.一般UI特效的实现方式

    • 逐帧动画(N张图片循环播放,资源多,占空间大)
    • UV动画

    5.一般技能特效(如刀光)的实现

    • Mesh面片+ UV动画(需要先生成一个透明的面片)
    • Trail拖尾特效(引擎提供,不需要实时生成Mesh网格)
    • Particle粒子特效(粒子消耗一般来说比较高)

    6.灵魂吸附的效果实现
    Particle粒子,每帧更新其位置

    7.走路时灰尘的实现
    一般在引擎的动画编辑界面里都可以在动作的某一帧直接添加粒子效果(或者其他事件通知),在该位置添加制作好的灰尘效果调整位置偏移即可。如果想与身体位置保存一致,还需要将其绑定到固定的骨骼关节上

    8.一个简单的无抽象的特效系统与一个复杂特效系统的比较
    由于项目开发周期与成本的原因,我们要根据情况来判断是否需要构建一个复杂的系统
    简单:

    • 固定时间轴动画驱动
    • 实现方式:放弃该功能,直接以某个固定事件的开始作为起始时间(很多游戏里都是这么做的)
    • 支持多样化的表现效果元素混合编辑功能
    • 实现方式:不提供统一功能,直接使用表现效果元素本身的编辑环境制作
    • 提供对多种表现效果元素在同一时间轴内的非线性排列功能
    • 实现方式:通过配置表,直接配置各表现元素相对1中的固定开始时间

    简单无抽象的特效系统问题:

    • 每次添加新的玩法时,都需要加入新的固定事件去驱动,同时处理相关逻辑
    • 各中特效是分开的,不方便管理,同时需要在多个小工具之间来回切换
    • 配置内容随着项目的进行不断添加,造成修改成本增加,同时有些配置还需要到特定的游戏环境里面测试

    复杂:

    固定时间轴动画驱动
    实现方法:提供统一的基于时间轴的特效控制系统,抽象化每一个驱动元素(类似一个视频剪辑软件的效果, 所谓的驱动元素就是经过封装一个可管理的特效片段,可以直接处理引擎中相关联的特效元素)
    支持多样化的表现效果元素混合编辑功能
    实现方法:单独提供每一种表现元素的驱动元素,归纳到特效控制系统统一管理(类别视频中的视频轨道和音频轨道,多种轨道可以各自处理各自的内容)
    提供对多种表现效果元素在同一时间轴内的非线性排列功能
    实现方法:提供驱动元素在特效控制系统中的非线性编辑功能(非线性就是指随着时间变化不是线性的,可以先快后面的这种效果)
    所见即所得的编辑环境
    实现方法:提供基于UI的编辑环境
    多种不同表现元素的整体预览
    实现方法:UI编辑环境下可以拉起所有的可视化元素的基础系统(比如正常引擎编辑后可以立刻看到修改后的粒子效果,你需要让这个效果立刻显示到你的特效系统里面)
    迅速快捷的修改反馈
    实现方法:所有表现元素参数支持序列化方案,驱动元素支持实时修改反馈
    提供较为统一的基础编辑环境
    实现方法:驱动元素接口统一化设计。(方便从一个引擎移植到另一个引擎)
    9.判断一个游戏系统设计的好坏因素

    • a.系统负荷的大小(会不会因为过于复杂而造成过多的额外成本)
    • b.是否方便多人开发
    • c.是否方便测试
    • d.要方便特定的使用人群使用

    10.关于编程的一点小经验
    不要做过多的设计,因为你的代码总有可以优化的地方,实际情况下实践的测试反馈往往比纯构思要好的多

    11.关于序列化
    序列化功能是将对类象以字节流的形式输出,游戏中的存档功能几乎都是使用序列化去做的。

    12.与特效系统紧密相关的内容
    视频中前面分析了特效系统,但是实际上他的特效系统不仅仅包含特效,还有镜头管理与音效管理两个内容。
    其实授课者师将游戏中基本的表现内容都整合到其特效系统里面了,可能是因为镜头,音效都与特效紧密联系,如果拆分开来势必导致表现不匹配,操作复杂等各种问题。

    13.一个合格的系统公交应该有的功能

    • a.代码编辑
    • b.可视化资源编辑窗口
    • c.提供大量的表现效果功能
    • d.提供了整套编辑元素序列化方案
    • e.提供资源管理方案
    • d.同意的构建流程
    • f.可预览的运行环境

  • 相关阅读:
    达梦数据库启动与停止
    解决ubuntu开机变慢;删除耗时启动项
    AI 悄然变天:这家平台为何能俘获众多明星大模型「芳心」?
    SSM+JSP实现《吃货联盟外卖系统》
    修剪二叉搜索树
    口感鲜美的健康饮品,随时补充营养恢复活力,厘盏蛋白银耳燕窝体验
    基于 SpringBoot + MyBatis 的网页版五子棋对战
    技术管理进阶——如何面试
    硬之城携手阿里云 Serverless 应用引擎(SAE)打造低代码平台
    (一)devops持续集成开发——jenkins安装及基本使用
  • 原文地址:https://blog.csdn.net/zaizai1007/article/details/136189560