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

Trying to use Inverse Kinematics in Unity3D to make character put hands on his gun

如您所见,双手奇怪地放在了角色的前面。 righthandhold 和 lefthandhold 是游戏对象,其手应该继续的位置。

左边的截图是播放模式,中间的截图不是,所以那里没有 IK。 源代码(改编自统一示例):

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);
        }
    }
}

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

更新: 我只是注意到右手比左手更靠前。就像枪支上的位置一样。为了测试,我换掉了手的目标位置,然后左手在右手前面。所以它肯定会尝试将指针移动到正确的位置......只是没有完全到达那里。

更新2: 我还尝试关闭 lookat 的东西(if (layerIndex == 0) 中的所有东西),只是为了确保没有搞砸任何事情。没有任何区别,只是不再看玩家了。

好吧,似乎问题是当我添加模型时,它与它所在的 navmeshagent 相比太高了。所以我在 navmeshagent 和模型之间创建了一个子游戏对象,并给它一个 -1 的 y .

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

正确的解决方案是删除带有 y -1 的中间子项,然后将 navmeshagent 中的基本偏移量从 1 更改为 0。