2022-10-22-GAMES104现代游戏引擎-Lecture15-Gameplay Complexity and Building Blocks

Lecture15 Gameplay Complexity and Building Blocks Overview Gameplay的挑战 多个系统之间的合作 同一个游戏中Gameplay的多样性 快速迭代 Event Mechanism Hard Code写在函数中:无数的if/else、非常难以修改 Event/Message Mechanism:GO之间的“通讯协议” Publish-subscribe Pattern 发行-订阅设计模式 Event Definition 信息的定义 方法1:Event作为类设计 -> 不适合交给设计师修改 方法2:允许定义任意的Event 再通过代码渲染系统编译,但每次修改都需要重新编译过于麻烦 在引擎核心代码之外定义 dll注入 用脚本层语言实现 Callback Registration 响应注册 注册和调用不在同一处 –> 对象的生命周期和回调函数安全性问题 Strong Reference 强引用:引用关系绑定 Weak Reference 弱引用:引用关系弱,可手动进行逻辑判断,使用较多 Event Dispatching 信息分发 遍历每个GO,逐个分发调用函数 —— 效率过低 Immediate:发送消息立即调用函数 会打断前一任务,等待Callback执行后再继续 单次打断引发连锁Callback,易导致Callstack非常深,难以Debug 难以并行 Event Queue 把Event存储至队列,依次执行 Event Queue的序列化和反序列化 实现:利用反射,获取每个对象的描述结构 存储结构:Ring Buffer 不用重复申请新内存 Batching,将多个独立系统分开处理 问题: 无法保证多个系统间的执行顺序 => 保留一定的Immediate处理能力 同时具备Pre、Post、Immediate处理方式 有系统延迟,削弱动作游戏打击感 => 经常Hardcode绕过Delay Script System Game Logic 直接在游戏引擎代码内,使用编译语言编写 (C/C++) 每次修改Gameplay,需要重新编译游戏引擎 极难支持热更新 对设计师极不友好 脚本语言 Script System 支持快速迭代 易于学习、编写 支持热更新 沙盒运行,稳定、更少Crash 如何运行 基于虚拟机 Script Text -> [Compiler] -> Bytecode [Virtual Machine] 速度略慢 如何管理GO 强调效率:引擎内核管理,脚本触发引擎执行 编写难度大 执行过程非常复杂 直接交给脚本系统管理 脚本如何处理GO的生命周期:GC, Garbage Collection 优势:不需要手动管理对象生命周期,自动处理 问题:每次需要扫描内存,处理效率低 对于玩法相对简单的单机游戏,大多交给引擎管理; MMORPG等玩法非常复杂的游戏,大多脚本系统管理 架构 引擎调用脚本 eg....

2022-07-03-GAMES104现代游戏引擎-Lecture14-Tool Chains Applications & Advanced Topic

Lecture14 Tool Chains Applications & Advanced Topic Architecture of A World Editor A hub for everything to build the world Editor Viewport 运行一个完整游戏,“Editor Mode” 代码存在Editor Only -> 避免编译到最终游戏中 Everything is an Editable Object Objects Views Tree View Layer View Categories and groups 通过Schema系统编辑Object参数,参数编辑面板 Content Browser Editing Utilities in World Editor 鼠标选取 Ray casting 不需要缓存,支持同时选取多个物体 遍历性能差 RTT 在G-Buffer中存储Object ID 根据点击像素直接对应Object ID 其他Trick来选取无Mesh的Object Object Transform Editing Terrain Heightmap Texture 植被、水体等 Brush Height Brush 笔刷边缘的过渡、笔刷的可拓展性 Instance Brush eg....

2022-06-26-GAMES104现代游戏引擎-Lecture13-Tool Chains

Lecture13 Tool Chains 游戏引擎工具链的地位: 用户和引擎Runtime层的桥梁 引擎和DCC软件的桥梁:Asset Conditioning Pipeline 调和不同思维方式的平台:策划 / 美术 / 程序 GUI Immediate Mode 逐帧直接绘制,由引擎逻辑绘制,简单轻量直接 扩展性有限,性能有限,将业务压力交给了引擎逻辑 eg. Unity UGUI / Omniverse GUI / Piccolo GUI Retained Mode 将需要绘制的图形内容存储成Buffer,再交由GUI绘制 将引擎逻辑和GUI工具隔离,扩展性强,性能表现好 对开发者来说相对复杂 eg. Unreal UMG / WPF GUI / QT GUI Design Pattern MVC MVP:在MVC基础上的变化,View进一步与Model分离 MVVM:把Presenter换成ViewModel——用Binding将ViewModel和View绑定,用HTML/XAML等简单逻辑表示View 平台兼容性问题,eg. 在Windows下WPF表现较好 数据处理 Serialization and Deserialization 序列化与反序列化:文件、数据库、内存、网络之间的数据转换 存储数据 - Serialization 文件格式 最简单的数据格式:文本文件 易读易处理,但缺乏安全性 纯文本信息 eg. txt/obj/… -> 结构化 eg. XML/… -> 更简单的结构 eg. json/… eg....

2022-06-18-GAMES104现代游戏引擎-Lecture12-Effects

Lecture12 Effects Particle 一个粒子 @PBA 粒子形态 Billboard Particle 永远朝向相机的面片 Mesh Particle eg. 碎石 Ribbon Particle 光带 eg. 刀的尾迹 样条插值,一般用Catmull 粒子渲染 透明混合顺序 全局排序 精确但开销大 层级结构 系统 -> Emitter -> Within emitter 分辨率,性能开销爆炸 Low-Resolution Particles 低分辨率渲染粒子,再与普通画面混合 GPU粒子 定义Particle Pool 管理Dead list和Alive list 在Compute Shader上计算 Visualization Culling,管理Alive list Depth Buffer Sorting GPU并行Merge sort 双指针合并排序,读写会跳来跳去 优化:单指针遍历待写位置,找该写入的数值写入 Depth Buffer Collision 利用Depth Buffer做碰撞 Advanced Particle Animated Particle Mesh 动画可以编码成Texture:Particle Animation Texture 状态机可以通过切换贴图实现 Navigation Texture 从SDF计算Direction Texture(RG通道贴图) 实现群集运动的运动方向 eg....

2022-06-04-GAMES104现代游戏引擎-Lecture11-Physics System - Applications

Lecture11 Physics System - Applications Character Controller 一个反物理的系统:符合玩家感知 + 实现反物理运动 没有Character Controller时,大量Hack Kinematic Actor 不受物理规律控制 Push其他Actor Shape (人类角色时) Capsule 主要使用,一般设计两层 内层:碰撞 外层:防止角色与物体(墙面)太近 高速移动时容易卡进墙体 相机穿透导致看到墙后物体 Box Convex Collide with environment Sweep Test 判断 Sliding:撞到墙上时左右滑动 Auto Stepping:台阶 每帧尝试抬升高度前进 Slope 斜坡 坡度大于多少时,冲上去会滑下来 改变Controller形状/体积 eg.蹲下站起的变化 限制在环境大小不够时不可站起(eg.在隧道中) 更新前重叠测试,阻止形状更新 Push Objects (Dynamic Actors) Controller站在运动平台上时 不作处理就会平台动、Controller在原地 Ray Cast检测所站物体上,绑定,运动时也相对于平台 进一步精细:平台运动过快时的趔趄等 Ragdoll 不适用Ragdoll:播放死亡动画 => 死亡环境并不一定与动画一致 eg. 在悬崖边,悬空挂在坡面上甚至插入地形 用Rigid Body将关键的Joint连结起来 考虑Constraints 将Ragdoll中较少Joints的运动映射到Skeleton Animation Retargeting 三种Joints Active Joints:与Ragdoll相同的Joints,直接使用Ragdoll数据 Leaf Joints:一般不动,例如手掌脚掌 Intermediate Joints:Active Joints之间的Joints,利用邻近Active Joints插值 死亡动画到Ragdoll的过渡 一个问题:游戏中动画与物理的边界在哪里? Powered Ragdoll - Physics-Animation Blending 纯Ragdoll:效果不像人类 纯动画:循环播放,有模式感 两种混合 Cloth 传统:Bake动画,随着运动方向更换动画,移动端常用...

2022-05-25-GAMES104现代游戏引擎-Lecture10-Physics System - Basic Concepts

Lecture10 Physics System - Basic Concepts 物理的作用: + 物理直觉 + 动态环境,《彩六》破坏环境 + 环境交互,VR等《Alyx》 + 艺术效果,粒子、流体、布料 Physics Actors and Shapes Actor Static Actor 静态固定的,不受物理影响 Dynamic Actor 按照动力学原理运动的,受力/动量/冲量驱动 Trigger 根据碰撞触发Message从而产生Event Kinematic 反物理的自发运动(游戏设计师设计的运动) > Kinematic与受物理约束的Actor碰撞时,可能会产生“飞掉” Shape : 复杂形状物理计算过于复杂 Sphere Capsule 胶囊体 Box Convex Mesh 凸多面体 Trangle Mesh (一般只用于静态) Height Field !尽量使用简单的Shape(从前到后越来越复杂) Shape Properties Mass / Density 质量 / 密度 Center of Mass 质心 Friction / Restitution 摩擦力 / 弹力 (and more …) Forces Force eg....

2022-05-19-GAMES104现代游戏引擎-Lecture9-Animation System - Advanced

Lecture09 Animation System - Advanced Animation Blending LERP LERP / NLERP / SLERP 两个动画clip之间的LERP 权重 eg. 走路与跑步动画,依据运动速度切换 \[ {\rm weight_1=\dfrac{speed_{current}-speed_2}{speed_1-speed_2}}\\ {\rm weight_2=\dfrac{speed_{current}-speed_1}{speed_2-speed_1}}\\ \] 对齐时间线 eg.走路和跑步的步频不同,怎样对齐混合的帧 每一段动画为一步,对每一段动画时间线做归一化 Blend Space eg. 左右前后走/跑 1D Blend Space: eg. 左走、正走、右走三个动画,根据左右方向的速度插值(可以有分布不均匀的多个动画) 2D Blend Space: eg. 左右前后全部加入2D空间,由动画师指定动画位置 双线性插值 Delaunay Triangulation 常用 根据设置的动画点,生成三角形划分 在空间内一点,由周围三角形插值 插值利用重心坐标 Skeleton Masked Blending 针对只应用于半身或身体局部的动画,实现多种动画的混合 eg.各种姿态下的鼓掌 绘制一个Mask,只应用于部分Joints Additive Blending eg. 向着摄影机点头 存储动画的变化量,在基础动画上叠加一层动画 需要非常谨慎,易出现两个动画叠加后产生不自然的运动结果 Animation State Machine 状态机 两种核心元素 Node Clip Blend Space 脚本串接的单套动画系统 Translation 激活条件 Cross Fade Smooth transition 慢慢过渡,插值(各种插值曲线) Frozen transition 先停住动画A,再播放动画B 多层状态机 Animation Blend Tree 多层状态机在复杂动画中非常复杂 用树结构表示动画之间的Blend方式(LERP/Additive),类似表达式树 两种节点 Terminal Node 执行节点 (叶节点) Clip Blend Space ASM Non-terminal Node (非叶节点) LERP Blend Node Additive Blend Node Layered ASM to Blend Tree Blend Tree Control Parameters Variable 暴露变量,根据变量切换运动状态 eg....

2022-05-13-GAMES104现代游戏引擎-Lecture8-Animation System - Basics

Lecture08 Animation System - Basics 挑战: 不能预设玩家的行为,考虑动画与Gameplay的互动,与环境的交互 实时,计算和存储开销 真实感(表情、Ragdoll、Motion Matching …) 2D Animation Sprite Animation 逐帧绘制,循环播放 Sprite-like animation technique in pseudo-3D game 《Doom》 绘制各个视角的sprite,做伪3D Sprite Animation in Modern Game Live2D 把角色/主体的每个元素作为独立图元 eg.眼睛、鼻子、嘴巴 仿射变换 图元的前后遮挡由深度决定 每一个图元有控制网格 Key frame 2D Skinned Animation 2D蒙皮动画 3D Animation DoF, Degrees of Freedom 自由度 6DoF + Translation X Y Z + Rotation Pan/Yaw Tilt/Pitch Roll Rigid Hierarchical Animation 基于刚体的层次结构动画 “皮影戏” 直接连接Mesh,会导致Mesh互相产生穿插 Per-vertex Animation 旗帜、布料、流体等(从物理烘焙而来的顶点动画实现) VAT, Virtual Animation Texture:用贴图存储顶点 Morph Target Animation 顶点动画的变种 顶点带有权重,邻近顶点相互影响 3D Skinned Animation 2D蒙皮动画 (见下章) Physics-based Animation Ragdoll 布料和流体 IK, Inverse kinematics 反向动力学 Animation 创作方式 Key frame 动作捕捉 Skinned Animation Implementation 怎样将Mesh运动起来 创建一个绑定姿态的Mesh 创建绑定骨骼Skeleton 刷定点权重(蒙皮) 骨骼动画 顶点按骨骼动画和蒙皮权重运动 Different Spaces...

2022元旦一则短微博(My 2020 & 2021)

21年元旦,地下二号摄影棚油漆中毒,未作20年的较长记录。疫情首年,上半年在家闷头学着些什么,下半年便来了实验室。 2022元旦一则短微博 21年两个主要的工作: 上半年一直搞着,但逐渐发现能搞得越来越少的Virtual Production; 下半年就着Presentation的课程,继续前一年没太搞明白的Simulation。 一些杂七杂八的工作: 影院课及课程方案重编工作中,复习/新学了一些东西,Presentation部分新学了一点流媒体的知识; 科工委的技术展示片,早早开始筹备,制作却日常拖到了最后,明天要开始拍摄的部分; 零散地做了一些片子的后期/远程支持,以及极少量的现场工作,也算有一些二维影像的内容产出; 寒暑期照常补充了一些基础科学知识,后来也是不出所料派上了用场; 其他一些更零碎的就不提了。 从19年进入实验室以来,持续了一年多的“精力‘Wireless’”,终于在一个暑假没回家之后,逐渐被大三上课内外的任务压得喘不过气来。 今年只希望能得空做一些想做的工作罢,21年没学完的那些课等等。

2021-12-25-影片技术分析Pre-基于物理的动画-影视制作中的FX流程-byLLY

注:本篇由同组同学LLY编写,本人代完成格式化 电影制作流程中的物理模拟 视效制作流程 在了解物理模拟在视效中的流程之前,我们需要先了解一下整个视效制作的大框架。 FXPipeline 特效(FX)部门简述 动力学和模拟技术是数字特效的核心组成部分。从广义上讲,它们试图在数字领域复制真实世界的物理特征,这样就可以通过让软件计算适当的结果而不需要关键帧动画来实现真实的行为和交互。 这可能是因为实际拍摄的话,成本过高(可能需要多个模型来允许重新拍摄),无法提供所需的可控性与可指导性,或者新一代监管人员对数字技术比传统的实际效果更满意。不管是什么原因,自20世纪90年代初以来,实际效果越来越被数字所取代,以至于模拟物体、流体和火的复杂相互作用现在已司空见惯。Dante的Peak(1997)使用简单的粒子系统对模型和微缩模型进行数字增强,同时使用真实拍摄,2012(2009)模拟了整个数字城市的大规模破坏。 虽然模拟技术通常与毁灭和混乱联系在一起,包括破裂和变形物体、爆炸、火灾、烟雾和液体,但它们也被用来给角色穿衣服、造型和移动头发,以及移动皮肤下的肌肉。可以预期,通过模拟比通过关键帧更容易实现真实的复杂交互。 3D动画中特效的种类 毛发模拟 Hair and Fur Simulation 模拟系统创建头发或毛发的模拟,不仅对环境因素作出反应,还对其附着角色头部或身体的运动作出反应。这是一个极其复杂的模拟,除了高预算项目以外,通常没有条件获取这样的资源。 刚体&柔体模拟 Body Simulation 包括刚体模拟和柔体模拟。刚体用于模拟木材、石头、玻璃,或者其他形变不大的物体。刚体模拟处理的是物体间的相互作用、碰撞、破碎等效果。柔体模拟包括模拟刚性较低的材料,如布料、皮肤、土壤、身体组织等其他任何可能弯曲、扭曲活波动的材料。 流体模拟 Fluid Simulation 流体模拟不仅包括水或液体,还包括气体、凝胶,或任何其他流体运动的物质。包括浓雾、明胶、燕麦等其他类似的物质。流体模拟器通常基于真实世界流体物理中涉及的方程进行计算。 粒子模拟 Particle Simulation 粒子模拟器在空间中创建点,这些点具有分散的特征,如雨、烟、灰尘、群集、人群、前进的军队、飞溅的火花等等。艺术家将行为和视觉属性指定给粒子,使其外观和移动与艺术家想要的一样。与其他类型模拟相同,艺术家定义了基于物理的参数,如重力、风力等,粒子会做出相应的反应,创造出令人惊讶的逼真的效果,如暴风雪、迁徙的蜜蜂、攻击的鸟类,或者任何所需要的效果。 我们今天主要从粒子、刚体、流体三个方面来讲,基本上从原理上涵盖了上述所有类型物体的模拟。 FX部门流程与分工 RnD:Research and Development 研发部门。负责创新研发解决棘手问题的新方案,不断发展现有的能力。根据画面需求,对学术界现有的算法进行调研,寻找、整合可用于生产的解决方案。 TD:Techinal Director 技术指导。TD是科学家与艺术家之间的桥梁,将研发部门开发的算法编写成艺术家能够上手使用的工具。他们使爆炸、浓烟、激流等效果更加容易使用。FX TD构建和测试工具,然后将其整合到VFX工作流程的制作pipeline当中。所有TD都是问题解决者。每个项目都有其复杂的地方,他们确保效果一致并且令人信服。 FX Artist FX 艺术家。艺术家们使用TD创建出来的工具,通过自身的艺术造诣和导演的要求,为单个镜头创建效果。他们是视觉效果的生产者。 FX 工作流程 因为今天演讲的主题是模拟相关,所以我们关注的FX部门的流程将不涉及到特效评估、数据统计、特效整理、测试、预演等细化工作。 FX部门流程 首先,导演提出视效需求给视效总监,由视效总监判断现阶段视效能否实现。若不能实现,则交给RnD部门研发该效果,并准备可行备用方案。若可以实现,则将其交给视效制片规划制作方案。当RnD研发好算法后,将算法交给TD。TD询问艺术家的工作习惯、预期希望可以调整的方面等需求,编程、制作成实现容易,并为艺术家暴露出可修改的参数。在制作阶段,视效制片将相应的特效镜头派发给FX部门,相应的镜头将被派发给不同的FX艺术家。FX艺术家在制作时会收到来自其他部门的模型文件、跟踪数据、关键帧动画等信息,进行特效的制作。其中,每一个部门都有相应的组长,会对艺术家所制作的镜头进行评估和审核。全部制作完成的特效镜头,会经过各个监管的层层审核与反馈迭代,最后给到剪辑进行素材的回插。