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