反向动力学 matlab IK,基于3D反向动力学IK算法的研究

摘 要:反向动力学中CCD算法具有局限性,分析几何法应用于多自由度骨骼具有不可收敛性,而微分求解主要运用于小幅度的变化, 因此利用雅可比矩阵使骨骼具有收敛性,将分析几何法与微分求解法融合,实验结果表明,IK反向动力学算法的改进很有意义。

关键词: 3D图形学; IK反向动力学; 微分求解算法

肢体运动学的研究往往混略掉人们自身运动的特性或者引起运动的真正原因。参考文献[1]综述了随着计算机的发展,虚拟人技术不断改进,新兴的3D场景图建模是计算机图形学处理三维世界发展的多层次数据结构,但由于机器人等运动学模型受外部约束以及内部节点的限制,很难实现一些舒服的姿势和动作。参考文献[2]主要对虚拟人技术的运动算法实现进行了研究;参考文献[3]也对虚拟人技术运动算法做了研究,并提出反向动力学的思想,但都未对反向动力学算法带来的问题进行解决。反向动力学是被开发来解决这些运动约束的图形处理方法的分支,以模型叶节点为起点来计算根节点信息的方法[4]。

简单地说,IK(Inverse Kinematics)算法就是首先确定末端骨骼的位置信息,根据末端骨骼的位置信息反向推导出该骨骼继承链上N级父亲骨骼的位置信息。通过这种方法指定角色的“姿势”,即首先把渲染的角色表示成骨骼关节结构,所谓的姿势表示成由此构成的夹角,包括状态向量θ以及节点的方向向量和位置。对于IK算法,基本公式是:

θ=f-1(X) (1)

其中,X通常是最末端骨骼位置信息,用此算法来计算满足条件的θ。

参考文献[5]阐述了IK算法在计算机动画中的应用,并重点研究了7个自由度骨骼的运动,但对奇异点病态方程的问题没有提出有效的解决方法。

当前的计算机图形学中,所有角色动画简单地由正向动力学算法计算已经不能满足动画逼真性的需求,一些游戏中正向动力学遇到很多问题,即使花大量时间也是很难去消除或协调的[6]。针对时效的问题,参考文献[6]对反向动力学算法应用在多处理器中进行了研究,对速降法也提供了一些支持。近些年,随着实时算法的发展,反向动力学越来越显得不可缺少。本文主要通过几何分析法与微分求解法的融合,使IK反向动力学算法有效摒弃CCD速降法带来的算法不收敛性。CCD速降法对每个关节的限制会造成关节限制的制约束的合并,尤其是末端链仅仅产生移动,使画面产生不自然的感觉。针对这一问题,首先通过几何分析法来确定关节位置,局部采用微分求解法,并且在微分求解过程中引入稀疏矩阵来寻找并处理奇异点的问题。参考文献[7]、[8]提及的渲染技术,利用HLSL语言进行画面的模拟。

1 几何分析法算法的研究

实现IK算法,目前应用最多的是CCD(Cyclic Coordinate Descent)。这是一个迭代算法,通过多次迭代向目标解逐步接近,通常5~10次就会得到很好的效果,绝大多数情况下骨骼的目标位置都会收敛到理想位置。但通常CCD算法的每一步都需要启发式的构造,并且骨骼之间的关节不能任意角度旋转。另一个问题是,当所有骨骼在一条直线上时,每一个骨骼都会认为自身不再需要旋转,CCD的迭代算法会失效。相对于CCD算法,常用到的几何分析法能够很快地得到骨骼的目标位置信息,可以一步算出目标位置,有效地摒弃了CCD算法迭代的效率问题。但是几何分析法也存在不足,即对于结构稍微比较复杂的框架骨骼,会得到无数多的解。

在IK反向动力学算法中,对于一个N级骨骼链,其N级父亲骨骼信息T是相对于N-1级子骨骼信息T相对运动,相对于末端骨骼信息,可简单表示为:

676319be446554fc3935304c630ce1d1.gif

7566cc48624f71c927a0c51ab51a2cbc.gif

这里的α是斜率。对于关节权重的αi取值为一确定值矩阵的一列,并且值∈(0,1),确保?驻H的收敛性。然而,并非所有骨骼都可以旋转无限制角度,以三链臂为例,θ1∈[-90,90],θ2∈[0,110],θ3∈[-20,20]。对每个不同位置的关节控制在可允许的范围内,这样,计算出的位置幅度范围小,得出值的过程较快,并且同时确保了骨架姿势的逼真性。

4 实验结果

利用C#代码、Direct9.0和HLSL渲染技术,在Visual Studio 2010环境下进行实验,部分代码如下(包括位置信息、骨骼权重和法线位置等)。

VS_OUTPUT Transform(

float4 inputPosition : POSITION,

float3 inputNormal : NORMAL,

float2 inputTexCoord :TEXCOORD0,

float4 weights : TEXCOORD1,

float4 bones : TEXCOORD2

)

{

VS_OUTPUT Out = (VS_OUTPUT)0;

float4 pos=mul(inputPosition, Local);

pos=mul(pos,BoneMatrices[(int)bones.x])*weights.x+

mul(pos,BoneMatrices[(int)bones.y])*weights.y+

mul(pos, BoneMatrices[(int)bones.z])*weights.z+

mul(pos,BoneMatrices[(int)bones.w])*weights.w;

Out.Pos = mul(pos, WorldViewProjection);

Out.Normal =mul(inputNormal,World);

Out.Texcoord = inputTexCoord;

Out.EyeDir = EyePosition - Out.Pos;

Out.Direction = LightPosition -Out.Pos;

return Out;

}

实验结果如图1所示。

00b8c5e78e894f3b9de132dfcd9f48d5.gif

还没注册? 现在免费注册,您即可: ?阅读所有技术文章及下载网站资料; ?定期获得业界最新资讯及设计实例; ?拥有个人空间参与网站及客户活动; ?撰写博客与业界朋友交流分享经验; 已经注册? 登录阅览全部精彩内容 用户名: 密码:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值