[0]laya2.0有没有2d物理的ik解决方法啊
------------------------
自己实现了一个两个关节的ik
参考的是这个:IK学习笔记(2)——TwoBones IK_twoboneik 解法-CSDN博客
TwoBonesIK(target_pos:Vector3):void
{
var eps = 0.01;
var a :Vector3=new Vector3();
Vector3.subtract(this.m_bones_chain[1] , this.m_bones_chain[0],a) ; // AB 向量
var inv_a :Vector3=new Vector3();
Vector3.subtract(this.m_bones_chain[0],this.m_bones_chain[1],inv_a); // BA向量
var lab =Vector3.scalarLength(a);
var b:Vector3=new Vector3();
Vector3.subtract(this.m_bones_chain[2] , this.m_bones_chain[1],b); // BC 向量
var lbc = Vector3.scalarLength(b) ;
var c:Vector3=new Vector3();
Vector3.subtract(this.m_bones_chain[2], this.m_bones_chain[0],c); // AC 向量
var tar_dir:Vector3=new Vector3();
Vector3.subtract(target_pos , this.m_bones_chain[0],tar_dir); // AT向量
var lat = Vector3.scalarLength(tar_dir);
// 第一步:限制
if (lat <= eps)
{
lat = eps;
return
}
if (lat >= lab + lbc - eps)
{
lat = lab + lbc - eps;
return
}
// 第二步:计算初始状态的角度
Vector3.normalize(a,a);
Vector3.normalize(inv_a,inv_a);
Vector3.normalize(b,b);
Vector3.normalize(c,c);
Vector3.normalize(tar_dir,tar_dir);
var temp1 = (Vector3.dot(c,a)/ (Vector3.scalarLength(c) * Vector3.scalarLength(a)) );
if (temp1 <= -1.0) temp1 = -1.0;
if (temp1 >= 1.0) temp1 = 1.0;
var ac_ab_0 = Math.acos(temp1);
var temp2 = (Vector3.dot(inv_a,b)/(Vector3.scalarLength(inv_a) * Vector3.scalarLength(b)));
if (temp2 <= -1.0) temp2 = -1.0;
if (temp2 >= 1.0) temp2 = 1.0;
var ba_bc_0 = Math.acos(temp2);
// 最后一步旋转要用
var temp3 = (Vector3.dot(c,tar_dir) / (Vector3.scalarLength(c) * Vector3.scalarLength(tar_dir)));
if (temp3 <= -1.0) temp3 = -1.0;
if (temp3 >= 1.0) temp3 = 1.0;
var ac_at_0 = Math.acos(temp3);
// 第三步:计算|at|=|ac|时的新角度(余弦定理)
var temp4 = (lbc * lbc - lab * lab - lat * lat) / (-2 * lab * lat);
if (temp4 <= -1.0) temp4 = -1.0;
if (temp4 >= 1.0) temp4 = 1.0;
var ac_ab_1 = Math.acos(temp4);
var temp5 = (lat * lat - lab * lab - lbc * lbc) / (-2 * lab * lbc);
if (temp5 <= -1.0) temp5 = -1.0;
if (temp5 >= 1.0) temp5 = 1.0;
var ba_bc_1 = Math.acos(temp5);
//转动相应的角度
if(c.x*tar_dir.y-c.y*tar_dir.x<0)
{
ac_at_0=-ac_at_0;
}
//ac_at_0=-Math.PI+ac_at_0;
this.obj_1.rotation=this.obj_1.rotation+(ac_ab_1 - ac_ab_0+ac_at_0)*180/Math.PI;
this.obj_2.rotation=this.obj_2.rotation+(ba_bc_1-ba_bc_0)*180/Math.PI;
}
自己实现了一个两个关节的ik
参考的是这个:IK学习笔记(2)——TwoBones IK_twoboneik 解法-CSDN博客
TwoBonesIK(target_pos:Vector3):void
{
var eps = 0.01;
var a :Vector3=new Vector3();
Vector3.subtract(this.m_bones_chain[1] , this.m_bones_chain[0],a) ; // AB 向量
var inv_a :Vector3=new Vector3();
Vector3.subtract(this.m_bones_chain[0],this.m_bones_chain[1],inv_a); // BA向量
var lab =Vector3.scalarLength(a);
var b:Vector3=new Vector3();
Vector3.subtract(this.m_bones_chain[2] , this.m_bones_chain[1],b); // BC 向量
var lbc = Vector3.scalarLength(b) ;
var c:Vector3=new Vector3();
Vector3.subtract(this.m_bones_chain[2], this.m_bones_chain[0],c); // AC 向量
var tar_dir:Vector3=new Vector3();
Vector3.subtract(target_pos , this.m_bones_chain[0],tar_dir); // AT向量
var lat = Vector3.scalarLength(tar_dir);
// 第一步:限制
if (lat <= eps)
{
lat = eps;
return
}
if (lat >= lab + lbc - eps)
{
lat = lab + lbc - eps;
return
}
// 第二步:计算初始状态的角度
Vector3.normalize(a,a);
Vector3.normalize(inv_a,inv_a);
Vector3.normalize(b,b);
Vector3.normalize(c,c);
Vector3.normalize(tar_dir,tar_dir);
var temp1 = (Vector3.dot(c,a)/ (Vector3.scalarLength(c) * Vector3.scalarLength(a)) );
if (temp1 <= -1.0) temp1 = -1.0;
if (temp1 >= 1.0) temp1 = 1.0;
var ac_ab_0 = Math.acos(temp1);
var temp2 = (Vector3.dot(inv_a,b)/(Vector3.scalarLength(inv_a) * Vector3.scalarLength(b)));
if (temp2 <= -1.0) temp2 = -1.0;
if (temp2 >= 1.0) temp2 = 1.0;
var ba_bc_0 = Math.acos(temp2);
// 最后一步旋转要用
var temp3 = (Vector3.dot(c,tar_dir) / (Vector3.scalarLength(c) * Vector3.scalarLength(tar_dir)));
if (temp3 <= -1.0) temp3 = -1.0;
if (temp3 >= 1.0) temp3 = 1.0;
var ac_at_0 = Math.acos(temp3);
// 第三步:计算|at|=|ac|时的新角度(余弦定理)
var temp4 = (lbc * lbc - lab * lab - lat * lat) / (-2 * lab * lat);
if (temp4 <= -1.0) temp4 = -1.0;
if (temp4 >= 1.0) temp4 = 1.0;
var ac_ab_1 = Math.acos(temp4);
var temp5 = (lat * lat - lab * lab - lbc * lbc) / (-2 * lab * lbc);
if (temp5 <= -1.0) temp5 = -1.0;
if (temp5 >= 1.0) temp5 = 1.0;
var ba_bc_1 = Math.acos(temp5);
//转动相应的角度
if(c.x*tar_dir.y-c.y*tar_dir.x<0)
{
ac_at_0=-ac_at_0;
}
//ac_at_0=-Math.PI+ac_at_0;
this.obj_1.rotation=this.obj_1.rotation+(ac_ab_1 - ac_ab_0+ac_at_0)*180/Math.PI;
this.obj_2.rotation=this.obj_2.rotation+(ba_bc_1-ba_bc_0)*180/Math.PI;
}
没有找到相关结果
已邀请:
要回复问题请先登录
0 个回复