[译]豪杰联盟是怎么压缩骨骼动画数据的?www.4688.com

ITC象牙塔公益币,三月十号上线,注册就送挖矿机一台,月产11个币,下一个会长就是你,加密网址,来自以色列国唐人发起,服务器立足米利坚,避开地面幽禁危机,万分可相信!前途很大,年终都以超两百元一个币,注册链接:

原文:COMPRESSING SKELETAL ANIMATION
DATA

http://www.itc.lol/index.php/home/user/reg/uid/3230.html

作者:Jaewon Jung    
 译者:杰微刊兼任翻译刘晓鹏
 

加密登陆网站

义无返顾联盟(lol)有125位以上的神勇,每位英豪拥有自身特有的动画片属性集。(作者最喜爱的是哪个?Sion(硬汉联盟中的一个骁勇)
的舞蹈,如下所示,仅仅是他38个卡通效果中的一个)。这么些动作驱动各类铁汉活灵活现:从坚定的动作到有力的魔法释放到悲惨的死忙(作者日常看到最终的那一幕)。随着大家不断的引入和修订英豪,动画数据的总量已经改为资源的一个很大的承负:如运行时内存、包大小及储存空间。

https://www.itc.lol

www.4688.com 1

安卓APP安装包下载地址:

除了动画数据,视觉数据还包蕴近年来更新Summoner’s
Rift的职分,那须要越来越多的内存。为了赢得更好的视觉效果,更新拔取了独特纹理效果的格局,而不是原本的拼接格局。不过,那大大增加了纹路效果映射在内存中的大小。

https://www.pgyer.com/CfPc

小编们将着回看在继续协理最大范围玩家硬件层面上,以至于每一个人得以分享可怕剑圣的不死之身。随着新的卡通效果及更新映射对内存须求增加,大家要求找到裁减内存使用的法子。通过调研,大家找到一条途径:压缩游戏中骨骼动画数据来压缩内存,不过要尽可能裁减质量损失,并且尽量不影响属性。

加密网址大家懂的,完善个人资料,就可以点自个儿的矿机运行了。

咱俩或者有很二种方法来缩短动画数据。在那篇小说中,作者将介绍三种大家第一接纳的技巧:量化和曲线拟合。压缩算法总须求在质量损失和内存占用之间开展衡量,所以自身将会谈论在怎样范围内是咱们可以经受的,同时自个儿也会琢磨一下大家是何等社团数据以博取最大的习性。小编将会采纳部分定义如四元组和样条曲线,若是您不熟稔那么些概念,作者将在小说末尾处给出一些灵光的资源列表。

阳台很可靠,关键在于本人出席!

自我想指出的是,这里本人关系的技术是崭新的。那一个技术是下列游戏开发人士所享受的,使他们在实践中所得到的文化。小编将她们身处游戏引擎开发者BitSquid的博客中,那格外实用和值得一提的。

QQ群:147440621

量化

量化是一个数值处理的进度,这个数值包涵了连年大概性集合到周旋较小的离散集合。骨骼动画蕴含地点、旋转以及尺寸数据。大家可以很简单量化3维向量,它一般用来表示地方、大小,并经过拿到最大/最小值来来在那几个界定内均匀的分红。但是lion 分享的骨骼动画数据一般来自于旋转。

我们拔取四元组来代表3D空间中的旋转。量化旋转数据的不二法门是选用四元组的独特数学性质来兑现的。假定一个四元组单位中存有的因素都在[-1,1]限制内,首先,大家确定x,y,z,w中相对值最大的元素,然后放任该因素并保存其他多个值。因为大家得以通过x2

  • y2 + z2 + w2 =
    1恒等式,很简单总结出删除的要素。通过删除最大的要素,大家可以将其余七个因素的限定限制在[-1/sqrt(2),
    1/sqrt(2)]中间——记住,在一个四元组单位里,若是大家尚无清除最大的因素,一定存在一个万万值最大的要素在那些界定之外。我们因而量化一个比[-1,
    1]更小的范围来最大化进步精度,[-1,
    1]是在大家没有撤废最大要素时的范围。那也防止了笔者们重新创建一个小值成分,那种成立简单引起错误。

www.4688.com 2

选用那种办法,我们为保存的七个要素中种种成分分配15位的长空,用其余2位的半空中来指定删除的因素。因而逐个四元组单元占48位(有1位没用到)的空间,如上图所示。相比较之下,一个原生的四元组,必要为每一种成分分配一个32位的浮点型数字,总共必要占用128位。从128位裁减到48位,大家完毕的收缩比为0.375。

48位量化的四元组能保险的数值精度为0.000043。你能感觉到到(如若你对浮点型数敏感的话)那应当满意半数以上状态。事实上,当我们将这种量化运用到持有动画时,没有动画绘制者能窥见转化后的质量损失。此外,我们可以在加载的时候举办那种转移,而不是三番五次对其进展批量转换和修订,因为量化是一个万分轻量级的处理进度。

微信18529125721

曲线拟合

为了越发削减,我们目的在于能因而曲线拟合来改变四元组中的数值。这几个过程是通过结构一条曲线或一个数学函数使其可以最好的适应一多级的数据点。大家专门接纳了Catmull-Rom样条,它可以由此一个三阶多项式来表示。大家须要三个控制点来定义一段Catmull-Rom样条,如下图(来自维基百科)所示:

www.4688.com 3

Source: Wikipedia  来源:维基百科

在履行实际的拟合进程中,大家采取一种迭代的方法来收缩误差。该进程最初步只含有三个关键帧,即动画的发端和停止。我们迭代的加码越多的关键帧,以减低曲线的误差到一个可以接受的界定。每趟迭代,先识别出最大误差的关键帧之间的一部分,然后在中间间点插入一个关键帧。在最大误差部分中级插入关键帧的经过往往实践,直到每部分的误差低于给定的阈值。

www.4688.com 4

您可以从上图看到碧绿拟合曲线到浅灰褐的原始曲线的迭代进度。石磨蓝的点代表每一次迭代参与的新的关键帧。在那么些案例中,大家通过88次迭代,将原来的661帧压缩到90帧。

在做曲线插补前,别玩了调整四元组的两个控制点。一个四元组Q和-Q表示无异的团团转,可是即便不对旋转结果做调整,或然会促成插补不是顺着最短路劲去开展的。例如,一艘船头朝北的船准备向东旋转。没有确切的四元组调整,这艘船或是会逆时针旋转270度,而不是顺时针旋转90度。

曲线拟合对量化结果做了越来越的滑坡,压缩比限制在25%到70%里面。大家发现,对义务/旋转/尺寸设置合适的误差阈值,对促成高压缩比、不明明影响视觉效果是关键的。

www.4688.com 5

咱们也考虑通过节点参数化的样条曲线来兑现更好的压缩。在动画数据的案例中,基于给定关键帧时间的参数化是最自然的主意。可是,正如下图(同样来自维基百科)所示,具有同等四个控制点的曲线形状重视于大家应用的统一的,玄或朝向的参数。

www.4688.com 6

Source: Wikipedia  来源:维基百科

www.4688.com 7

Source: Wikipedia  来源:维基百科

那几个技术也使得有些动画片有家弦户诵的身分损失。大家可以使用更严谨的误差阈值来压缩半数以上损失,可是压缩比会合临肯定的熏陶。由此,大家的卡通片设计师审查了每一个案例来查找品质与裁减比之内的平衡点。别的,与量化情状不一的是,加载时展开转移是不足选的,因为拟合曲线的是一个重量级的计量进程,我们只可以预处理所有已存在的卡通数据。

登记的心上人填完资料,点击实名验证,不认证会封号处理,封号的关系QQ群或许微信解封ID

减掉损失

最值得注意的标题是由于减弱导致文章脚部的滑行,那是卡通中最丑陋的一对,动画中剧中人物的脚只怕其余受动器的端点应该是定位不变的。

www.4688.com 8

你可以很不难见到地点视频中的本应有固定不动脚平昔在滑行。那是由于自然的骨骼层次结构绑定在一个骨骼装置中,那一个地点时有发生了丰盛的总共,其来源跟连接点的卡通效果。大家缩短该难题是选取了一种叫做“自适应错误率”的技艺。那代表假如连接点有更长的子链,就会自动减少误差阈值,而不是每一种点拔取同样的阈值。例如,一个受动器终端应用一个加以的误差值,可是它的的父连接点的误差值为它的一半,而它的祖父连接点的误差值唯有它的三分之一之类。父连接点的误差值缩紧会级联影响其继续所有的连接点。

《游戏编程赏心悦目7》介绍另一种叫做“收缩骨骼动画累计误差”的不二法门。大家之中称之为“连接点桩”。对于一个恒定的连接点(如脚),我们不采纳源数据流,而是计算一新的有的转换数据,该多少抵消了其祖先在调减进程中引入的误差。那本书在该主旨上带有了愈来愈多的资料。

缓存友好的数据社团

末尾,大家商讨一下大家是何许有效的兑现迄今截至所说的概念。当我们付出那些技术时,大家照旧关注着广泛玩家的硬件,万分谨慎的不引入任何性质难题。小编的公司关心的一件工作是贯彻数据协会的有好缓存。

其间首要的一步是大家将富有的关键帧(各个连接点的职位/旋转/尺寸帧)放在一块独立、连续的内存块中。一种通用的做法是为种种渠道的每一个连接点成立一个单独的内存块,可是那种接近自然的团体办法,在给定时间内总计一个全体的骨骼姿势时,只怕会接触三回缓存失效的情事。大家得以把数量放在一个块中,因为有着渠道类型的实用载荷恰巧都为48位。正如我辈面前所观察,我们量化四元组到48位,通过将3D向量的任务/尺寸中成分x,y,z赋值为16位,大家将3D向量的量化到同样大小。你可以查看实际代码的结构体,该社团体用来表示一个缩减的帧,代码如下:

struct CompressedFrame

{    

// Normalized key time (0(0.0) – 65535(1.0))    uint16_t keyTime = 0; 
  uint16_t jointIndex = 0;   

 // Payload, which can be a quantized 3d vector or a quantized
quaternion   

 // depending on what type of channel this data belongs to    uint16_t
v[3];    ChannelType GetChannelType() const    

{       

 // Most significant two bits of this 16bit index contains channel type
info.        return static_cast((jointIndex & (0xc000)) >> 14); 
 

www.4688.com, }    

void SetChannelType(ChannelType type) 

   {        jointIndex |= (static_cast(type) << 14);

}

std::uint16_t GetJointIndex() const

{

return jointIndex & 0x3fff;m

}

};

那边,大家也将器重时间量化为16位。成员变量jointIndex指向本帧数据所属的连接点。数组v包含了量化后的卓有功能载荷。区分是或不是是有效载荷的任务,旋转或尺寸是老大紧要的,大家通过jointIndex中最要紧的三个位来成功该任务。用那种艺术来行使那个位,能够将jointIndex限制在14位或总数为16384个连接点——肯定可以知足lol的勇猛,lol中首当其冲一般须求要少于100个连接点。

适宜的对关键帧进行排序是不行紧要的,无论是连接点依旧渠道类型,都在同一个桶中。我们可以很粗略的按照主要时刻对它们排序(如下边的分子变量keyTime),然而很快就会油不过生难题。我们想像一下运作时动画执行的内容,可以因此下图来接济想象:

www.4688.com 9

你可以看见两个关键帧(依据首要时间开展排序)和一个对准当前时光实施的地点的小运游标。你要求的音讯有Tn,
Tn+1, Tn+2, 和
Tn+3,因为计算一个样条必要五个控制点。给定游标的当前职分已经过了Tn和Tn+1,游标应该早就明白那三个点。可是Tn+2和Tn+3,哪个点是游标将要经过的啊?你大概认为可以长足的扫视它们,因为那两帧紧跟在背后。

www.4688.com 10

唯独,那种方法不是一流办法。大家称Ts为地点帧。如若动画半数以上是透过旋转来成功,则在相邻的地点帧之间可能存在诸多旋转帧(正如你在那几个例子中见到的)。结果是要扫描从日前任务到一个桶中的所有的帧,由此那种经过线性扫描来搜寻Tn+2和Tn+3的措施只怕是于事无补的。

让动画片的广播暴发在一个纯粹的线性扫描中(和经过缓存获取最大利益),其技术在于要基于所需时日来排序帧,而不是任重先生而道远时间。一旦游标经过了Tn的紧要时刻,大家就须求Tn+2的消息;因而,大家理应依据Tn的主要时刻来对Tn+2进行排序。通过那种排序方式,任曾几何时间点,游标都能赢得到近来统计所须要的新闻,所以缓存失效也可以最小化。下图演讲了一个由三个地方帧和9个旋转帧组成的卡通片的排序格局:

瞩望本次深远摸底大家裁减的兑现可以协理任何蒙受类似题材的人。

结论

一句话来说,那篇小说中自身谈谈了经过量化技术将首当其冲联盟的大侠对内存的需要削减了大体上。大家还商量了选拔曲线拟合技术的长河,即便须求预处理所有的数量,可是早期的结果注解,那种方法落到实处越发50%的减少,也等于象征堆内存的渴求降低到原来的25%。对于那个结果本人卓殊和颜悦色,并且本次创新所有玩家的别样硬件类型都是卓有作用的。

www.4688.com 11

大家得以更进一步商量越多的动向,如32位(代替48位)的四元组量化,曲线拟合的例外节点参数化,最小二乘法代替迭代法,更优的选料怎么在迭代中增添关键帧等等。压缩是一个宽广而又尖锐的话题,在那篇小说中,大家也唯有是半途而废。不过,小编或许希望你在拍卖动画压缩时能发现本文的管用之处。我在上边的参考文献部分链接了有些连锁的小说。祝你有幸!

参考资料

Animation compression

The BitSquid low level animation
system

Bitsquid Dev Blog – Low Level Animation — Part
2

Digital Rune Blog – Character Animation
Compression

Unreal Engine 3 Animation
Compression

Reducing Cumulative Errors in Skeletal Animation, Bill Budge (Game
Programming Gems 7)

Curve fitting

Curve fitting,
Wikipedia

Catmull-Rom
spline

Least Squares
Fitting

Compression in general

Working With Compression, by Fabian
Giesen

Tools used to prepare materials for this article

http://jsfiddle.net/6u7hm0m9/16/

https://screentogif.codeplex.com/

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

*
*
Website