骨骼节点过少会导致Animator在播放某些动作时模型发生过度扭曲,为了解决这些问题,通常会增加骨骼数量,来执行扭曲矫正。但在使用Hunamoid骨骼时,这些额外增加的骨骼会被Unity忽略掉,导致扭曲矫正失效。在下图中可以看出,位于Hand与LowerArm之间的1号骨骼和位于LowerArm与UpperArm之间的2号骨骼被Unity忽略掉了。
你好,这个问题是由于额外增加的骨骼被Unity忽略导致的。解决这个问题的方法是将额外的骨骼添加到Humanoid骨骼模型中。具体步骤如下:
这样,你的模型就会包含所有骨骼,并且可以正确执行扭曲矫正。
以下是示例代码:
using UnityEngine;
public class AddBonesToHumanoid : MonoBehaviour
{
public GameObject[] extraBones;
private void Start()
{
var avatar = GetComponent<Animator>().avatar;
var skeleton = avatar.humanDescription.skeleton;
foreach (var bone in extraBones)
{
var parent = skeleton[bone.transform.parent.name];
var index = parent.children.Length;
var name = bone.name;
var position = bone.transform.localPosition;
var rotation = bone.transform.localRotation;
avatar.humanDescription.AddBone(new HumanBone
{
boneName = name,
humanName = name,
limit = new HumanLimit(),
limit.useDefaultValues = true,
axisLength = 0f,
axis = Vector3.zero,
anchor = position,
rotation = rotation.eulerAngles,
parentName = parent.boneName,
boneIndex = skeleton.Length + index,
});
}
avatar.humanDescription.upperArmTwist = 0.5f;
avatar.humanDescription.lowerArmTwist = 0.5f;
avatar.humanDescription.upperLegTwist = 0.5f;
avatar.humanDescription.lowerLegTwist = 0.5f;
avatar.humanDescription.armStretch = 0.05f;
avatar.humanDescription.legStretch = 0.05f;
avatar.humanDescription.feetSpacing = 0f;
}
}
在这个示例代码中,我们将额外的骨骼添加到Humanoid骨骼中。我们首先获取模型的Avatar和骨骼信息,然后遍历所有额外的骨骼,并将它们添加到Humanoid骨骼中。最后,我们设置一些Humanoid参数,以确保正确的扭曲矫正。