public override void Read() { // lazy way to match bones. string[] name = new string[] { "Hips", "Spine", "Spine1", "Spine2", "Neck", "Head", "LeftShoulder", "LeftArm", "LeftForeArm", "LeftHand", "RightShoulder", "RightArm", "RightForeArm", "RightHand", "LeftUpLeg", "LeftLeg", "LeftFoot", "LeftToeBase", "RightUpLeg", "RightLeg", "RightFoot", "RightToeBase" }; Vector3[] positions = new Vector3[name.Length]; Vector3[] forwards = new Vector3[name.Length]; Vector3[] upwards = new Vector3[name.Length]; Vector3[] velocities = new Vector3[name.Length]; for (int i = 0; i < positions.Length; i++) { positions[i] = NeuralNetwork.ReadVector3(); forwards[i] = NeuralNetwork.ReadVector3().normalized; upwards[i] = NeuralNetwork.ReadVector3().normalized; velocities[i] = NeuralNetwork.ReadVector3(); } for (int i = 0; i < positions.Length; i++) { Actor.Bone bone = Actor.FindBoneContains(name[i]); bone.Transform.position = positions[i]; bone.Transform.rotation = Quaternion.LookRotation(forwards[i], upwards[i]); } }
public void AutoMap() { Map = new BoneMap[Data.Root.Bones.Length]; for (int i = 0; i < Data.Root.Bones.Length; i++) { Map[i].BvhBoneName = Data.Root.Bones[i].Name; string name = Data.Root.Bones[i].Name; if (!Data.Mirrored) { if (name.Contains("Left")) { name = name.Replace("Left", "Right"); } else if (name.Contains("Right")) { name = name.Replace("Right", "Left"); } } Actor.Bone bone = GetActor().FindBoneContains(name); if (bone == null) { Map[i].ActorBoneTransform = null; } else { Map[i].ActorBoneTransform = bone.Transform; } } }
private float FootSliding(Actor.Bone foot, Vector3 previousFootPosition) { //Array.Find(Actor.Bones, x => x.Transform.name == "LeftHandSite").Velocity.x Vector3 velocity = (foot.Transform.position - previousFootPosition) / Time.deltaTime; float magnitude = new Vector3(velocity.x, 0f, velocity.z).magnitude; float footHeight = foot.Transform.position.y - Utility.GetHeight(foot.Transform.position, AnimationAuthoring.GetControlPoint(AnimationAuthoring.RefTimestamp, 0).Ground); float threshold = 0.025f; float s = magnitude * (2f - Mathf.Pow(2, Mathf.Clamp(footHeight / threshold, 0f, 1f))); return(s); }
//public void ParticleIK() //{ //} private void SetChainIndices(int index) { int[] indices = new int[0]; Actor.Bone root = MyActor.Bones[Chains[index].RootIndex]; Actor.Bone effector = MyActor.Bones[Chains[index].EffectorIndex]; Actor.Bone current = effector; while (current != root) { ArrayExtensions.Add(ref indices, current.Index); current = MyActor.Bones[current.Parent]; } ArrayExtensions.Add(ref indices, root.Index); Array.Reverse(indices, 0, indices.Length); Chains[index].JointIndices = indices; }
public void CCDSolver(int index) { Vector3 targetPos = Chains[index].TargetObject.transform.position; Vector3 localEffectorPos = Vector3.zero; Vector3 localTargetPos = Vector3.zero; Actor.Bone root = MyActor.Bones[Chains[index].RootIndex]; Actor.Bone effector = MyActor.Bones[Chains[index].EffectorIndex]; for (int itr = 0; itr < MaxItr; itr++) { for (Actor.Bone joint = MyActor.Bones[effector.Parent]; joint != null; joint = MyActor.Bones[joint.Parent]) { Vector3 effectorPos = effector.Transform.position; Matrix4x4 worldToLocal = joint.Transform.worldToLocalMatrix; localEffectorPos = worldToLocal.MultiplyPoint(effectorPos); localTargetPos = worldToLocal.MultiplyPoint(targetPos); Vector3 toEffectorNorm = Vector3.Normalize(localEffectorPos); Vector3 toTargetNorm = Vector3.Normalize(localTargetPos); float rotationAngle = Vector3.Angle(toEffectorNorm, toTargetNorm); if (rotationAngle > 1.0e-5f) { Vector3 rotationAxis = Vector3.Cross(toEffectorNorm, toTargetNorm); rotationAxis.Normalize(); joint.Transform.rotation = Quaternion.AngleAxis(rotationAngle, rotationAxis) * joint.Transform.rotation; } if (joint == root) { break; } } if (Vector3.Distance(localEffectorPos, localTargetPos) < ErrThrehold) { return; } } }