Ejemplo n.º 1
0
 public BoneViewModel(RigEditorViewModel rig, IHaveBones parent, RigResource.RigResource.Bone bone, BoneManager manager)
 {
     if (rig == null)
     {
         throw new ArgumentNullException("rig");
     }
     if (bone == null)
     {
         throw new ArgumentNullException("bone");
     }
     if (manager == null)
     {
         throw new ArgumentNullException("manager");
     }
     mRig      = rig;
     mChildren = new ObservableCollection <BoneViewModel>();
     mParent   = parent;
     mBone     = bone;
     mManager  = manager;
     foreach (RigResource.RigResource.Bone b in manager.GetChildren(mBone))
     {
         mChildren.Add(new BoneViewModel(mRig, this, b, mManager));
     }
     mRotation                  = new EulerAngle(new Quaternion(bone.Orientation.A, bone.Orientation.B, bone.Orientation.C, bone.Orientation.D));
     manager.BoneAdded         += OnBoneAdded;
     manager.BoneRemoved       += OnBoneRemoved;
     manager.BoneParentChanged += OnBoneParentChanged;
     mSetOppositeCommand        = new UserCommand <BoneViewModel>(x => true, ExecuteSetOpposite);
 }
Ejemplo n.º 2
0
        public RigEditorViewModel(RigResource.RigResource rig)
        {
            rig.ResourceChanged += OnResourceChanged;
            mIsSaving            = false;
            mChildren            = new ObservableCollection <BoneViewModel>();
            mRig           = rig;
            mManager       = new BoneManager();
            mManager.Bones = mRig.Bones;
            foreach (RigResource.RigResource.Bone bone in mRig.Bones)
            {
                if (bone.ParentBoneIndex == -1)
                {
                    mChildren.Add(new BoneViewModel(this, this, bone, mManager));
                }
            }
            mManager.BoneAdded         += OnBoneAdded;
            mManager.BoneRemoved       += OnBoneRemoved;
            mManager.BoneParentChanged += OnBoneParentChanged;
            AddBoneCommand              = new UserCommand <RigEditorViewModel>(x => true, y => y.Manager.AddBone(new RigResource.RigResource.Bone(0, null), null));
            GetMatrixInfoCommand        = new UserCommand <RigEditorViewModel>(x => true, ExecuteMatrixInfo);
            CommitCommand = new UserCommand <RigEditorViewModel>(x => true, y =>
            {
                mIsSaving = true;
                Application.Current.Shutdown();
            });
            CancelCommand = new UserCommand <RigEditorViewModel>(x => true, y =>
            {
                mIsSaving = false;
                Application.Current.Shutdown();
            });
            IResourceKey key = new TGIBlock(0, null);

            key.ResourceType = 0x00000000;
        }
Ejemplo n.º 3
0
        private static Matrix GetAbsoluteTransform(BoneManager manager, RigResource.RigResource.Bone b)
        {
            var transforms = new List <Matrix>();

            while (b != null)
            {
                var    q = new Quaternion(b.Orientation.A, b.Orientation.B, b.Orientation.C, b.Orientation.D);
                var    p = new Vector3(b.Position.X, b.Position.Y, b.Position.Z);
                var    s = new Vector3(b.Scaling.X, b.Scaling.Y, b.Scaling.Z);
                Matrix t = Matrix.CreateTransformMatrix(q, s, p);
                transforms.Add(t);
                b = manager.GetParent(b);
            }
            transforms.Reverse();
            Matrix absolute = transforms[0];

            transforms.RemoveAt(0);
            while (transforms.Count > 0)
            {
                Matrix m = transforms[0];
                transforms.RemoveAt(0);
                absolute = absolute * m;
            }
            return(absolute);
        }
Ejemplo n.º 4
0
 private void OnBoneAdded(BoneManager sender, BoneActionEventArgs e)
 {
     RigResource.RigResource.Bone parent = sender.GetParent(e.Bone);
     if (parent != null && parent.Equals(mBone))
     {
         mChildren.Add(new BoneViewModel(mRig, this, e.Bone, sender));
     }
 }
Ejemplo n.º 5
0
    void DoCCD()
    {
        if (!slowMode)
        {
            if (bs.boneList.Count > 0)
            {
                for (int i = bs.boneList.Count - 1; i >= 0; i--)
                {
                    GameObject  curBone    = bs.boneList[i];
                    BoneManager cbbm       = curBone.GetComponent <BoneManager>();
                    Vector3     axisToSnap = targetLoc - curBone.transform.position;
                    Vector3     eeAxis     = bs.endEffectorPos - curBone.transform.position;
                    Vector3     rotAxis    = Vector3.Cross(eeAxis, axisToSnap).normalized;
                    float       rotAngle   = Vector3.SignedAngle(eeAxis, axisToSnap, rotAxis);
                    Debug.Log(rotAngle);
                    curBone.transform.Rotate(rotAxis, rotAngle, Space.World);

                    for (int j = i; j < bs.boneList.Count - 1; j++)
                    {
                        GameObject prevBone = bs.boneList[j];
                        GameObject propBone = bs.boneList[j + 1];
                        propBone.transform.Rotate(rotAxis, rotAngle, Space.World);
                        propBone.transform.position = prevBone.GetComponent <BoneManager>().endEffectorWorldPos;
                    }
                }
            }
        }
        else
        {
            if (bs.boneList.Count > 0 && Time.time - slowModeTime > timeDelay)
            {
                slowModeTime = Time.time;
                if (bonePos < 0 || bonePos >= bs.boneList.Count)
                {
                    bonePos = bs.boneList.Count - 1;
                }
                GameObject  curBone    = bs.boneList[bonePos];
                BoneManager cbbm       = curBone.GetComponent <BoneManager>();
                Vector3     axisToSnap = targetLoc - curBone.transform.position;
                Vector3     eeAxis     = bs.endEffectorPos - curBone.transform.position;
                Vector3     rotAxis    = Vector3.Cross(eeAxis, axisToSnap).normalized;
                float       rotAngle   = Vector3.SignedAngle(eeAxis, axisToSnap, rotAxis);
                Debug.Log(rotAngle);
                curBone.transform.Rotate(rotAxis, rotAngle, Space.World);

                for (int j = bonePos; j < bs.boneList.Count - 1; j++)
                {
                    GameObject prevBone = bs.boneList[j];
                    GameObject propBone = bs.boneList[j + 1];
                    propBone.transform.Rotate(rotAxis, rotAngle, Space.World);
                    propBone.transform.position = prevBone.GetComponent <BoneManager>().endEffectorWorldPos;
                }
                bonePos--;
            }
        }
    }
Ejemplo n.º 6
0
 // Update is called once per frame
 void Update()
 {
     if (Input.GetKeyDown(KeyCode.F))
     {
         bonesLength += .1f;
         delayStart   = Time.time;
     }
     else if (Input.GetKeyDown(KeyCode.V))
     {
         if (bonesLength - .1f > .09f)
         {
             bonesLength -= .1f;
         }
         delayStart = Time.time;
     }
     if (Input.GetKey(KeyCode.F) && Time.time - delayStart > addDelay)
     {
         bonesLength += .1f;
     }
     else if (Input.GetKey(KeyCode.V) && bonesLength - .1f > .09f && Time.time - delayStart > addDelay)
     {
         bonesLength -= .1f;
     }
     if (Input.GetKeyDown(KeyCode.Z))
     {
         GameObject  thisBone = GameObject.Instantiate(bonePrefab);
         BoneManager tbm      = thisBone.GetComponent <BoneManager>();
         tbm.boneLength = bonesLength;
         if (lastBone != null)
         {
             thisBone.transform.position = lastbm.endEffectorWorldPos;
         }
         boneList.Add(thisBone);
         lastBone = thisBone;
         lastbm   = lastBone.GetComponent <BoneManager>();
         boneCount++;
     }
     if (Input.GetKeyDown(KeyCode.C) && lastBone != null)
     {
         int lbidx = boneList.IndexOf(lastBone);
         lastbm = null;
         boneList.RemoveAt(lbidx);
         GameObject.Destroy(lastBone);
         if (boneList.Count == 0)
         {
             lastBone = null;
         }
         else
         {
             lastBone = boneList[lbidx - 1];
             lastbm   = lastBone.GetComponent <BoneManager>();
         }
         boneCount--;
     }
 }
Ejemplo n.º 7
0
 private void OnBoneRemoved(BoneManager sender, BoneActionEventArgs e)
 {
     RigResource.RigResource.Bone parent = sender.GetParent(e.Bone);
     if (parent != null && parent.Equals(mBone))
     {
         BoneViewModel child = mChildren.FirstOrDefault(x => x.Bone == e.Bone);
         if (child != null)
         {
             mChildren.Remove(child);
         }
     }
 }
Ejemplo n.º 8
0
 private void OnBoneRemoved(BoneManager sender, BoneActionEventArgs e)
 {
     RigResource.RigResource.Bone parent = sender.GetParent(e.Bone);
     if (parent == null)
     {
         BoneViewModel view = mChildren.FirstOrDefault(x => x.Bone == e.Bone);
         if (view != null)
         {
             mChildren.Remove(view);
         }
     }
 }
Ejemplo n.º 9
0
        private static void GetInfo(BoneManager manager, RigResource.RigResource.Bone bone, StringBuilder sb)
        {
            Matrix t  = GetAbsoluteTransform(manager, bone);
            Matrix ti = t.GetInverse();

            sb.AppendLine("============================");
            sb.AppendFormat("Name:\t{0}\r\n", bone.Name);
            sb.AppendFormat("Hashed:\t0x{0:X8}\r\n", FNV32.GetHash(bone.Name));
            sb.AppendLine("Absolute Transform (RSLT):");
            sb.AppendLine(t.TransposedString());
            sb.AppendLine("Absolute Transform Inverse (SKIN):");
            sb.AppendLine(ti.ToString());
        }
Ejemplo n.º 10
0
 private void OnBoneAdded(BoneManager sender, BoneActionEventArgs e)
 {
     RigResource.RigResource.Bone parent = sender.GetParent(e.Bone);
     if (parent == null)
     {
         BoneViewModel view = mChildren.FirstOrDefault(x => x.Bone == e.Bone);
         if (view == null)
         {
             var vm = new BoneViewModel(this, this, e.Bone, sender);
             vm.Opposite = mManager.Bones.IndexOf(e.Bone);
             mChildren.Add(vm);
         }
     }
 }
Ejemplo n.º 11
0
    List <Vector3> GetRotationAxes()
    {
        List <Vector3> res = new List <Vector3>();

        for (int i = 0; i < bs.boneList.Count; i++)
        {
            GameObject  curBone    = bs.boneList[i];
            BoneManager cbbm       = curBone.GetComponent <BoneManager>();
            Vector3     axisToSnap = targetLoc - curBone.transform.position;
            Vector3     eeAxis     = bs.endEffectorPos - curBone.transform.position;
            res.Add(Vector3.Cross(eeAxis, axisToSnap).normalized);
        }
        return(res);
    }
Ejemplo n.º 12
0
    // Start is called before the first frame update
    void Start()
    {
        //initialize static instance
        if (instance == null)
        {
            instance = this;
        }
        else
        {
            Destroy(this);
        }

        //initialize bone list
        //boneList = new List<GameObject>();
    }
Ejemplo n.º 13
0
        private void OnBoneParentChanged(BoneManager sender, BoneActionEventArgs e)
        {
            RigResource.RigResource.Bone parent = sender.GetParent(e.Bone);
            BoneViewModel child = mChildren.FirstOrDefault(x => x.Bone == e.Bone);

            if (parent == null)
            {
                if (child == null)
                {
                    mChildren.Add(new BoneViewModel(this, this, e.Bone, sender));
                }
            }
            else
            {
                if (child != null)
                {
                    mChildren.Remove(child);
                }
            }
        }
Ejemplo n.º 14
0
        public BoneExportViewModel(RigResource.RigResource.Bone bone, BoneManager manager)
        {
            mIsChecked = bone.Name.Contains("slot");
            Bone       = bone;
            mChildren  = manager.GetChildren(bone).Select(x => new BoneExportViewModel(x, manager));
//            if (bone.Name.Contains("ROOT"))
//            {
//                Thread t = null;
//                t = new Thread(
//                    delegate
//                        {
//                            while (t.IsAlive)
//                            {
//                                Thread.Sleep(new Random().Next(10000));
//                                IsChecked = !IsChecked;
//                            }
//                        });
//                t.Start();
//            }
        }
Ejemplo n.º 15
0
    /*
     * List<Vector3> GetPseudoInverse()
     * {
     * }
     *
     * void DoJPI()
     * {
     *  if (slowMode)
     *  {
     *      if (Time.time - slowModeTime > timeDelay)
     *      {
     *          slowModeTime = Time.time;
     *      }
     *      else
     *      {
     *          return;
     *      }
     *  }
     *  if(bs.boneList.Count > 0)
     *  {
     *      List<Vector3> axes = GetRotationAxes();
     *      List<Vector3> jacobian = GetJacobian();
     *  }
     * }
     *
     * void DoDPI()
     * {
     *
     * }*/

    void DoFABRIK()
    {
        if (!slowMode)
        {
            if (bs.boneList.Count > 0)
            {
                Vector3 homeLoc = Vector3.zero;
                for (int i = bs.boneList.Count - 1; i >= 0; i--)
                {
                    GameObject  curBone = bs.boneList[i];
                    BoneManager cbbm    = curBone.GetComponent <BoneManager>();
                    Vector3     axisToSnap;
                    Vector3     snapPos;
                    if (i == bs.boneList.Count - 1)
                    {
                        axisToSnap = targetLoc - curBone.transform.position;
                        snapPos    = targetLoc;
                    }
                    else
                    {
                        GameObject nextBone = bs.boneList[i + 1];
                        axisToSnap = nextBone.transform.position - curBone.transform.position;
                        snapPos    = nextBone.transform.position;
                    }
                    if (i == 0)
                    {
                        homeLoc = curBone.transform.position;
                    }
                    Vector3 eeAxis   = cbbm.endEffectorWorldPos - curBone.transform.position;
                    Vector3 rotAxis  = Vector3.Cross(eeAxis, axisToSnap).normalized;
                    float   rotAngle = Vector3.SignedAngle(eeAxis, axisToSnap, rotAxis);
                    curBone.transform.Rotate(rotAxis, rotAngle, Space.World);

                    eeAxis = cbbm.endEffectorWorldPos - curBone.transform.position;
                    curBone.transform.position = snapPos - eeAxis;
                }
                for (int i = 0; i < bs.boneList.Count; i++)
                {
                    GameObject  curBone    = bs.boneList[i];
                    BoneManager cbbm       = curBone.GetComponent <BoneManager>();
                    Vector3     axisToSnap = cbbm.endEffectorWorldPos - homeLoc;
                    Vector3     snapPos    = homeLoc;
                    Vector3     eeAxis     = cbbm.endEffectorWorldPos - curBone.transform.position;
                    Vector3     rotAxis    = Vector3.Cross(eeAxis, axisToSnap).normalized;
                    float       rotAngle   = Vector3.SignedAngle(eeAxis, axisToSnap, rotAxis);
                    curBone.transform.Rotate(rotAxis, rotAngle, Space.World);
                    curBone.transform.position = snapPos;
                    homeLoc = cbbm.endEffectorWorldPos;
                }
            }
        }
        else
        {
            if (bs.boneList.Count > 0 && Time.time - slowModeTime > timeDelay)
            {
                slowModeTime = Time.time;
                if (bonePos < 0)
                {
                    bonePos    = 0;
                    isBackprop = false;
                }
                else if (bonePos >= bs.boneList.Count)
                {
                    bonePos    = bs.boneList.Count - 1;
                    isBackprop = true;
                }
                if (isBackprop)
                {
                    GameObject  curBone = bs.boneList[bonePos];
                    BoneManager cbbm    = curBone.GetComponent <BoneManager>();
                    Vector3     axisToSnap;
                    Vector3     snapPos;
                    if (bonePos == bs.boneList.Count - 1)
                    {
                        axisToSnap = targetLoc - curBone.transform.position;
                        snapPos    = targetLoc;
                    }
                    else
                    {
                        GameObject nextBone = bs.boneList[bonePos + 1];
                        axisToSnap = nextBone.transform.position - curBone.transform.position;
                        snapPos    = nextBone.transform.position;
                    }
                    if (bonePos == 0)
                    {
                        stepHomeLoc = curBone.transform.position;
                    }
                    Vector3 eeAxis   = cbbm.endEffectorWorldPos - curBone.transform.position;
                    Vector3 rotAxis  = Vector3.Cross(eeAxis, axisToSnap).normalized;
                    float   rotAngle = Vector3.SignedAngle(eeAxis, axisToSnap, rotAxis);
                    curBone.transform.Rotate(rotAxis, rotAngle, Space.World);

                    eeAxis = cbbm.endEffectorWorldPos - curBone.transform.position;
                    curBone.transform.position = snapPos - eeAxis;
                    bonePos--;
                }
                else
                {
                    GameObject  curBone    = bs.boneList[bonePos];
                    BoneManager cbbm       = curBone.GetComponent <BoneManager>();
                    Vector3     axisToSnap = cbbm.endEffectorWorldPos - stepHomeLoc;
                    Vector3     snapPos    = stepHomeLoc;
                    Vector3     eeAxis     = cbbm.endEffectorWorldPos - curBone.transform.position;
                    Vector3     rotAxis    = Vector3.Cross(eeAxis, axisToSnap).normalized;
                    float       rotAngle   = Vector3.SignedAngle(eeAxis, axisToSnap, rotAxis);
                    curBone.transform.Rotate(rotAxis, rotAngle, Space.World);
                    curBone.transform.position = snapPos;
                    stepHomeLoc = cbbm.endEffectorWorldPos;
                    bonePos++;
                }
            }
        }
    }
 public SkeletonExportViewModel(BoneManager manager)
 {
     mChildren = manager.Bones.Where(x => x.ParentBoneIndex == -1).Select(x => new BoneExportViewModel(x, manager));
     mManager  = manager;
 }