示例#1
0
    public Trajectory GetTrajectory(bool mirrored)
    {
        StyleModule styleModule = Data.GetModule(Module.TYPE.Style) == null ? null : (StyleModule)Data.GetModule(Module.TYPE.Style);
        PhaseModule phaseModule = Data.GetModule(Module.TYPE.Phase) == null ? null : (PhaseModule)Data.GetModule(Module.TYPE.Phase);

        Trajectory trajectory = new Trajectory(12, styleModule == null ? 0 : styleModule.Functions.Length);

        //Current
        trajectory.Points[6].SetTransformation(GetRootTransformation(mirrored));
        trajectory.Points[6].SetVelocity(GetRootVelocity(mirrored));
        trajectory.Points[6].SetSpeed(GetSpeed(mirrored));
        trajectory.Points[6].Styles = styleModule == null ? new float[0] : styleModule.GetStyle(this);
        trajectory.Points[6].Phase  = phaseModule == null ? 0f : phaseModule.GetPhase(this, mirrored);

        //Past
        for (int i = 0; i < 6; i++)
        {
            float delta = -1f + (float)i / 6f;
            if (Timestamp + delta < 0f)
            {
                float pivot     = -Timestamp - delta;
                float clamped   = Mathf.Clamp(pivot, 0f, Data.GetTotalTime());
                float ratio     = pivot == clamped ? 1f : Mathf.Abs(pivot / clamped);
                Frame reference = Data.GetFrame(clamped);
                trajectory.Points[i].SetPosition(Data.GetFirstFrame().GetRootPosition(mirrored) - ratio * (reference.GetRootPosition(mirrored) - Data.GetFirstFrame().GetRootPosition(mirrored)));
                trajectory.Points[i].SetRotation(reference.GetRootRotation(mirrored));
                trajectory.Points[i].SetVelocity(reference.GetRootVelocity(mirrored));
                trajectory.Points[i].SetSpeed(reference.GetSpeed(mirrored));
                trajectory.Points[i].Styles = styleModule == null ? new float[0] : styleModule.GetStyle(reference);
                trajectory.Points[i].Phase  = phaseModule == null ? 0f : 1f - phaseModule.GetPhase(reference, mirrored);
            }
            else
            {
                Frame previous = Data.GetFrame(Mathf.Clamp(Timestamp + delta, 0f, Data.GetTotalTime()));
                trajectory.Points[i].SetTransformation(previous.GetRootTransformation(mirrored));
                trajectory.Points[i].SetVelocity(previous.GetRootVelocity(mirrored));
                trajectory.Points[i].SetSpeed(previous.GetSpeed(mirrored));
                trajectory.Points[i].Styles = styleModule == null ? new float[0] : styleModule.GetStyle(previous);
                trajectory.Points[i].Phase  = phaseModule == null ? 0f : phaseModule.GetPhase(previous, mirrored);
            }
        }

        //Future
        for (int i = 1; i <= 5; i++)
        {
            float delta = (float)i / 5f;
            if (Timestamp + delta > Data.GetTotalTime())
            {
                float pivot     = 2f * Data.GetTotalTime() - Timestamp - delta;
                float clamped   = Mathf.Clamp(pivot, 0f, Data.GetTotalTime());
                float ratio     = pivot == clamped ?1f : Mathf.Abs((Data.GetTotalTime() - pivot) / (Data.GetTotalTime() - clamped));
                Frame reference = Data.GetFrame(clamped);
                trajectory.Points[6 + i].SetPosition(Data.GetLastFrame().GetRootPosition(mirrored) - ratio * (reference.GetRootPosition(mirrored) - Data.GetLastFrame().GetRootPosition(mirrored)));
                trajectory.Points[6 + i].SetRotation(reference.GetRootRotation(mirrored));
                trajectory.Points[6 + i].SetVelocity(reference.GetRootVelocity(mirrored));
                trajectory.Points[6 + i].SetSpeed(reference.GetSpeed(mirrored));
                trajectory.Points[6 + i].Styles = styleModule == null ? new float[0] : styleModule.GetStyle(reference);
                trajectory.Points[6 + i].Phase  = phaseModule == null ? 0f : 1f - phaseModule.GetPhase(reference, mirrored);
            }
            else
            {
                Frame future = Data.GetFrame(Mathf.Clamp(Timestamp + delta, 0f, Data.GetTotalTime()));
                trajectory.Points[6 + i].SetTransformation(future.GetRootTransformation(mirrored));
                trajectory.Points[6 + i].SetVelocity(future.GetRootVelocity(mirrored));
                trajectory.Points[6 + i].SetSpeed(future.GetSpeed(mirrored));
                trajectory.Points[6 + i].Styles = styleModule == null ? new float[0] : styleModule.GetStyle(future);
                trajectory.Points[6 + i].Phase  = phaseModule == null ? 0f : phaseModule.GetPhase(future, mirrored);
            }
        }

        return(trajectory);
    }
示例#2
0
    private IEnumerator ImportMotionData()
    {
        string destination = "Assets/" + Destination;

        if (!AssetDatabase.IsValidFolder(destination))
        {
            Debug.Log("Folder " + "'" + destination + "'" + " is not valid.");
        }
        else
        {
            Importing = true;
            for (int f = 0; f < Files.Length; f++)
            {
                if (Files[f].Import)
                {
                    if (AssetDatabase.LoadAssetAtPath(destination + "/" + Files[f].Object.Name + ".asset", typeof(MotionData)) == null)
                    {
                        MotionData data = ScriptableObject.CreateInstance <MotionData>();
                        data.name = Files[f].Object.Name;
                        AssetDatabase.CreateAsset(data, destination + "/" + data.name + ".asset");

                        string[] lines      = System.IO.File.ReadAllLines(Files[f].Object.FullName);
                        char[]   whitespace = new char[] { ' ' };
                        int      index      = 0;

                        //Create Source Data
                        List <Vector3> offsets  = new List <Vector3>();
                        List <int[]>   channels = new List <int[]>();
                        List <float[]> motions  = new List <float[]>();
                        data.Source = new MotionData.Hierarchy();
                        string  name    = string.Empty;
                        string  parent  = string.Empty;
                        Vector3 offset  = Vector3.zero;
                        int[]   channel = null;
                        for (index = 0; index < lines.Length; index++)
                        {
                            if (lines[index] == "MOTION")
                            {
                                break;
                            }
                            string[] entries = lines[index].Split(whitespace);
                            for (int entry = 0; entry < entries.Length; entry++)
                            {
                                if (entries[entry].Contains("ROOT"))
                                {
                                    parent = "None";
                                    name   = entries[entry + 1];
                                    break;
                                }
                                else if (entries[entry].Contains("JOINT"))
                                {
                                    parent = name;
                                    name   = entries[entry + 1];
                                    break;
                                }
                                else if (entries[entry].Contains("End"))
                                {
                                    parent = name;
                                    name   = name + entries[entry + 1];
                                    string[] subEntries = lines[index + 2].Split(whitespace);
                                    for (int subEntry = 0; subEntry < subEntries.Length; subEntry++)
                                    {
                                        if (subEntries[subEntry].Contains("OFFSET"))
                                        {
                                            offset.x = Utility.ReadFloat(subEntries[subEntry + 1]);
                                            offset.y = Utility.ReadFloat(subEntries[subEntry + 2]);
                                            offset.z = Utility.ReadFloat(subEntries[subEntry + 3]);
                                            break;
                                        }
                                    }
                                    data.Source.AddBone(name, parent);
                                    offsets.Add(offset);
                                    channels.Add(new int[0]);
                                    index += 2;
                                    break;
                                }
                                else if (entries[entry].Contains("OFFSET"))
                                {
                                    offset.x = Utility.ReadFloat(entries[entry + 1]);
                                    offset.y = Utility.ReadFloat(entries[entry + 2]);
                                    offset.z = Utility.ReadFloat(entries[entry + 3]);
                                    break;
                                }
                                else if (entries[entry].Contains("CHANNELS"))
                                {
                                    channel = new int[Utility.ReadInt(entries[entry + 1])];
                                    for (int i = 0; i < channel.Length; i++)
                                    {
                                        if (entries[entry + 2 + i] == "Xposition")
                                        {
                                            channel[i] = 1;
                                        }
                                        else if (entries[entry + 2 + i] == "Yposition")
                                        {
                                            channel[i] = 2;
                                        }
                                        else if (entries[entry + 2 + i] == "Zposition")
                                        {
                                            channel[i] = 3;
                                        }
                                        else if (entries[entry + 2 + i] == "Xrotation")
                                        {
                                            channel[i] = 4;
                                        }
                                        else if (entries[entry + 2 + i] == "Yrotation")
                                        {
                                            channel[i] = 5;
                                        }
                                        else if (entries[entry + 2 + i] == "Zrotation")
                                        {
                                            channel[i] = 6;
                                        }
                                    }
                                    data.Source.AddBone(name, parent);
                                    offsets.Add(offset);
                                    channels.Add(channel);
                                    break;
                                }
                                else if (entries[entry].Contains("}"))
                                {
                                    name   = parent;
                                    parent = name == "None" ? "None" : data.Source.FindBone(name).Parent;
                                    break;
                                }
                            }
                        }

                        //REMOVE LATER
                        //data.Corrections = new Vector3[data.Source.Bones.Length];
                        //

                        //Set Frames
                        index += 1;
                        while (lines[index].Length == 0)
                        {
                            index += 1;
                        }
                        ArrayExtensions.Resize(ref data.Frames, Utility.ReadInt(lines[index].Substring(8)));

                        //Set Framerate
                        index         += 1;
                        data.Framerate = Mathf.RoundToInt(1f / Utility.ReadFloat(lines[index].Substring(12)));

                        //Compute Frames
                        index += 1;
                        for (int i = index; i < lines.Length; i++)
                        {
                            motions.Add(Utility.ReadArray(lines[i]));
                        }
                        for (int k = 0; k < data.GetTotalFrames(); k++)
                        {
                            data.Frames[k] = new Frame(data, k + 1, (float)k / data.Framerate);
                            int idx = 0;
                            for (int i = 0; i < data.Source.Bones.Length; i++)
                            {
                                MotionData.Hierarchy.Bone info = data.Source.Bones[i];
                                Vector3    position            = Vector3.zero;
                                Quaternion rotation            = Quaternion.identity;
                                for (int j = 0; j < channels[i].Length; j++)
                                {
                                    if (channels[i][j] == 1)
                                    {
                                        position.x = motions[k][idx]; idx += 1;
                                    }
                                    if (channels[i][j] == 2)
                                    {
                                        position.y = motions[k][idx]; idx += 1;
                                    }
                                    if (channels[i][j] == 3)
                                    {
                                        position.z = motions[k][idx]; idx += 1;
                                    }
                                    if (channels[i][j] == 4)
                                    {
                                        rotation *= Quaternion.AngleAxis(motions[k][idx], Vector3.right); idx += 1;
                                    }
                                    if (channels[i][j] == 5)
                                    {
                                        rotation *= Quaternion.AngleAxis(motions[k][idx], Vector3.up); idx += 1;
                                    }
                                    if (channels[i][j] == 6)
                                    {
                                        rotation *= Quaternion.AngleAxis(motions[k][idx], Vector3.forward); idx += 1;
                                    }
                                }

                                position = (position == Vector3.zero ? offsets[i] : position) / 100f;                                 //unit scale
                                data.Frames[k].Local[i] = Matrix4x4.TRS(position, rotation, Vector3.one);
                                data.Frames[k].World[i] = info.Parent == "None" ? data.Frames[k].Local[i] : data.Frames[k].World[data.Source.FindBone(info.Parent).Index] * data.Frames[k].Local[i];
                            }

                            /*
                             * for(int i=0; i<data.Source.Bones.Length; i++) {
                             *      data.Frames[k].Local[i] *= Matrix4x4.TRS(Vector3.zero, Quaternion.Euler(data.Corrections[i]), Vector3.one);
                             *      data.Frames[k].World[i] *= Matrix4x4.TRS(Vector3.zero, Quaternion.Euler(data.Corrections[i]), Vector3.one);
                             * }
                             */
                        }

                        if (data.GetTotalFrames() == 1)
                        {
                            Frame reference = data.GetFirstFrame();
                            ArrayExtensions.Resize(ref data.Frames, Mathf.RoundToInt(data.Framerate));
                            for (int k = 0; k < data.GetTotalFrames(); k++)
                            {
                                data.Frames[k]       = new Frame(data, k + 1, (float)k / data.Framerate);
                                data.Frames[k].Local = (Matrix4x4[])reference.Local.Clone();
                                data.Frames[k].World = (Matrix4x4[])reference.World.Clone();
                            }
                        }

                        //Finalise
                        data.DetectSymmetry();
                        data.AddSequence();

                        //Save
                        EditorUtility.SetDirty(data);
                    }
                    else
                    {
                        Debug.Log("File with name " + Files[f].Object.Name + " already exists.");
                    }

                    yield return(new WaitForSeconds(0f));
                }
            }
            AssetDatabase.SaveAssets();
            AssetDatabase.Refresh();
            Importing = false;
        }
        yield return(new WaitForSeconds(0f));
    }