Esempio n. 1
0
    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]);
        }
    }
Esempio n. 2
0
    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;
            }
        }
    }
Esempio n. 3
0
        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);
        }
Esempio n. 4
0
    //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;
    }
Esempio n. 5
0
    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;
            }
        }
    }