骨骼
典型骨骼结构

整个骨骼姿势,j个关节姿势的集合

关节姿势结构


整个骨骼的局部姿势

把关节姿势当作基变更,对局部关节姿势变换是以父空间表示该点或矢量。关节姿势能把点从子空间变换至父空间
根关节的空间作为模型空间
任何关节j全局姿势


从该关节往根节点及模型空间原点遍历

扩展包含全局姿势的骨骼姿势

动画片段
动画系统记录动画时间索引的两种方式:
局部时钟:每个动画片段都有局部时钟,单位通常为秒,帧或归一化时间,以浮点小数储存。开始播放时,时间t为0.根据播放速率R,对时间推进进行缩放
全局时钟:角色含有全局时钟,单位通常为秒。每个片段记录开始播放的全局时间,片段的局部时钟由公式计算,不直接储存
局部时钟方法简单,但当播放动画命令来自不同引擎子系统,会有同步延迟。
如玩家在某帧出拳,在当前帧播放出拳动画,而npc受击动画有AI系统播放。如果AI系统在玩家系统之前执行,则玩家出拳和npc反应会有1帧延迟。若玩家系统在AI系统之前执行。则npc打击玩家会有相同问题。如果两个子系统的通信是用事件系统传送,会有额外的延迟。
使用全局时钟,虽然受击反应仍是1帧延迟,但可以通过匹配相同的全局开始时间令两个动画同步
动画片段

动画片段是为特点骨骼设计,通常不用于其他骨骼,隐藏每个clip含有骨骼引用m_pSkeleton
非循环动画的采用m_aSamples是m_frameCount+1.循环动画两者相等,因为最后一个采用等于第一个采用
近似的骨骼有时能使用同一个动画,需要引擎播放动画时,忽略无法匹配的骨骼
动画通道就是每关节10个标量值的函数。又是会额外加些信息编码,即"元通道"数据。
如在多个时间点上储存事件触发器。
或者提供在Maya中称为定位器的特殊关节,用于记录游戏中任何物体的位置及定向(典型用法是在动画中设置摄像机的位置及角度。把定位器导出后,可以在播放动画时移动摄像机)
纹理坐标滚动、纹理动画、含动画的材质参数、含动画的光源参数、其他随时间改变,并和动画同步的参数
蒙皮
把三维网格顶点联系至骨骼称为蒙皮。网格的每个顶点绑定一个关节时,会完全随该关节移动,若绑定多个关节,顶点的位置等于逐一绑定至个别关节后的位置,再加权平均。
每个顶点的权重因子和为1
通常每顶点绑定的关节数限制为4个
蒙皮顶点数据结构

蒙皮矩阵:将网格顶点(模型空间定义)从绑定姿势变换至当前姿势。非基变换

把顶点与模型空间转换至关节空间,变换关节至当前姿势,最后把顶点转回模型空间
矩阵Bj->M为关节j在模型空间的绑定姿势,即点从j关节空间转换至模型空间的转换矩阵。
因此点从模型空间转换至关节空间,即乘绑定姿势逆矩阵

Cj->M为当前关节姿势

Kj即为蒙皮矩阵
绑定姿势(Bj->M)-1通常缓存于骨骼。无需实时计算
有些引擎会把蒙皮矩阵预先乘物体模型至世界变换。每个顶点能节省一个矩阵乘法

顶点蒙皮至多个关节
一个顶点蒙皮至N个关节,分别蒙皮至每个关节,产生模型空间位置,再加权平均,关节索引j0至jN-1,权重为w0至wN-1。其中权重和 为1

动画混合
线性插值混合

β为混合百分比/混合因子
整个骨骼插值后姿势,是所有关节插值后姿势的集合

并非直接对矩阵插值,而是分别对SQT每个部分插值
位移T线性插值

旋转Q线性插值或球面线性插值


缩放S线性插值

姿势混合通常在局部姿势进行,即令关节独立在其父关节中进行插值
时间性混合
在采用均匀分布的两个时间点的姿势间线性插值,混合因子为

动作连续性:淡入淡出
对连个片段的时间线适度重叠。tstart是β为0,只看到片段A,tend时,β为1,只看到片段B
圆滑过渡:两个片段手脚大致匹配

冻结过度:片段A局部时钟停顿与B开始播放时,片段B逐渐取代角色动作,适合两个不想关且无法在时间上同步的片段

可以改变β在过渡过程的变换方式,如一维Bezier曲线,即缓出曲线,缓入曲线

物理世界
碰撞系统会通过碰撞世界的数据结构,管理所有可碰撞实体。便于利用缓存一致性提高性能。
动力学系统的世界数据结构通常会与碰撞系统共享。每个刚体会关联一个可碰撞体
碰撞原型
球体 :球心和半径
胶囊体 :两点和半径。计算胶囊体相交比圆柱体和长方体高效
轴对齐包围盒 :由两个点定义。 可快速测试与另一AABB是否相交,但必须限制与保持坐标轴对齐。即当物体旋转时,需重新计算AABB
定向包围盒 :允许AABB于坐标系中旋转,会得到OBB
离散定向多胞形
任意凸体积
多边形场
复合形状
碰撞测试
点与球 :判断点至球心的距离是否大于球体半径
球与球 :判断两个球心的距离是否大于两球体半径和
分离轴定理 :如果能找到一个轴,使两个凸形状于轴上投影不重叠,则不相交。投影可以视为轴上的最小最大坐标闭区间。
AABB与AABB :检测在每个轴上的坐标区间是否重叠
凸碰撞:GJK算法 :闵可夫斯基差:图形A所有点减图形B所有点得出得集合。当闵可夫斯基差包含原点,则相交
运动物体碰撞检测
扫掠形状:一个形状由某点移至另一点形成的形状。检测相交时,由检测碰撞世界的静态快照,改为检测从上一个快照的位置与定向移至当前快照形成的扫掠形状。等同对快照间形状做线性插值。对于曲线路径或旋转碰撞体,测试结果一般不准
连续碰撞检测CCD: 对两个物体与某时间区间内,求最早的冲击时间TOI。维护每个碰撞体与上个时间戳及当前时间的位置和定向(用来线性插值)。
性能优化
时间一致性/帧间一致性
碰撞体以正常速率移动,两帧间位置及定向通常很近。通过跨多帧缓存结果,避免每帧重新计算一些类型的信息。直到碰撞体运动导致这些计算结果失效
空间划分
八叉树,BSP树,kd树,球体树等
粗略阶段、中间阶段、精确阶段
用粗略的AABB测试哪些物体有机会碰撞
检测复合形状的逼近包围体。如某复合形状为3个球体,包围体积可以是更大球体
测试碰撞体个别碰撞原型是否相交
扫掠裁剪算法
在粗略阶段,对各个碰撞体的AABB最小最大坐标在3个主轴排序。遍历有序表检测AABB是否重叠。可利用帧间一致性把O(nlogn)减少至O(n)
碰撞查询
光线投射
投射的是p0到p1的有向线段

接触点的通常数据结构

可用于 判断A能否看见B。武器系统(子弹命中),玩家机制(脚底是否为地面),AI系统(视线检测,瞄准,移动查询),载具系统(把车轮依附地面)
形状投射
假想一个凸形状沿有向线段移动多远会碰到其他物体
1.投射形状已插入或接触至少一个其他碰撞体,无法再移离起点。此时返回与所有相交碰撞体的接触点。可能在内部或表面

2.投射形状可以在碰撞前沿线段移动一段非零距离。产生的碰撞接触点一定在表面

可能会传回所有接触点

通常会传回接触点的数组或列表数据结构(多个点)。每个 点结构如下

可用于判断虚拟摄像机是否与游戏世界中物体碰撞。球体胶囊体投射用于角色移动。如在崎岖地形滑行前进,可从角色脚底向移动方向投射一个球体/胶囊体。再通过二次投射向上或向下调整形状,保持和地面接触。
Phantom
判断碰撞体是否位于指定体积里。如获取角色半径范围内的敌人列表
碰撞过滤
根据游戏的具体准则,决定碰撞体之间的接触是否成立。方法有碰撞掩码及碰撞层、碰撞回调、专门的碰撞材质
碰撞/物理步
- 以Δt对施于物理世界刚体的力及力矩计算向前积分。求出次帧暂定位置及定向。
- 调用碰撞检测,判断暂定移动是否有新的接触点。是否失去之前的接触点
- 进行碰撞决议。常用方法如冲量、惩罚性力,或作为约束求解的一部分
- 以约束求解程序满足约束条件
第4步完成前,有些刚体可能已移离第1步计算出来的暂定位置。可能导致物体间有互相穿插的情况,可能破坏之前已满足的约束。需重复1至4步,直到处理所以碰撞并满足所有约束或超过预设的迭代数目
连接游戏对象和刚体

物理世界刚体和屏幕上的视觉表示非直接相连,而是靠逻辑对象作为枢纽
零个刚体 :物理世界不含刚体的游戏对象作为非固体。无任何碰撞。通常是无法互动的装饰性对象。如天空的飞鸟,可看但不可达的世界局部。或者一些需手工处理碰撞的对象
一个刚体 : 多数简单游戏对象。刚体碰撞形状会尽量逼近对象的视觉表示。刚体的位置/定向完全匹配游戏对象本身的位置/定向
多个刚体 :复杂的游戏对象。如角色、机械、载具或多固体组成的对象。刚体通常连接至骨骼关节。每个刚体的位置/定向对应其中一个关节的位置/定向。骨骼一些关节可能由动画驱动,则刚体跟随动画。反之,可能物理系统驱动刚体位置,间接控制关节位置。
对于多个刚体的复杂对象,使用某种包裹类管理,避免游戏对象直接管理一组刚体细节。令多种游戏对象用统一方法管理刚体
物理驱动的刚体
通过步进模拟后,向物理系统查询刚体的位置/定向。把这个变换施于游戏对象或某个关节或某些其他数据结构
游戏驱动刚体
由动画、样条路径或玩家控制的物体。不受引力影响,物理系统把它当作无穷质量,通常标为0.确保模拟中的力和力矩无法改变刚体的速度。不能简单地每帧在物理世界中设置移动物体的位置和定向。会产生不连贯性,无法求解物理模拟(如物理驱动刚体可能插进一个游戏驱动刚体,但无法获取游戏驱动刚体的动量做出碰撞决议)。
通常由冲量即速度移动游戏驱动刚体。以时间向前积分求刚体的位置。若刚体需停止时,把速度清零
固定刚体
模拟游戏世界的静态组件。有如游戏驱动刚体,但不参与动力学模拟。只有碰撞的刚体
更新模拟
完整物理模拟的步骤
更新游戏驱动刚体
更新phantom phantom的行为如欠缺刚体的游戏驱动碰撞体。用做碰撞查询。物理步进前更新phantom位置,来执行正确的碰撞检测
施以力、冲量、并调整约束 更新正在施行的力。本帧发生的游戏事件,产生的冲量也在此时施行。按调整约束
步进模拟 更新碰撞及物理引擎。包括对运动方程数值积分,求次帧所有刚体的物理状态。执行碰撞检测算法,求物理世界增减的刚体接触。碰撞决议。施行约束等
更新物理驱动的游戏对象
phantom查询 物理步进后,读取phantom形状的接触信息
执行碰撞投射查询 以同步或异步方式启动光线及形状投射。
光线和形状投射理论上可以在游戏循环的任何位置。步进模拟前要更新游戏驱动物体并施以力,步进模拟之后再更新物理驱动对象。渲染置于游戏循环之末
碰撞查询的时间
碰撞查询通常在物理帧末,已执行完大部分游戏逻辑。
因此执行碰撞查询:
- 基于前一帧的状态做决定。例如判断玩家是否在物体上来决定本帧是否掉落。可以在物理步进前执行碰撞查询
- 接受1帧延迟。通常对不太快的物体做出这种让步。例如移动物体判断是否在玩家视线中。可以在物理步进前执行碰撞查询,把结果当本帧末碰撞状态的近似值
- 物理步进后执行。基于这些查询结果的决定延至帧后期做出。如依赖碰撞查询的渲染效果
单线程更新

1392

被折叠的 条评论
为什么被折叠?



