Exemplo n.º 1
0
        public void FindComparingNames()
        {
            List <Transform> reprs = new List <Transform>();

            searchForReprsUnderThese.ForEach(x => reprs.AddRange(x.GetComponentsInChildren <Transform>(true)));

            List <Transform> reprsOfPoint;

            for (int p = 0; p < points.Count; p++)
            {
                if (points[p].endsWith == "")
                {
                    continue;
                }

                reprsOfPoint = reprs.FindAll(r => r.name.ToLower().EndsWith(points[p].endsWith.ToLower()));

                for (int r = 0; r < reprsOfPoint.Count; r++)
                {
                    ReprModel reprModel = reprsOfPoint[r].GetComponent <ReprModel>();
                    if (reprModel != null && !points[p].representations.Contains(reprModel))
                    {
                        points[p].representations.Add(reprModel);
                    }
                    else
                    {
                        Debug.LogWarning(reprsOfPoint[r].name + " does not have a ReprModel attached!");
                    }
                }
            }
        }
Exemplo n.º 2
0
        void UpdateBoneTsfPos(ReprModel repr, Transform applyToThis, AbstractTsf inputData, float maxSpeed, Transform referenceTsf, Transform replicatedTsf)
        {
            AvatarController avatarCtrl = repr.point.bone.part.body.avatar.controller;

            Vector3 desiredWorldPos;

            if (inputData.space == Space.World)
            {
                desiredWorldPos = inputData.position;
            }
            else
            {
                desiredWorldPos = avatarCtrl.GetWorldFromLocalPoition(inputData.position, repr);
            }

            if (referenceTsf && replicatedTsf)
            {
                Vector3 relPos = referenceTsf.InverseTransformPoint(desiredWorldPos);
                desiredWorldPos = replicatedTsf.TransformPoint(relPos);
            }

            if (maxSpeed > 0.0f)
            {
                applyToThis.position += Vector3.ClampMagnitude(desiredWorldPos - applyToThis.position, maxSpeed * Time.deltaTime);
            }
            else
            {
                applyToThis.position = desiredWorldPos;
            }
        }
Exemplo n.º 3
0
        void UpdateBoneTsfRot(ReprModel repr, Transform applyToThis, AbstractTsf inputData, float maxSpeed, Transform referenceTsf, Transform replicatedTsf)
        {
            AvatarController avatarCtrl = repr.point.bone.part.body.avatar.controller;

            Quaternion desiredWorldRot;

            if (inputData.space == Space.World)
            {
                desiredWorldRot = inputData.rotation;
            }
            else
            {
                desiredWorldRot = avatarCtrl.GetWorldFromLocalRotation(inputData.rotation, repr);
            }

            if (referenceTsf && replicatedTsf)
            {
                Quaternion relRot = Quaternion.Inverse(referenceTsf.rotation) * desiredWorldRot;
                desiredWorldRot = replicatedTsf.rotation * relRot;
            }

            if (maxSpeed > 0.0f)
            {
                applyToThis.rotation = BasicHelpers.ClampQuaternion(applyToThis.rotation, desiredWorldRot, maxSpeed * Time.deltaTime);
            }
            else
            {
                applyToThis.rotation = desiredWorldRot;
            }
        }
Exemplo n.º 4
0
        public static void ApplyFingerPose(FingerPose pose, FingerModel finger, string toReprKey, bool pos, bool rot, bool scale, bool inverted)
        {
            if (!finger.tip || !finger.tip.bone)
            {
                Debug.LogWarning("It was not possible to find distal bone for finger " + finger.name + ". Finger pose cannot be applied");
                return;
            }

            if (pose == null || !finger)
            {
                Debug.LogWarning("Missing finger pose or finger destination. Finger pose cannot be applied");
                return;
            }

            for (int pb = 1; pb <= pose.bones.Count; pb++)
            {
                // From tip to root (full length)
                int poseBoneIndex   = pose.bones.Count - pb;
                int fingerBoneIndex = finger.bonesFromRootToTip.Count - pb;

                if (poseBoneIndex < 0)
                {
                    break;
                }
                if (fingerBoneIndex < 0)
                {
                    break;
                }

                if (pose.bones[poseBoneIndex].space != Space.Self)
                {
                    Debug.LogError("Pose for finger " + pose.finger.ToString() + " and bone " + pose.bones[poseBoneIndex].name + " does not have its AbstractTsf configured in local space. FingerPose cannot be applied completely");
                    continue;
                }

                ReprModel boneRepr = finger.bonesFromRootToTip[fingerBoneIndex].reprs[toReprKey];

                if (pos)
                {
                    boneRepr.localPosition = pose.bones[poseBoneIndex].position;
                    if (inverted)
                    {
                        boneRepr.localPosition *= -1.0f;
                    }
                }
                if (rot)
                {
                    Quaternion localRot;
                    if (fingerBoneIndex == 0 && poseBoneIndex > 0)
                    {
                        localRot = pose.bones[poseBoneIndex - 1].rotation * pose.bones[poseBoneIndex].rotation;
                    }
                    else
                    {
                        localRot = pose.bones[poseBoneIndex].rotation;
                    }

                    boneRepr.localRotation = localRot;
                }
                if (scale)
                {
                    boneRepr.transformRef.localScale = pose.bones[poseBoneIndex].localScale;
                }
            }
        }