公开/公告号CN104318600A
专利类型发明专利
公开/公告日2015-01-28
原文格式PDF
申请/专利权人 无锡梵天信息技术股份有限公司;
申请/专利号CN201410530731.7
发明设计人 张翼;
申请日2014-10-10
分类号G06T13/40(20110101);
代理机构11249 北京中恒高博知识产权代理有限公司;
代理人姜万林
地址 214000 江苏省无锡市新区太科园传感网大学科技园立业楼E区711号
入库时间 2023-12-17 04:19:09
法律状态公告日
法律状态信息
法律状态
2018-01-16
授权
授权
2015-02-25
实质审查的生效 IPC(主分类):G06T13/40 申请日:20141010
实质审查的生效
2015-01-28
公开
公开
技术领域
本发明涉及计算机领域,具体地,涉及一种使用Bézier曲线实现角色行走轨迹动画的方法。
背景技术
计算机动画综合了计算机图像学特别是真实感图形生成技术,图像处理技术,运动控制原理,视频显示技术,还涉及到机器人学,人工智能学等领域。目前更多的把它作为计算机图像学的综合应用,在计算机动画中,需要用到设计物体的运动轨迹,在游戏里也一样,为了表现平滑的曲线运动。
目前在三维软件可以对角色动画的轨迹完成动作播放,需要通过第三方插件置入游戏中来完成,但是把这种角色的行走轨迹移植到自己研发的游戏引擎当中是不适用的。
在实现本发明的过程中,发明人发现现有技术中至少存在操作过程繁琐、成本高和适用范围小等缺陷。
发明内容
本发明的目的在于,针对上述问题,提出一种使用Bézier曲线实现角色行走轨迹动画的方法,以实现操作过程简洁、成本低和适用范围广的优点。
为实现上述目的,本发明采用的技术方案是:一种使用Bézier曲线实现角色行走轨迹动画的方法,主要包括:
a、把具有动画对象参数保存到一个动画通道或者多个动画通道中;
b、在每个动画通道里,为动画设定一系列关键帧来驱使在预设时刻动画的运动状态;
c、对每个通道中动画关键帧之间进行插值计算,得到角色沿着指定的曲线行走,形成逼真的角色动画效果。
进一步地,所述步骤a,具体包括:
在动画建模的时候,为每个角色动画设定关键帧数据;
将设定的关键帧数据保存到动画通道里;该关键帧数据,包含对象的旋转、平移、缩放和用户自定义参数。
进一步地,所述步骤b,具体包括:
动画的播放由对象模型的旋转、平移、缩放实现,每个动画通道中保存中对象模型三个坐标轴X、Y、Z的平移、旋转、缩放分量且每个通道独立使用,并能够任意组合以表达多维参数的动画;
关键帧动画中通道分为两类:贝塞尔型和电平型,对应保存贝塞尔帧BezierKey 和电平帧PulseKey,每个贝塞尔帧拥有左右控制点,能够控制贝塞尔插值的变化。
进一步地,所述步骤c,具体包括:
在任意t时刻,动画通道内的动画数值结果能够通过前述获得的贝塞尔曲线段来得到,若要使角色动画行走轨迹能够平滑过度,需要对贝塞尔曲线进行插值得到。
进一步地,所述插值算法如下:
由顶点P0,P1,P2,P3定义一条贝塞尔曲线,其中P(t)为t时间下的点坐标
对于任意时刻动画的贝塞尔曲线值为:
;
具体插值计算方法如下:
首先对两个关键帧之间采用二分法计算来判断该时刻的某一帧所在贝塞尔曲线的位置;
已知某时刻在贝塞尔在曲线上时间点为o点,在两个关键帧之间取中点,判断o点在中线的左边还是右边,经判断后该点位于第一次二分中线的左边;
然后依次取所在左边的中点进行判断,通常情况下,两个关键帧最大值划分值为32份已满足需求,最后依次取与o点相邻最近二分线和关键帧曲线的交点p和q,取p和q点连线的中点o’,那么此时的o’的值近似等于O点的值。
把角色动画的关键帧之间插值计算后,就可以得到角色沿着指定的曲线行走,从而形成了逼真的角色动画效果。
本发明各实施例的使用Bézier曲线实现角色行走轨迹动画的方法,由于主要包括:把具有动画对象参数保存到一个动画通道或者多个动画通道中;在每个动画通道里,为动画设定一系列关键帧来驱使在预设时刻动画的运动状态;对每个通道中动画关键帧之间进行插值计算,得到角色沿着指定的曲线行走,形成逼真的角色动画效果;从而可以克服现有技术中操作过程繁琐、成本高和适用范围小的缺陷,以实现操作过程简洁、成本低和适用范围广的优点。
本发明的其它特征和优点将在随后的说明书中阐述,并且,部分地从说明书中变得显而易见,或者通过实施本发明而了解。
下面通过附图和实施例,对本发明的技术方案做进一步的详细描述。
附图说明
附图用来提供对本发明的进一步理解,并且构成说明书的一部分,与本发明的实施例一起用于解释本发明,并不构成对本发明的限制。在附图中:
图1为本发明使用Bézier曲线实现角色行走轨迹动画的方法中程序中动画关键帧的继承关系示意图;
图2为本发明使用Bézier曲线实现角色行走轨迹动画的方法中贝塞尔曲线控制点的手柄示意图;
图3为本发明使用Bézier曲线实现角色行走轨迹动画的方法中二分法查找o帧在画面中的位置示意图;
图4为本发明使用Bézier曲线实现角色行走轨迹动画的方法中计算o帧处位置的简化图;
图5为本发明使用Bézier曲线实现角色行走轨迹动画的方法中Bézier曲线实现角色行走轨迹动画流程图。
具体实施方式
以下结合附图对本发明的优选实施例进行说明,应当理解,此处所描述的优选实施例仅用于说明和解释本发明,并不用于限定本发明。
贝塞尔(Bézier)曲线是一种以逼近为基础的参数曲线,它似乎有一组Bézier特征多边形来定义的,Bézier曲线总是通过第一个和最后一个控制点来完成的。曲线的始点和终点与该多边形的视点和终点重合,且多表现的第一条边和最后一条边分别表示了曲线在始点和终点处的切线矢量方向。曲线的形状趋于多边形,多边形可有其顶点来定义,这些顶点被称为控制点,只要给出控制点就可以生成一条贝塞尔曲线。
为了解决这个问题,本发明是利用曲线编辑来模拟角色行走轨迹的动画,如果给定物体的运动轨迹,求物体在某一帧画面中的位置,物体的运动轨迹都用参数样条线表示,那么参数和帧频有关系,必须对参数空间进行等间隔采样,利用曲线片段插值算法完成中间帧组成的整体动画。
根据本发明实施例,如图1-图5所示,提供了一种使用Bézier曲线实现角色行走轨迹动画的方法,尤其是涉及到利用曲线编辑来调节游戏中角色动画行走轨迹的方法。
在本发明的技术方案中,利用曲线编辑器来实现编辑角色轨迹动画的流程:
第一:把具有动画对象参数保存到一个动画通道或者多个动画通道里
在动画建模的时候,为了使动画按照我们的意愿进行播放,为每个角色动画设定关键帧数据,这些动画的参数包含对象的旋转、平移、缩放还有用户自定义参数等,然后把这些对象参数保存到动画通道里。
第二:每个动画通道中有一系列关键帧组成
在每个动画通道里,为动画设定一定的关键帧来驱使在某时刻动画的运动状态。
动画的播放是由对象模型的旋转、平移、缩放有关的,每个动画通道中保存中对象模型三个坐标轴X、Y、Z的平移、旋转、缩放分量且每个通道独立使用,并可以任意组合以表达多维参数的动画,例如相机的视角范围FOV参数如果做动画,就是一个贝塞尔通道,一个物体的位移动画,就是由3个贝塞尔通道分别代表x、y、z三个分量的动画,保存为动画通道中,例如对象的旋转和位移和缩放,以9个贝塞尔动画通道保存:
BezierChannel m_PosX;
BezierChannel m_PosY;
BezierChannel m_PosZ;
BezierChannel m_RotX;
BezierChannel m_RotY;
BezierChannel m_RotZ;
BezierChannel m_SclX;
BezierChannel m_SclY;
BezierChannel m_SclZ;
在实际应用过程中,角色对象的缩放是不予考虑的,我们只对对象的旋转和位移进行研究。
本发明的实现的关键帧动画中通道分为两类:贝塞尔型和电平型,对应保存贝塞尔帧(BezierKey) 和电平帧(PulseKey),每个贝塞尔帧拥有左右控制点,可控制贝塞尔插值的变化。电平帧则如同电平线,用于描述电平信号式变化的动画,在游戏中用来模拟角色对象是否“着地”动画。
其中贝塞尔帧和电平帧都是动画帧(AnimationKey)的子类。
每个贝塞尔通道都保存着各自独立的一系列动画关键帧,可通过函数BOOL BuildBezierChain(std::vector<Simple2DBezier>& vOutBeziers);获得一个贝塞尔通道中由关键帧组成的多段贝塞尔曲线段,即:一条曲线可以在任意点切割成两条或者任意多条子曲线,每一条曲线仍是贝塞尔曲线。本发明技术方案描述的是贝塞尔曲线对角色轨迹动画的设置,对电平帧不多做研究。
第三,对动画关键帧之间进行插值计算。
在任意t时刻,动画通道内的动画数值结果可以通过前述获得的贝塞尔曲线段来得到,若要使角色动画行走轨迹能够平滑过度,需要对贝塞尔曲线进行插值得到。
其插值算法如下:
如图2我们把P0 和P3作为关键帧的插入点,那么P0帧的右手柄和P3的左手柄分别代表P1和P2,以此作为三次贝塞尔放方程的四个点来控制曲线的插值变化。本发明采用的是三次Bézier曲线,这种曲线表达能力强,形状控制方便,同时避免了由于高阶多项式带来的计算了的增加。
由顶点P0,P1,P2,P3 可定义一条贝塞尔曲线,其中P(t)为t时间下的点坐标
对于任意时刻动画的贝塞尔曲线值为:
;
具体插值计算方法如下:
首先我们对两个关键帧之间采用二分法计算来判断该时刻的某一帧所在贝塞尔曲线的位置。
已知某时刻在贝塞尔在曲线上时间点为o点,在两个关键帧之间取中点,判断o点在中线的左边还是右边,经判断后该点位于第一次二分中线的左边(如图3),然后依次取所在左边的中点进行判断,通常情况下,两个关键帧最大值划分值为32份已满足需求,最后依次取与o点相邻最近二分线和关键帧曲线的交点p和q,图4所示中,取p和q 点连线的中点o’,那么此时的o’的值近似等于O点的值。
具体的求值函数如下
float GetValueAtTime(float fTime);
//对物体的位移的取值,实际上是对X、Y、Z分量的通道的组合求值
D3DXVECTOR3 GetPos(float fTime)
{
D3DXVECTOR3 v3dPos;
v3dPos.x = m_PosX.GetKeyCount() ? m_PosX.GetValueAtTime(fTime) : m_defaultPos.x;
v3dPos.y = m_PosY.GetKeyCount() ? m_PosY.GetValueAtTime(fTime) : m_defaultPos.y;
v3dPos.z = m_PosZ.GetKeyCount() ? m_PosZ.GetValueAtTime(fTime) : m_defaultPos.z;
return v3dPos;//返回角色对象组合位移值
}
//对物体的旋转取值,实际上是对X,Y,Z分量的通道的组合求值
D3DXVECTOR3 GetRot(float fTime)
{ D3DXVECTOR3 v3dRot;
v3dRot.x = SMath::AngleToRadians( m_RotX.GetKeyCount() ? m_RotX.GetValueAtTime(fTime) : m_defaultRot.x );
v3dRot.y = SMath::AngleToRadians( m_RotY.GetKeyCount() ? m_RotY.GetValueAtTime(fTime) : m_defaultRot.y );
v3dRot.z = SMath::AngleToRadians( m_RotZ.GetKeyCount() ? m_RotZ.GetValueAtTime(fTime) : m_defaultRot.z );
return v3dRot; //返回角色对象组合旋转值
}
综上所述,把角色动画的关键帧之间插值计算后,就可以得到角色沿着指定的曲线行走,从而形成了逼真的角色动画效果。
本发明的技术方案,把角色行走的轨迹的关键帧动画利用曲线参数编辑方式完成,至少可以达到的有益效果包括:⑴有更大的自由度来控制曲线形状,进而控制角色的轨迹动画;⑵利用贝塞尔曲线简化了计算,可以用矢量或者矩阵表示几何分量;⑶对动画轨迹控制更加直观。
最后应说明的是:以上所述仅为本发明的优选实施例而已,并不用于限制本发明,尽管参照前述实施例对本发明进行了详细的说明,对于本领域的技术人员来说,其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换。凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。
机译: 实时使用动画角色实现至少两个通信设备之间通信的方法和系统
机译: 实时使用动画角色实现至少两个通信设备之间通信的方法和系统
机译: 实时使用动画角色实现至少两个通信设备之间通信的方法和系统