试图在Unity3D中使用反向运动学来让角色把手放在他的枪上

时间:2016-12-22 09:20:27

标签: animation unity3d inverse-kinematics

正如你所看到的那样,双手正好被放在角色面前。右手柄和左手柄是游戏对象,其手的位置应该继续。

左侧截图处于播放模式,中间截图不是,所以没有IK。 screenshots 源代码(改编自统一示例):

void OnAnimatorIK(int layerIndex) {
    float aim = 1f;

    if (layerIndex == 0) {
        if (player != null) {
            Vector3 target = player.transform.GetChild(0).position + Vector3.up;

            animator.SetLookAtPosition(target);
            animator.SetLookAtWeight(aim, 0.5f, 0.5f, 0.0f, 0.5f);

        }
    }

    if (layerIndex == 1) {
        if (leftHandOnGunPosition != null) {
            animator.SetIKPosition(AvatarIKGoal.LeftHand, leftHandOnGunPosition.transform.position);
            animator.SetIKRotation(AvatarIKGoal.LeftHand, leftHandOnGunPosition.transform.rotation);
            animator.SetIKPositionWeight(AvatarIKGoal.LeftHand, aim);
            animator.SetIKRotationWeight(AvatarIKGoal.LeftHand, aim);
        }

        if (rightHandOnGunPosition != null) {
            animator.SetIKPosition(AvatarIKGoal.RightHand, rightHandOnGunPosition.transform.position);
            animator.SetIKRotation(AvatarIKGoal.RightHand, rightHandOnGunPosition.transform.rotation);
            animator.SetIKPositionWeight(AvatarIKGoal.RightHand, aim);
            animator.SetIKRotationWeight(AvatarIKGoal.RightHand, aim);
        }
    }
}

谁能告诉我我做错了什么?

更新: 我只是注意到右手比左手更向前。就像枪上的位置一样。为了测试,我换出了手的目标位置,然后左边是右手的前方。所以它肯定会试图将手移到正确的位置......只是没有完全到达那里。

UPDATE2: 我也尝试关闭lookat东西(if(layerIndex == 0))中的所有内容,只是为了确保不会搞砸任何东西。没有区别,除了不再看球员。

1 个答案:

答案 0 :(得分:1)

好吧,似乎问题在于,当我添加模型时,它与它所处的导航相比太高了。所以我在navmeshagent和模型之间制作了一个儿童游戏对象,并给它ay为-1。 / p>

我可以通过将+ Vector3.up添加到IK位置来临时修复IK。

正确的解决办法是删除y--1之间的子项,然后将navmeshagent中的基本偏移从1更改为0.