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....
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....
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....
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动画,随着运动方向更换动画,移动端常用...
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....
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....
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...
21年元旦,地下二号摄影棚油漆中毒,未作20年的较长记录。疫情首年,上半年在家闷头学着些什么,下半年便来了实验室。
2022元旦一则短微博 21年两个主要的工作: 上半年一直搞着,但逐渐发现能搞得越来越少的Virtual Production; 下半年就着Presentation的课程,继续前一年没太搞明白的Simulation。
一些杂七杂八的工作: 影院课及课程方案重编工作中,复习/新学了一些东西,Presentation部分新学了一点流媒体的知识; 科工委的技术展示片,早早开始筹备,制作却日常拖到了最后,明天要开始拍摄的部分; 零散地做了一些片子的后期/远程支持,以及极少量的现场工作,也算有一些二维影像的内容产出; 寒暑期照常补充了一些基础科学知识,后来也是不出所料派上了用场; 其他一些更零碎的就不提了。
从19年进入实验室以来,持续了一年多的“精力‘Wireless’”,终于在一个暑假没回家之后,逐渐被大三上课内外的任务压得喘不过气来。
今年只希望能得空做一些想做的工作罢,21年没学完的那些课等等。
注:本篇由同组同学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艺术家在制作时会收到来自其他部门的模型文件、跟踪数据、关键帧动画等信息,进行特效的制作。其中,每一个部门都有相应的组长,会对艺术家所制作的镜头进行评估和审核。全部制作完成的特效镜头,会经过各个监管的层层审核与反馈迭代,最后给到剪辑进行素材的回插。
注:本篇由同组同学LLY编写,本人代完成格式化
刚体 在物理学里,刚体是一种形变为0,或者形变可以忽略的固体。理想刚体在运动中和受到力的作用后,形状和大小不变,而且内部各点的相对位置不变。这种物体不可能实际存在,但固体通常可以假定为刚体。所以我们使用刚体来对固体进行模拟。在模拟时,我们通常使用Mesh来表示一个刚体。
刚体属性与表达 为了表示一个刚体,我们首先需要知道刚体的质心。在这里因为篇幅限制,我们不讨论质心是如何求得的,把质心当作已知量就可以了。质心有三维坐标 \(\mathbf x\) 和速度 \(\mathbf v\) 。其次,刚体还需要定向。选择一个相对刚体固定,原点在刚体质心的坐标系,称为局部坐标系。刚体及模拟的其他对象被放置在世界坐标系中。
质心 为了指定刚体在世界坐标系中的放置方式,我们指定其位置 \(\mathbf x\) 和 方向 \(R\) 。局部坐标为 \(\mathbf p_0\) 的点,世界坐标系下的坐标为:\(\mathbf p = \mathbf x + R \mathbf p_0\)
物体坐标系和世界坐标系 我们想知道这个点在世界坐标系中如何随时间变化,所以对时间进行求导,得出: $ = + R + p_0 $
因为在局部坐标系中 $ $ = 0 , 所以得出: $ = v + p_0 $
所以我们只需要求出每个时间的 \(\mathbf v\) 和 $ $ 就可以描述刚体随时间的运动状态了。
为了确定方向的变化率,需要引入角速度的概念。角速度通常表示为三维矢量。方向代表旋转轴,大小代表旋转的快慢,通常以弧度/秒为计量单位。
角速度 我们知道 \(R\) 的列是刚体坐标系的坐标轴的方向向量在世界坐标系下的坐标,因此, $ $ 由这些方向向量的导数组成: \[ \displaystyle\dot{R} = [\dot{\hat{u_x}}\quad\dot{\hat{u_y}}\quad\dot{\hat{u_z}} ] \] 于是 \(\dot{R}\) 就被简化成为求旋转矢量的导数的问题。旋转中心位置是 \(\mathbf x\) ,旋转点位置是 \(\mathbf p\) ,旋转中心到位置 \(\mathbf p\) 的向量为 \(r\) 。我们的目的是测定 \(r\) 的变化率。由于 \(\mathbf p\) 以角速度 \(\omega\) 旋转,所以其瞬时速度与 \(r\) 和 \(\omega\) 垂直。瞬时速度方向由 \(\omega\times r\) 表示,大小与向量积大小一致。于是我们可以得到: $ = r$...