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); }
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; }
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); }
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)); } }
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--; } } }
// 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--; } }
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); } } }
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); } } }
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()); }
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); } } }
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); }
// 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>(); }
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); } } }
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(); // } }
/* * 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; }