[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;
        
    }
 
已邀请:

要回复问题请先

商务合作
商务合作