Beispiel #1
0
    private Transform getBoneByName(string name, Transform transform, bool first)
    {
        if (nameMap == null)
        {
            if (standardBoneNames)
            {
                Dictionary <Transform, string> boneMap;
                BVHRecorder.populateBoneMap(out boneMap, targetAvatar);
                nameMap = boneMap.ToDictionary(kp => flexibleName(kp.Value), kp => kp.Key);
            }
            else
            {
                nameMap = new Dictionary <string, Transform>();
            }
        }
        string targetName = flexibleName(name);

        if (renamingMap.ContainsKey(targetName))
        {
            targetName = renamingMap[targetName];
        }
        if (first)
        {
            if (flexibleName(transform.name) == targetName)
            {
                return(transform);
            }
            if (nameMap.ContainsKey(targetName) && nameMap[targetName] == transform)
            {
                return(transform);
            }
        }
        for (int i = 0; i < transform.childCount; i++)
        {
            Transform child = transform.GetChild(i);
            if (flexibleName(child.name) == targetName)
            {
                return(child);
            }
            if (nameMap.ContainsKey(targetName) && nameMap[targetName] == child)
            {
                return(child);
            }
        }
        throw new InvalidOperationException("Could not find bone \"" + name + "\" under bone \"" + transform.name + "\".");
    }
Beispiel #2
0
    public void loadAnimation()
    {
        getTargetAvatar();

        if (bp == null)
        {
            throw new InvalidOperationException("No BVH file has been parsed.");
        }

        //blend
        if (UseBlend)
        {
            if (bp2 == null)
            {
                throw new InvalidOperationException("No BVH2 file has been parsed.");
            }
            BlendBVH(ref bp.root, bp2.root);
        }

        if (nameMap == null)
        {
            if (standardBoneNames)
            {
                Dictionary <Transform, string> boneMap;
                BVHRecorder.populateBoneMap(out boneMap, targetAvatar);
                nameMap = boneMap.ToDictionary(kp => flexibleName(kp.Value), kp => kp.Key);
            }
            else
            {
                nameMap = new Dictionary <string, Transform>();
            }
        }

        renamingMap = new Dictionary <string, string>();
        foreach (FakeDictionary entry in boneRenamingMap)
        {
            if (entry.bvhName != "" && entry.targetName != "")
            {
                renamingMap.Add(flexibleName(entry.bvhName), flexibleName(entry.targetName));
            }
        }

        Queue <Transform> transforms = new Queue <Transform>();

        transforms.Enqueue(targetAvatar.transform);
        string targetName = flexibleName(bp.root.name);

        if (renamingMap.ContainsKey(targetName))
        {
            targetName = flexibleName(renamingMap[targetName]);
        }
        while (transforms.Any())
        {
            Transform transform = transforms.Dequeue();
            if (flexibleName(transform.name) == targetName)
            {
                rootBone = transform;
                break;
            }
            if (nameMap.ContainsKey(targetName) && nameMap[targetName] == transform)
            {
                rootBone = transform;
                break;
            }
            for (int i = 0; i < transform.childCount; i++)
            {
                transforms.Enqueue(transform.GetChild(i));
            }
        }
        if (rootBone == null)
        {
            rootBone = BVHRecorder.getRootBone(targetAvatar);
            Debug.LogWarning("Using \"" + rootBone.name + "\" as the root bone.");
        }
        if (rootBone == null)
        {
            throw new InvalidOperationException("No root bone \"" + bp.root.name + "\" found.");
        }
        if (UseBlend)
        {
            frames    = bp.frames;
            clip      = new AnimationClip();
            clip.name = "BVHClip (" + (clipCount++) + ")";
            if (clipName != "")
            {
                clip.name = clipName;
            }
            clip.legacy = true;
            prefix      = getPathBetween(rootBone, targetAvatar.transform, true, true);

            Vector3    targetAvatarPosition = targetAvatar.transform.position;
            Quaternion targetAvatarRotation = targetAvatar.transform.rotation;
            targetAvatar.transform.position = new Vector3(0.0f, 0.0f, 0.0f);
            targetAvatar.transform.rotation = Quaternion.identity;


            getCurves(prefix, bp.root, rootBone, true);
            targetAvatar.transform.position = targetAvatarPosition;
            targetAvatar.transform.rotation = targetAvatarRotation;

            clip.EnsureQuaternionContinuity();
            if (anim == null)
            {
                anim = targetAvatar.gameObject.GetComponent <Animation>();
                if (anim == null)
                {
                    anim = targetAvatar.gameObject.AddComponent <Animation>();
                }
            }
            string path = "Assets/" + clip.name + " - " + clipCount + ".anim";
            AssetDatabase.CreateAsset(clip, path);
            AssetDatabase.SaveAssets();
            anim.AddClip(clip, clip.name);
            anim.clip = clip;
            anim.playAutomatically = autoPlay;

            if (autoPlay)
            {
                anim.Play(clip.name);
            }
        }
    }