过去的评论:
背景:
作为一名游戏开发从业人员,从业务到语言再到框架再到引擎,它都积累了一些技术和经验。引擎和操作系统是我们游戏开发的基本技术和基本依赖性。同时,经过多年使用引擎长时间,他们已经知道了发动机的优势和缺陷。这次,我想对引擎进行彻底的分析。
近年来,它一直在进行与性能优化相关的工作,以及 - 深度发动机技术,尤其是核心部分。这次,我将“游戏引擎架构”系列与书理论和我自己的实践经验相结合。分析引擎并同时查看知识,以帮助自己更深入地了解引擎技术。在文章中游戏引擎架构,我将从系统的角度分析游戏引擎。结构,结构,过程和算法的分析,以及通过自制动机的情况,以完成对发动机技术的深入分析。
概述:
本系列文章分析了引擎中的重要模块和库。我选择了15个库和模块来分析:
1。时间库
2。自定义容器库
3。弦骨架散射库
4。内存管理框架
5。RTTI和反射模块
6。图形计算库
7。资产管理模块
8。低水平渲染设备
9。删除和批处理模块
10。动画模块
11。物理模块
12。UI基础框架
13。绩效分析师的核心部分
14。脚本系统
15。视觉效果模块
此内容是列表中的第10部分。
内容
骨骼动画技术已经开发了很长时间。从框架动画到刚性动画,到网格动画,到顶点动画,再到骨动画,然后是IK动画,然后再到织物动画。动画革命还促成了主要发动机上的许多框架。
这次,我们主要谈论了引擎动画中的骨骼动画和网格动画。尽管他们两个都深入算法,但它们非常实用和可变。
骨原理
骨骼可以简单地理解为树节点。它类似于我们放置在现场的GameObject或演员节点。
您可以将骨骼节点视为多fork树,但是可以将更多的图像表示被视为场景中的节点序列,如下所示:
Root
Pelvis
MiddleSpine(脊柱中部)
UpperSpine
...
...
RightThigh
RightKnee(右膝)
...
LeftThigh
LeftKnee(左膝)
...
节点的顶部是根节点,它是所有骨骼的根节点。每个子节点代表人体或生物的关节。当父关节移动或旋转时,子节点会移动。
(骨头节和皮肤 - 网状图)
(动画的骨骼变化逐帧框架)
骨头母体节点驱动子节点旋转偏置。每个骨骼动画框架中的每一个骨头移动都要求仔细抛光动画师,以表现出更加自然和逼真的作用。
(TQS矩阵图)
每个骨头都有自己的本地姿势。它由位移,旋转和缩放组成。它通常称为TQS(trans,Quaternion,比例)。
在数学中,联合姿势是模仿变换。 PJ使用PJ表示关节J的模仿转换。它是一个4×4矩阵,由过渡向量TJ,旋转矩阵RJ和对角线缩放矩阵SJ组成。
在发动机中,4x4矩阵不代表TQ,而是使用float3 t。 float4 q; float3 s;三个变量形成对象以表示本地姿势。
以下是两个概念,当地的姿势和全球姿势:
局部姿势意味着每个骨节点都有自己的空间转换TQ
全局姿势意味着每个骨骼节点和父节点形成世界空间转换TQS
(地方姿势和全球姿势)
当骨骼节点更改时,将会发生相应的TQS更改。同时,局部变化矩阵必须在计算皮肤之前计算全局变化矩阵。这样,可以执行下一步。
将本地空间中的Q点转换为Q'点的计算公式:
GlobalTransform = TQS1 * TQS2 * TQS3
OffsetTransform = (TQS1 * TQS2 * TQS3)逆
q` = GlobalTransform * q
q = OffsetTransform * q`
本地姿势TQS被计算为全球姿势,并以全球姿势将本地空间的Q点转换为世界空间的Q点。
可以理解的是,骨骼的局部空间中的点必须转换为世界空间,并且必须将其从子矩阵乘以到父矩阵。
(果皮顶点转换和空间转换的显着图)
这只是将点从当地空间转换为世界空间的实践。动画中的每个骨骼节点都在变化,因此必须计算每个框架以计算皮肤的头部。
皮肤最高点是世界空间。当计算世界空间的顶点时,当它根据骨头的变化而变化时音乐,它必须首先将其从世界坐标空间转换为骨骼的局部坐标空间,然后从本地空间进行计算世界空间的坐标,因此该公式有两个步骤
FinialTransform = GlobalTransformChange * OffsetTransform;
Vertex` = FinialTransform * Vertex
第一步是通过全球姿势的偏移矩阵将顶点转换为本地空间,然后通过全局变换矩阵转换,旋转,缩放,缩放,放大到世界空间。
可以理解,OfficeTtransform将顶点转换为本地空间,然后将GlobalTransFormChange转换为世界空间。其中,OfficeTtransform是固定的,因此您也可以在骨文件中离线计算它。本质
皮革计算原理
每个骨骼节点的变化都会导致皮肤变化。骨骼变化矩阵的计算是计算皮肤,并最终在屏幕上显示皮肤。
皮肤计算由皮肤的顶点数据支持。每个帧将重新计算。顶点的计算结果是由框架骨的骨头和框架骨头的顶点计算得出的。
皮肤顶部的计算过程如下:
(基于骨骼形式更改皮肤的剥离)
图中的每个帧都计算骨骼节点的变化矩阵。每个骨头都需要计算自己和父节点的全球变化。其中,姿势矩阵是偏移矩阵,可以写入离线计算的配置数据中。
在皮肤计算中,每个顶点都会受到多个骨点的影响。这些骨点可以是多个独立骨骼的叶子节点,也可以是与父子关系的骨点。同时,每个骨骼节点都会影响许多顶点。当然,骨骼节点影响的顶点越多,它就越重要。
当皮肤峰受到多个骨骼的影响时,将根据皮肤的皮肤的重量值来计算多个骨骼的影响。公式是:
(根据多个骨点的重量计算皮肤顶部的公式)
如上图所示,皮肤的皮肤受到多个骨骼的影响,并且最终通过重量叠加的计算获得了计算。
同时,当1个最高点受2或4个骨头的影响时,发动机将计算顶点的方法线和切割值,即,方法线和切割线也通过上述公式计算为计算最终结果。
(骨骼和皮肤网图)
骨骼基质计算原理
制作皮肤动画时,它是通过更改骨骼节点的翻译游戏引擎架构,旋转和缩放缩放来完成动画的每个框架来制作的。
皮肤和骨骼的初始状态称为T姿势,代表骨骼和皮肤的初始外观。
在TPOSE数据中,初始姿势,紫外线,线条,切割线和骨骼节点亲子关系和初始TQS数据的皮肤(该发动机计算为Office矩阵,这是姿势姿势的全球姿势)本质
TPOSE和更改矩阵乘以获得最终转换矩阵,如下所示:
(骨骼基质图的计算路径)
当骨骼节点更改时,节点会通过翻译,旋转和缩放更改。它们是使用TQS计算的,它将驱动其子节点。因此,矩阵是骨骼的当前变化矩阵。
姿势矩阵是偏移矩阵,它是GlobalTransform的逆矩阵。它可以通过离线计算存储。它通常存储在动画骨的配置文件中。 Unity存储在Avatar资源文件中。
在上图中,姿势矩阵是一个始终不变的矩阵,并且更改的矩阵是每个帧计算的矩阵。更改矩阵中每个骨骼节点的更改矩阵需要乘以所有父节点的更改矩阵。计算皮肤顶部的骨骼转化矩阵是通过变化矩阵的姿势矩阵。
SIMD计算原理
在矩阵计算中,通常使用SIMD优化矩阵计算。不仅可以通过SIMD,vector3 * vector3,vector4 * vector4(vector4)来优化诸如3x3和4x4之类的矩阵,也可以通过SIMD优化。
Simd的寄存器为128位,即4 32位的宽度,因此128位代表矩阵中的一条线,而4个128位变量代表4x4矩阵。
计算SIMD时,我们需要拆卸4x4或3x3矩阵的计算公式,并拆卸128位寄存器的计算公式。
其中,可以将4x4矩阵乘法A44 * B44拆卸为:
a44 * b44 =(a44*b1, a44*b2, a44*b3, a44*b4)
再拆解为
a44 * b44 = (a44*b1, a44*b2, a44*b3, a44*b4) = ((mad(a1, b1x, a2 * b1y) + mad(a3, b1z, a4 * b1w)) , (mad(a1, b2x, a2 * b2y) + mad(a3, b2z, a4 * b2w)), (mad(a1, b3x, a2 * b3y) + mad(a3, b4z, a4 * b4w)), (mad(a1, b4x, a2 * b4y) + mad(a3, b4z, a4 * b4w)))
将MAD删除到A * B +c。
(矩阵乘法拆卸图)
拆卸后,您会发现它实际上是由疯狂单元组成的游戏开发素材,即,最小操作单元是感知器
(感知计算机图像图)
参考:
骨动画混合原理
骨骼动画的混合物主要源自骨骼动画以不同种类的姿势带来的皮肤变化。
当各种骨姿势同时运行时,将产生各种骨骼变化矩阵,并且在混合计算后,多种姿势将变成最终的姿势。
当发动机混合时,最终根据每个骨骼动画的重量来计算皮肤的位置。正如顶点受多个骨骼的影响一样,一组皮肤也受到多组动画骨骼的影响。
(混合骨动画图的原理)
当并联进行多个动画时,每个动画都会导致骨骼节点的变化。因此,在计算混合动画的结果时,您需要计算操作中每组动画中的骨变化矩阵,然后将其混合。
同时,从旧动画到新动画,有时并行动画会逐渐过度,因此随着时间的推移,不同动画的重量将逐渐变化。
混合动画矩阵公式为:
混合动画转换矩阵 = (动画1骨骼变化矩阵 * 动画1权重 + 动画2骨骼变化矩阵 * 动画2权重)* Pose矩阵
混合动画计算中皮肤的配方与普通的皮肤计算公式相同:
动画蒙皮 = 混合动画(骨骼1)转换矩阵 * 蒙皮顶点 * 影响权重1 + 混合动画(骨骼2)转换矩阵 * 蒙皮顶点 * 影响权重2 + ...
网格混合动画原理
除了骨骼动画外,动画还有许多类型。网状混合动画是发动机侧更常见的动画方法之一。
网格混合动画可以理解为由多个网格共同构建的动画性能。它属于微动物,也有一些条件。在相同类型的网格数据下,它必须是一种动画混合动力。
网格混合动画特别适合精致的动画,例如面部表情,表面动画,球形动画等。它们都通过更改数千个顶点而形成动画。高的。
当网格模型绘制更多不同的模型形状时,您可以使用混合动画制作精致的动画片段。
(网格动画混合图的原理)
网格动画的原理是通过多个动画的不同权重计算不同时间点处的不同时间点的每个网格顶点的位置,从而形成了数千个正在不断改变动画的顶点。
网格顶点混合计算过程,首先计算需要混合的网格权重量值,然后遍历每个混合网格。根据重量值的重量计算每个顶点的位置。
(网格混合示例图)
可以理解的是,顶点取决于多个动画的重量和框架的重量。计算公式是:
顶点 = 网格1顶点 * 权重1 + 网格2顶点 * 权重2 ... + 网格N顶点 * 权重N
运动动画移动原理
Montion移动动画功能可以在动画播放期间计算一个速度值,并以此速度值来移动动画和速度的真实性。
(运动动画原理图)
运动用于获得骨骼的运动速度,以适应物理运动过程中脚步和动画的运动速度。原理是通过每骨框架的变化来计算咬合方向的方向和速度。现场者。
运动的逻辑可以理解为根据指定的骨骼计算变化值。基于指定骨节点的变化,计算每个帧的运动,三角洲柱,三角洲旋转,以确定速度速度和目标后位置目标位置。
它主要用于匹配角色的运动速度,使角色在动作过程中更匹配动画的速度,这可以模拟现实和更现实。
谢谢你的耐心等待
感谢您的阅读。
创建并不容易,谢谢您的鼓励。
审查
这些作品发表在主要平台上,例如新华社书店,Dangdang,,微信雷丁,UWA,机械行业出版社...