尝试在 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。
如您所见,双手奇怪地放在了角色的前面。 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。