基于Unity的可配置动画文件树形压缩方法及装置
技术领域
本申请涉及计算机图形学领域,尤其涉及一种基于Unity的可配置动画文件树形压缩方法及装置。
背景技术
在计算机图形学领域中,目前有两类主流的动画类型:关键帧动画和骨骼动画。在关键帧动画中,三维模型在每幅关键帧中都仅是一个固定的“姿势”。动画制作人员通过在绘制三维模型运动过程中的多个关键动作的“快照”(即关键帧),并由计算机依据相邻两幅关键帧进行插值平滑计算,从而得到关于该三维模型较为流畅的动画。虽然关键帧帧动画由于只需要进行插值计算,从而相对于骨骼动画的计算量较小;然而,由于只能基于“姿势”固定的关键帧进行插值计算,一方面对于复杂的组合动作,需要绘制多张“关键帧”以避免三维模型在插值过程中出现的三维模型自身“穿刺”的毛病,另一方面,由于插值一般是线性的,从而使得画面动作表现比较粗糙,不够细腻(例如早期的Flash动画)。
相反,骨骼动画将三维模型划分为骨骼(Bone)和蒙皮(Mesh)。其中,以Unity引擎为例,骨骼又进一步地划分为具有多个层级关系的树形结构骨骼。在该树形结构中,父节点的骨骼在运动时,作为其子节点的骨骼将跟随父节点处的骨骼运动;反之,子节点的骨骼在运动时不影响父节点的骨骼。蒙皮则将三维模型的顶点映射到骨骼,即指定某个顶点由那几根骨骼控制。具体地,在骨骼运动的时候,三维模型的顶点根据控制其运动的骨骼及其控制权重的百分比而作出相应的运动。虽然上述模型的运动方式更接近实际,真实感强而使得画面表现细腻,且由于无需绘制大量的关键帧而使得动画可以更容易和快捷地制作,但是由于模型的所有顶点都要根据骨骼的实时变化计算,使得其对硬件的计算能力要求非常高,以保证画面的流畅。即使动画以预先绘制的方式保存为相应的动画文件,使得其能够在硬件参数相对较低的设备上流畅播放,其文件中也需要包含大量的数据。这令单个动画文件的体积往往非常庞大。
发明内容
本申请的目的是解决现有技术的不足,提供一种基于Unity的可配置动画文件树形压缩方法及装置,能够获得在保证动画整体表现的前提下压缩动画文件体积的效果。
为了实现上述目的,本申请采用以下的技术方案。
首先,本申请提出一种基于Unity的可配置动画文件树形压缩方法。该方法包括以下步骤:
S100)读取Unity动画文件的内容,生成Unity动画文件内各个三维模型的骨骼节点树;
S200)按照骨骼节点树本身的高度和各高度的节点数量,形成基于高度的精度压缩配置文件;
S300)遍历骨骼节点树的所有节点,并根据精度压缩配置文件压缩各节点;
S400)根据压缩后的骨骼节点树,重建相应的三维模型以生成压缩后的Unity动画文件。
进一步地,在本申请的上述方法中,所述步骤S200还包括以下的子步骤:
S201)获取骨骼节点树本身的高度,并统计各个高度中节点的数量;
S202)以精度随着节点高度递降的方式初始化各个高度中的节点压缩度;
S203)根据各个高度中节点的数量和Unity动画文件的目标压缩比率,微调各个高度的节点压缩度以形成最终压缩度;
S204)收集各个高度的最终压缩度,形成相应的精度压缩配置文件。
再进一步地,在本申请的上述方法中,在所述步骤S202内,各个高度中的节点压缩度是以节点压缩度随节点高度均匀变化的方式初始化的。
可替代地,在本申请的上述方法中,Unity动画文件的目标压缩比率预设在40%至50%之间。
可替代地,在本申请的上述方法中,所述步骤S203中,当需要进一步压缩以达至目标压缩比率时,微调是根据节点的高度从高到低逐步执行的;当需要减少压缩以提高三维模型精度时,微调是根据节点的高度从低到高逐步执行的。
进一步地,在本申请的上述方法中,所述精度压缩配置文件以如下方式设置:与骨骼节点树的高度相等的叶节点压缩至5个字节;高度比骨骼节点树的高度小1的节点压缩至6个字节;高度比骨骼节点树的高度小2至4的节点压缩至7个字节;骨骼节点树的其余节点压缩至8个字节。
进一步地,在本申请的上述方法中,所述步骤S300还包括以下的子步骤:
S301)按照广度优先方式遍历骨骼节点树,以获取骨骼节点树上处于同一高度的所有节点;
S302)根据精度压缩配置文件,压缩处于同一高度的所有节点。
其次,本申请提出一种基于Unity的可配置动画文件树形压缩装置。该装置包括以下模块:读取模块,用于读取Unity动画文件的内容,生成Unity动画文件内各个三维模型的骨骼节点树;配置模块,用于按照骨骼节点树本身的高度和各高度的节点数量,形成基于高度的精度压缩配置文件;压缩模块,用于遍历骨骼节点树的所有节点,并根据精度压缩配置文件压缩各节点;重建模块,用于根据压缩后的骨骼节点树,重建相应的三维模型以生成压缩后的Unity动画文件。
进一步地,在本申请的上述装置中,所述配置模块还包括以下的子模块:统计模块,用于获取骨骼节点树本身的高度,并统计各个高度中节点的数量;初始化模块,用于以精度随着节点高度递降的方式初始化各个高度中的节点压缩度;微调模块,用于根据各个高度中节点的数量和Unity动画文件的目标压缩比率,微调各个高度的节点压缩度以形成最终压缩度;收集模块,用于收集各个高度的最终压缩度,形成相应的精度压缩配置文件。
再进一步地,在本申请的上述模块中,在所述初始化模块内,各个高度中的节点压缩度是以节点压缩度随节点高度均匀变化的方式初始化的。
可替代地,在本申请的上述装置中,Unity动画文件的目标压缩比率预设在40%至50%之间。
可替代地,在本申请的上述装置中,所述微调模块中,当需要进一步压缩以达至目标压缩比率时,微调是根据节点的高度从高到低逐步执行的;当需要减少压缩以提高三维模型精度时,微调是根据节点的高度从低到高逐步执行的。
进一步地,在本申请的上述装置中,所述精度压缩配置文件以如下方式设置:与骨骼节点树的高度相等的叶节点压缩至5个字节;高度比骨骼节点树的高度小1的节点压缩至6个字节;高度比骨骼节点树的高度小2至4的节点压缩至7个字节;骨骼节点树的其余节点压缩至8个字节。
进一步地,在本申请的上述装置中,所述压缩模块还包括以下的子模块:遍历模块,用于按照广度优先方式遍历骨骼节点树,以获取骨骼节点树上处于同一高度的所有节点;执行模块,用于根据精度压缩配置文件,压缩处于同一高度的所有节点。
最后,本申请还提出一种计算机可读存储介质,其上存储有计算机指令。上述指令被处理器执行时,执行如下步骤:
S100)读取Unity动画文件的内容,生成Unity动画文件内各个三维模型的骨骼节点树;
S200)按照骨骼节点树本身的高度和各高度的节点数量,形成基于高度的精度压缩配置文件;
S300)遍历骨骼节点树的所有节点,并根据精度压缩配置文件压缩各节点;
S400)根据压缩后的骨骼节点树,重建相应的三维模型以生成压缩后的Unity动画文件。
进一步地,在处理器执行上述指令时,所述步骤S200还包括以下的子步骤:
S201)获取骨骼节点树本身的高度,并统计各个高度中节点的数量;
S202)以精度随着节点高度递降的方式初始化各个高度中的节点压缩度;
S203)根据各个高度中节点的数量和Unity动画文件的目标压缩比率,微调各个高度的节点压缩度以形成最终压缩度;
S204)收集各个高度的最终压缩度,形成相应的精度压缩配置文件。
再进一步地,在处理器执行上述指令时,在所述步骤S202内,各个高度中的节点压缩度是以节点压缩度随节点高度均匀变化的方式初始化的。
可替代地,在处理器执行上述指令时,Unity动画文件的目标压缩比率预设在40%至50%之间。
可替代地,在处理器执行上述指令时,所述步骤S203中,当需要进一步压缩以达至目标压缩比率时,微调是根据节点的高度从高到低逐步执行的;当需要减少压缩以提高三维模型精度时,微调是根据节点的高度从低到高逐步执行的。
进一步地,在处理器执行上述指令时,所述精度压缩配置文件以如下方式设置:与骨骼节点树的高度相等的叶节点压缩至5个字节;高度比骨骼节点树的高度小1的节点压缩至6个字节;高度比骨骼节点树的高度小2至4的节点压缩至7个字节;骨骼节点树的其余节点压缩至8个字节。
进一步地,在处理器执行上述指令时,所述步骤S300还包括以下的子步骤:
S301)按照广度优先方式遍历骨骼节点树,以获取骨骼节点树上处于同一高度的所有节点;
S302)根据精度压缩配置文件,压缩处于同一高度的所有节点。
本申请的有益效果为:根据三维骨骼模型中各个节点的重要程度,针对性地压缩相应节点的精度,使得在保证动画整体质量的前提下,尽可能压缩相应动画文件的体积。
附图说明
图1所示为本申请所公开的基于Unity的可配置动画文件树形压缩方法的方法流程图;
图2所示为采用图1所描述方法进行压缩后的骨骼节点树构示意图;
图3所示为在本申请的一个实施例中,形成基于高度的精度压缩配置文件的子方法流程图;
图4所示为在本申请的另一个实施例中,根据精度压缩配置文件压缩各节点的子方法流程图;
图5所示为本申请所公开的基于Unity的可配置动画文件树形压缩装置的模块结构图。
具体实施方式
以下将结合实施例和附图对本申请的构思、具体结构及产生的技术效果进行清楚、完整的描述,以充分地理解本申请的目的、方案和效果。需要说明的是,在不冲突的情况下,本申请中的实施例及实施例中的特征可以相互组合。
需要说明的是,如无特殊说明,当某一特征被称为“固定”、“连接”在另一个特征,它可以直接固定、连接在另一个特征上,也可以间接地固定、连接在另一个特征上。此外,本申请中所使用的上、下、左、右等描述仅仅是相对于附图中本申请各组成部分的相互位置关系来说的。在本申请和所附权利要求书中所使用的单数形式的“一种”、“该”和“所述”也旨在包括多数形式,除非上下文清楚地表示其他含义。
此外,除非另有定义,本文所使用的所有的技术和科学术语与本技术领域的技术人员通常理解的含义相同。本文说明书中所使用的术语只是为了描述具体的实施例,而不是为了限制本申请。本文所使用的术语“和/或”包括一个或多个相关的所列项目的任意的组合。
应当理解,尽管在本申请中可能采用术语第一、第二、第三等来描述各种元件,但这些元件不应限于这些术语。这些术语仅用来将同一类型的元件彼此区分开。例如,在不脱离本申请范围的情况下,第一元件也可以被称为第二元件,类似地,第二元件也可以被称为第一元件。取决于语境,如在此所使用的词语“如果”可以被解释成为“在……时”或“当……时”。
此外,除非另有说明,本申请中所讨论的精度压缩是指减少浮点数的有效数字的个数。由于每个有效数字一般需要使用4个字节记录,因此文件的体积可以通过删减有效数字的个数而压缩。
参照图1所示的方法流程图,本申请所公开的基于Unity的可配置动画文件树形压缩方法可以包括以下步骤:
S100)读取Unity动画文件的内容,生成Unity动画文件内各个三维模型的骨骼节点树;
S200)按照骨骼节点树本身的高度和各高度的节点数量,形成基于高度的精度压缩配置文件;
S300)遍历骨骼节点树的所有节点,并根据精度压缩配置文件压缩各节点;
S400)根据压缩后的骨骼节点树,重建相应的三维模型以生成压缩后的Unity动画文件。
参照图2所示骨骼节点树的示意图,Unity动画文件在被读入以后,都生成如图所示的树形数据结构,以方便后继步骤对各节点中的数据进行检索和处理。其中,参照2图中所示,每根骨骼包含了以下三组参数:位移(position,包括x、y和z三个参数)、旋转(rotation,包括x、y、z和w四个参数)及缩放(scale,包括x、y和z三个参数),一共有10个浮点型数据(仅仅为了方便起见,图中仅示出整棵骨骼节点树的部件节点,及节点中的部分参数)。图中父节点的高度标记为0,与父节点直接相连的子节点高度为1,其他节点的高度如此类推。即骨骼节点树中高度越低的节点,其重要性及对精度的要求越高。此外,本领域技术人员应理解到,附图中的显示元件的数量和形状仅作为示例性的参考,不作为对本发明的限制。
一方面,因为父节点的骨骼是独立于子节点的骨骼而运动的,所以压缩子节点的骨骼的参数精度不会级联影响父节点的骨骼运动精度,从而最大限度的保留全体骨骼的运动精度;另一方面,由于子节点的骨骼在数量上远多于父节点的骨骼,因此对子节点的骨骼进行精度上的压缩将更为显著地压缩最后所得的Unity动画文件。
参照图3所示的子方法流程图,在本申请的上述一个或多个实施例中,所述步骤S200还包括以下的子步骤:
S201)获取骨骼节点树本身的高度,并统计各个高度中节点的数量;
S202)以精度随着节点高度递降的方式初始化各个高度中的节点压缩度;
S203)根据各个高度中节点的数量和Unity动画文件的目标压缩比率,微调各个高度的节点压缩度以形成最终压缩度;
S204)收集各个高度的最终压缩度,形成相应的精度压缩配置文件。
其中,每一个节点压缩度对应与浮点形数据中的一位有效数字,例如当19.654321这个浮点数以节点压缩度为1的文本方式存储时,其将被四舍五入为19.65432,然后再存储到文本中。换言之,浮点形数据的1个节点压缩度对应与4个存储字节。
针对上述子步骤,可以有多种的进一步优化。在本申请的上述一个或多个实施例中,各个高度中的节点压缩度是以节点压缩度随节点高度均匀变化的方式初始化的,使得不同层级的骨骼的精度是稳定递降的,从而保证压缩后整个骨骼尽可能平滑地运动。其中,节点压缩度随节点高度均匀变化的方式初始化不仅包括节点压缩度与节点高度是简单的线性递减关系(例如父节点的精度比子节点的压缩精度严格地比子节点小1),其还可以是如下这种分段递减的关系:高度为0和1的节点对应的节点压缩度为0;高度为2和3的节点对应的节点压缩度是1,如此类推(即高度为2n和2n+1的节点对应的节点压缩度为n,其中n是正整数)。
可替代地,在本申请的上述一个或多个实施例中,Unity动画文件的目标压缩比率预设在40%至50%之间。其中目标压缩比率是Unity动画文件压缩前后的体积比。在进一步的优选实施例中,这个比值可以是44%,以兼顾Unity动画文件的压缩效果和动画的细腻流畅程度。
在本申请的上述一个或多个实施例中,算法还可以下方式进行优化:在所述步骤S203中,当需要进一步压缩以达至目标压缩比率时,微调是根据节点的高度从高到低逐步执行的;当需要减少压缩以提高三维模型精度时,微调是根据节点的高度从低到高逐步执行的。具体地,当对骨骼节点树进行初始化压缩后,可以估算其所生成Unity动画文件的压缩比率,并与目标压缩比率进行比较。当压缩比率高于目标压缩比率时,为了尽快达至目标压缩比率并减少对压缩后的Unity动画文件精度的影响,可从最高处的叶节点开始执行进一步的压缩。相反,当压缩比率低于目标压缩比率时,为了显著地提高压缩后的Unity动画文件精度并避免微调导致压缩比率高于目标压缩比率,可从最低处的根节点开始执行减少节点压缩度。
此外,为了减少上述算法的运算量以提高压缩的速度,可以如下的方式配置默认的精度压缩配置文件:与骨骼节点树的高度相等的叶节点压缩至5个字节;高度比骨骼节点树的高度小1的节点压缩至6个字节;高度比骨骼节点树的高度小2至4的节点压缩至7个字节;骨骼节点树的其余节点压缩至8个字节。可替代地,上述精度配置文件也可用于初始化各个高度中的节点压缩度。
参照图4所示的子方法流程图,在本申请的上述一个或多个实施例中,所述步骤S300还包括以下的子步骤:
S301)按照广度优先方式遍历骨骼节点树,以获取骨骼节点树上处于同一高度的所有节点;
S302)根据精度压缩配置文件,压缩处于同一高度的所有节点。
由于处于同一高度的所有节点都具有相同的最终压缩度,因此S302的压缩步骤可以批量地执行,以加速上述算法的执行速度。本领域技术人员可以根据骨骼节点数的具体数据结构,采用本领域的常规广度优先搜索算法(Breadth-First-Search)或其各种优化变形,以获取处于同一高度处的所有节点,本申请对此不予限定。
参照图5所示的装置模块图,本申请所公开的基于Unity的可配置动画文件树形压缩装置可以包括以下模块:读取模块,用于读取Unity动画文件的内容,生成Unity动画文件内各个三维模型的骨骼节点树;配置模块,用于按照骨骼节点树本身的高度和各高度的节点数量,形成基于高度的精度压缩配置文件;压缩模块,用于遍历骨骼节点树的所有节点,并根据精度压缩配置文件压缩各节点;重建模块,用于根据压缩后的骨骼节点树,重建相应的三维模型以生成压缩后的Unity动画文件。
参照图2所示骨骼节点树的示意图,Unity动画文件在被读入以后,都生成如图所示的树形数据结构,以方便后继步骤对各节点中的数据进行检索和处理。其中,参照2图中所示,每根骨骼包含了以下三组参数:位移(position,包括x、y和z三个参数)、旋转(rotation,包括x、y、z和w四个参数)及缩放(scale,包括x、y和z三个参数),一共有10个浮点型数据(仅仅为了方便起见,图中仅示出整棵骨骼节点树的部件节点,及节点中的部分参数)。图中父节点的高度标记为0,与父节点直接相连的子节点高度为1,其他节点的高度如此类推。即骨骼节点树中高度越低的节点,其重要性及对精度的要求越高。此外,本领域技术人员应理解到,附图中的显示元件的数量和形状仅作为示例性的参考,不作为对本发明的限制。
一方面,因为父节点的骨骼是独立于子节点的骨骼而运动的,所以压缩子节点的骨骼的参数精度不会级联影响父节点的骨骼运动精度,从而最大限度的保留全体骨骼的运动精度;另一方面,由于子节点的骨骼在数量上远多于父节点的骨骼,因此对子节点的骨骼进行精度上的压缩将更为显著地压缩最后所得的Unity动画文件。
在本申请的上述一个或多个实施例中,所述配置模块还包括以下的子模块:统计模块,用于获取骨骼节点树本身的高度,并统计各个高度中节点的数量;初始化模块,用于以精度随着节点高度递降的方式初始化各个高度中的节点压缩度;微调模块,用于根据各个高度中节点的数量和Unity动画文件的目标压缩比率,微调各个高度的节点压缩度以形成最终压缩度;收集模块,用于收集各个高度的最终压缩度,形成相应的精度压缩配置文件。其中,每一个节点压缩度对应与浮点形数据中的一位有效数字,例如当19.654321这个浮点数以节点压缩度为1的文本方式存储时,其将被四舍五入为19.65432,然后再存储到文本中。换言之,浮点形数据的1个节点压缩度对应与4个存储字节。
针对上述子步骤,可以有多种的进一步优化。在本申请的上述一个或多个实施例中,各个高度中的节点压缩度是以节点压缩度随节点高度均匀变化的方式初始化的,使得不同层级的骨骼的精度是稳定递降的,从而保证压缩后整个骨骼尽可能平滑地运动。其中,节点压缩度随节点高度均匀变化的方式初始化不仅包括节点压缩度与节点高度是简单的线性递减关系(例如父节点的精度比子节点的压缩精度严格地比子节点小1),其还可以是如下这种分段递减的关系:高度为0和1的节点对应的节点压缩度为0;高度为2和3的节点对应的节点压缩度是1,如此类推(即高度为2n和2n+1的节点对应的节点压缩度为n,其中n是正整数)。
可替代地,在本申请的上述一个或多个实施例中,Unity动画文件的目标压缩比率预设在40%至50%之间。其中目标压缩比率是Unity动画文件压缩前后的体积比。在进一步的优选实施例中,这个比值可以是44%,以兼顾Unity动画文件的压缩效果和动画的细腻流畅程度。
在本申请的上述一个或多个实施例中,装置还可以下方式进行优化:在所述微调模块中,当需要进一步压缩以达至目标压缩比率时,微调是根据节点的高度从高到低逐步执行的;当需要减少压缩以提高三维模型精度时,微调是根据节点的高度从低到高逐步执行的。具体地,当对骨骼节点树进行初始化压缩后,可以估算其所生成Unity动画文件的压缩比率,并与目标压缩比率进行比较。当压缩比率高于目标压缩比率时,为了尽快达至目标压缩比率并减少对压缩后的Unity动画文件精度的影响,可从最高处的叶节点开始执行进一步的压缩。相反,当压缩比率低于目标压缩比率时,为了显著地提高压缩后的Unity动画文件精度并避免微调导致压缩比率高于目标压缩比率,可从最低处的根节点开始执行减少节点压缩度。
此外,为了减少上述算法的运算量以提高压缩的速度,可以如下的方式配置默认的精度压缩配置文件:与骨骼节点树的高度相等的叶节点压缩至5个字节;高度比骨骼节点树的高度小1的节点压缩至6个字节;高度比骨骼节点树的高度小2至4的节点压缩至7个字节;骨骼节点树的其余节点压缩至8个字节。可替代地,上述精度配置文件也可用于初始化各个高度中的节点压缩度。
在本申请的上述一个或多个实施例中,所述压缩模块还包括以下的子模块:遍历模块,用于按照广度优先方式遍历骨骼节点树,以获取骨骼节点树上处于同一高度的所有节点;执行模块,用于根据精度压缩配置文件,压缩处于同一高度的所有节点。由于处于同一高度的所有节点都具有相同的最终压缩度,因此S302的压缩步骤可以批量地执行,以加速上述算法的执行速度。本领域技术人员可以根据骨骼节点数的具体数据结构,采用本领域的常规广度优先搜索算法(Breadth-First-Search)或其各种优化变形,以获取处于同一高度处的所有节点,本申请对此不予限定。
应当认识到,本申请的实施例可以由计算机硬件、硬件和软件的组合、或者通过存储在非暂时性计算机可读存储器中的计算机指令来实现或实施。该方法可以使用标准编程技术-包括配置有计算机程序的非暂时性计算机可读存储介质在计算机程序中实现,其中如此配置的存储介质使得计算机以特定和预定义的方式操作——根据在具体实施例中描述的方法和附图。每个程序可以以高级过程或面向对象的编程语言来实现以与计算机系统通信。然而,若需要,该程序可以以汇编或机器语言实现。在任何情况下,该语言可以是编译或解释的语言。此外,为此目的该程序能够在编程的专用集成电路上运行。
进一步地,该方法可以在可操作地连接至合适的任何类型的计算平台中实现,包括但不限于个人电脑、迷你计算机、主框架、工作站、网络或分布式计算环境、单独的或集成的计算机平台、或者与带电粒子工具或其它成像装置通信等等。本申请的各方面可以以存储在非暂时性存储介质或设备上的机器可读代码来实现,无论是可移动的还是集成至计算平台,如硬盘、光学读取和/或写入存储介质、RAM、ROM等,使得其可由可编程计算机读取,当存储介质或设备由计算机读取时可用于配置和操作计算机以执行在此所描述的过程。此外,机器可读代码,或其部分可以通过有线或无线网络传输。当此类媒体包括结合微处理器或其他数据处理器实现上文该步骤的指令或程序时,本文所述的申请包括这些和其他不同类型的非暂时性计算机可读存储介质。当根据本申请所述的方法和技术编程时,本申请还包括计算机本身。
计算机程序能够应用于输入数据以执行本文所述的功能,从而转换输入数据以生成存储至非易失性存储器的输出数据。输出信息还可以应用于一个或多个输出设备如显示器。在本申请优选的实施例中,转换的数据表示物理和有形的对象,包括显示器上产生的物理和有形对象的特定视觉描绘。
其他变型在本申请的精神内。因此,尽管所公开的技术可容许各种修改和替代构造,但在附图中已示出并且在上文中详细描述所示的其某些实施例。然而,应当理解,并不意图将本申请局限于所公开的一种或多种具体形式;相反,其意图涵盖如所附权利要求书中所限定落在本申请的精神和范围内的所有修改、替代构造和等效物。