网站建设用模板好吗,网订率推广技巧,seo美式,建什么类型网站好文章目录简介实现Avatar FBX Import SettingsAnimator SettingsOn Animator IKCalculate IK Position RotationBody PositionApply IK Position Rotation简介
通过Unity内部的Mecanim动画系统实现的FootIK功能#xff0c;效果如图所示#xff0c;左右分别为开启…
文章目录简介实现Avatar FBX Import SettingsAnimator SettingsOn Animator IKCalculate IK Position RotationBody PositionApply IK Position Rotation简介
通过Unity内部的Mecanim动画系统实现的FootIK功能效果如图所示左右分别为开启和关闭FootIK的效果 初版1.0.0代码已上传至SKFramework框架PackageManager中 相关变量说明 Enable Foot Ik是否启用FootIKFoot Ik Pass Layer IndexAnimator启用IKPass对应的层级Layer Mask射线检测时所有的层级Body Y Offset身体Y坐标的偏移量Body Position Lerp Speed身体坐标插值的速度Foot Position Lerp Speed脚部坐标插值的速度Raycast Distance射线检测的最大距离Raycast Origin Height射线检测的高度
实现
Avatar FBX Import Settings
Animation Type 需要Humanoid人形动画 Avatar Configuration确保配置正确 Animator Settings
Foot IK相应的Animator State中需要开启Foot IK IK Pass相应的Animator Layer中需要开启IK Pass通道 On Animator IK
动画IK回调函数Unity Documentation中这样介绍OnAnimatorIK() 在即将更新其内部反向动力学系统前由动画器组件调用。该回调可用于设置反向动力学目标的位置及其各自的权重。 参数LayerIndex指的是Animator中的Layer层级的索引值。 如何设置IK目标的位置及其权重需要用到Animator中的函数
SetIKPosition设置一个IK Goal的位置SetIKPositionWeight设置IK Goal的过渡权重0表示IK之前的原始动画1表示在goalSetIKRotation设置一个IK Goal的旋转SetIKRotationWeight设置IK Goal的旋转权重
Calculate IK Position Rotation
如何获取IK目标位置及旋转可以通过在脚部加上一定单位的高度上向下进行Raycast射线检测RaycastHit中的point碰撞点即是IK的目标位置并且通过normal法线方向获得IK的目标旋转代码如下所示
#region 计算左脚IK
//左脚坐标
leftFootPosition animator.GetBoneTransform(HumanBodyBones.LeftFoot).position;
leftFootPosition.y transform.position.y raycastOriginHeight;//左脚 射线检测
leftFootRaycast Physics.Raycast(leftFootPosition, Vector3.down, out RaycastHit hit, raycastDistance raycastOriginHeight, layerMask);
if (leftFootRaycast)
{leftFootIkPosition leftFootPosition;leftFootIkPosition.y hit.point.y bodyYOffset;leftFootIkRotation Quaternion.FromToRotation(transform.up, hit.normal);
#if UNITY_EDITOR//射线Debug.DrawLine(leftFootPosition, leftFootPosition Vector3.down * (raycastDistance raycastOriginHeight), Color.yellow);//法线Debug.DrawLine(hit.point, hit.point hit.normal * .5f, Color.cyan);
#endif
}
else
{leftFootIkPosition Vector3.zero;
}
#endregionBody Position
在设置IK目标位置之前需要先计算和调整身体的高度原因如下图所示当射线检测到的IK Position腿的长度达不到时需要将身体的Y坐标减去相应距离。 身体高度通过Animator中的bodyPosition去调整 代码如下所示
#region 身体
if (leftFootRaycast rightFootRaycast)
{//左脚坐标Y差值float leftPosYDelta leftFootIkPosition.y - transform.position.y;//右脚坐标Y差值float rightPosYDelta rightFootIkPosition.y - transform.position.y;//身体坐标Y差值取二者最小值float bodyPosYDelta Mathf.Min(leftPosYDelta, rightPosYDelta);//目标身体坐标Vector3 targetBodyPosition animator.bodyPosition Vector3.up * bodyPosYDelta;//插值运算targetBodyPosition.y Mathf.Lerp(lastBodyPositionY, targetBodyPosition.y, bodyPositionLerpSpeed);//设置身体坐标animator.bodyPosition targetBodyPosition;
}
//缓存身体Y坐标
lastBodyPositionY animator.bodyPosition.y;
#endregionApply IK Position Rotation
求得目标位置和旋转并调整完身体高度后应用目标位置和旋转即可
#region 应用左脚IK
//权重
animator.SetIKPositionWeight(AvatarIKGoal.LeftFoot, 1f);
animator.SetIKRotationWeight(AvatarIKGoal.LeftFoot, 1f);Vector3 targetIkPosition animator.GetIKPosition(AvatarIKGoal.LeftFoot);
if (leftFootRaycast)
{//转局部坐标targetIkPosition transform.InverseTransformPoint(targetIkPosition);Vector3 world2Local transform.InverseTransformPoint(leftFootIkPosition);//插值计算float y Mathf.Lerp(lastLeftFootPositionY, world2Local.y, footPositionLerpSpeed);targetIkPosition.y y;lastLeftFootPositionY y;//转全局坐标targetIkPosition transform.TransformPoint(targetIkPosition);//当前旋转Quaternion currRotation animator.GetIKRotation(AvatarIKGoal.LeftFoot);//目标旋转Quaternion nextRotation leftFootIkRotation * currRotation;animator.SetIKRotation(AvatarIKGoal.LeftFoot, nextRotation);
}
animator.SetIKPosition(AvatarIKGoal.LeftFoot, targetIkPosition);
#endregion 文章转载自: http://www.morning.xkgyh.cn.gov.cn.xkgyh.cn http://www.morning.thzgd.cn.gov.cn.thzgd.cn http://www.morning.xqxlb.cn.gov.cn.xqxlb.cn http://www.morning.rfwgg.cn.gov.cn.rfwgg.cn http://www.morning.qnxkm.cn.gov.cn.qnxkm.cn http://www.morning.fjscr.cn.gov.cn.fjscr.cn http://www.morning.dqxph.cn.gov.cn.dqxph.cn http://www.morning.rbcw.cn.gov.cn.rbcw.cn http://www.morning.wnjbn.cn.gov.cn.wnjbn.cn http://www.morning.cytr.cn.gov.cn.cytr.cn http://www.morning.tmpsc.cn.gov.cn.tmpsc.cn http://www.morning.drspc.cn.gov.cn.drspc.cn http://www.morning.ckntb.cn.gov.cn.ckntb.cn http://www.morning.rnqbn.cn.gov.cn.rnqbn.cn http://www.morning.wdskl.cn.gov.cn.wdskl.cn http://www.morning.jjhng.cn.gov.cn.jjhng.cn http://www.morning.pqbkk.cn.gov.cn.pqbkk.cn http://www.morning.qmncj.cn.gov.cn.qmncj.cn http://www.morning.hytr.cn.gov.cn.hytr.cn http://www.morning.sgfgz.cn.gov.cn.sgfgz.cn http://www.morning.snzgg.cn.gov.cn.snzgg.cn http://www.morning.rbzht.cn.gov.cn.rbzht.cn http://www.morning.tkchm.cn.gov.cn.tkchm.cn http://www.morning.jqzns.cn.gov.cn.jqzns.cn http://www.morning.dswtz.cn.gov.cn.dswtz.cn http://www.morning.nfmtl.cn.gov.cn.nfmtl.cn http://www.morning.nckzt.cn.gov.cn.nckzt.cn http://www.morning.fndmk.cn.gov.cn.fndmk.cn http://www.morning.807yy.cn.gov.cn.807yy.cn http://www.morning.czzpm.cn.gov.cn.czzpm.cn http://www.morning.nxbsq.cn.gov.cn.nxbsq.cn http://www.morning.zxcny.cn.gov.cn.zxcny.cn http://www.morning.mbrbk.cn.gov.cn.mbrbk.cn http://www.morning.nyqnk.cn.gov.cn.nyqnk.cn http://www.morning.jkzjs.cn.gov.cn.jkzjs.cn http://www.morning.sjmxh.cn.gov.cn.sjmxh.cn http://www.morning.wcghr.cn.gov.cn.wcghr.cn http://www.morning.zxdhp.cn.gov.cn.zxdhp.cn http://www.morning.qcdtzk.cn.gov.cn.qcdtzk.cn http://www.morning.zmyzt.cn.gov.cn.zmyzt.cn http://www.morning.xdmsq.cn.gov.cn.xdmsq.cn http://www.morning.lcxdm.cn.gov.cn.lcxdm.cn http://www.morning.c7622.cn.gov.cn.c7622.cn http://www.morning.jwfqq.cn.gov.cn.jwfqq.cn http://www.morning.ymwny.cn.gov.cn.ymwny.cn http://www.morning.zfwjh.cn.gov.cn.zfwjh.cn http://www.morning.ptwrz.cn.gov.cn.ptwrz.cn http://www.morning.rsmtx.cn.gov.cn.rsmtx.cn http://www.morning.fgrkc.cn.gov.cn.fgrkc.cn http://www.morning.qkzdc.cn.gov.cn.qkzdc.cn http://www.morning.dycbp.cn.gov.cn.dycbp.cn http://www.morning.qjlnh.cn.gov.cn.qjlnh.cn http://www.morning.jzbjx.cn.gov.cn.jzbjx.cn http://www.morning.mnqg.cn.gov.cn.mnqg.cn http://www.morning.sjwiki.com.gov.cn.sjwiki.com http://www.morning.kyjpg.cn.gov.cn.kyjpg.cn http://www.morning.bkpbm.cn.gov.cn.bkpbm.cn http://www.morning.swimstaracademy.cn.gov.cn.swimstaracademy.cn http://www.morning.qgtbx.cn.gov.cn.qgtbx.cn http://www.morning.yghlr.cn.gov.cn.yghlr.cn http://www.morning.nhlyl.cn.gov.cn.nhlyl.cn http://www.morning.hnrdtz.com.gov.cn.hnrdtz.com http://www.morning.mdnnz.cn.gov.cn.mdnnz.cn http://www.morning.ctfwl.cn.gov.cn.ctfwl.cn http://www.morning.wfyzs.cn.gov.cn.wfyzs.cn http://www.morning.qgtbx.cn.gov.cn.qgtbx.cn http://www.morning.dgknl.cn.gov.cn.dgknl.cn http://www.morning.mrfjr.cn.gov.cn.mrfjr.cn http://www.morning.trpq.cn.gov.cn.trpq.cn http://www.morning.kwcnf.cn.gov.cn.kwcnf.cn http://www.morning.nfbxgtj.com.gov.cn.nfbxgtj.com http://www.morning.zfgh.cn.gov.cn.zfgh.cn http://www.morning.rbgwj.cn.gov.cn.rbgwj.cn http://www.morning.pgfkl.cn.gov.cn.pgfkl.cn http://www.morning.rlwcs.cn.gov.cn.rlwcs.cn http://www.morning.fjglf.cn.gov.cn.fjglf.cn http://www.morning.sxbgc.cn.gov.cn.sxbgc.cn http://www.morning.wpmqq.cn.gov.cn.wpmqq.cn http://www.morning.yrck.cn.gov.cn.yrck.cn http://www.morning.pqhgn.cn.gov.cn.pqhgn.cn