예제 #1
0
 internal void ResetValuesFromProperties()
 {
     this.m_ArmTwistFactor      = this.m_ArmTwistProperty.floatValue;
     this.m_ForeArmTwistFactor  = this.m_ForeArmTwistProperty.floatValue;
     this.m_UpperLegTwistFactor = this.m_UpperLegTwistProperty.floatValue;
     this.m_LegTwistFactor      = this.m_LegTwistProperty.floatValue;
     this.m_ArmStretchFactor    = this.m_ArmStretchProperty.floatValue;
     this.m_LegStretchFactor    = this.m_LegStretchProperty.floatValue;
     this.m_FeetSpacingFactor   = this.m_FeetSpacingProperty.floatValue;
     for (int i = 0; i < this.m_Bones.Length; i++)
     {
         if (this.m_Modified[i] != null)
         {
             bool boolValue = this.m_Modified[i].boolValue;
             int  num       = HumanTrait.MuscleFromBone(i, 0);
             int  num2      = HumanTrait.MuscleFromBone(i, 1);
             int  num3      = HumanTrait.MuscleFromBone(i, 2);
             if (num != -1)
             {
                 this.m_MuscleMinEdit[num] = ((!boolValue) ? HumanTrait.GetMuscleDefaultMin(num) : this.m_MuscleMin[num].floatValue);
                 this.m_MuscleMaxEdit[num] = ((!boolValue) ? HumanTrait.GetMuscleDefaultMax(num) : this.m_MuscleMax[num].floatValue);
             }
             if (num2 != -1)
             {
                 this.m_MuscleMinEdit[num2] = ((!boolValue) ? HumanTrait.GetMuscleDefaultMin(num2) : this.m_MuscleMin[num2].floatValue);
                 this.m_MuscleMaxEdit[num2] = ((!boolValue) ? HumanTrait.GetMuscleDefaultMax(num2) : this.m_MuscleMax[num2].floatValue);
             }
             if (num3 != -1)
             {
                 this.m_MuscleMinEdit[num3] = ((!boolValue) ? HumanTrait.GetMuscleDefaultMin(num3) : this.m_MuscleMin[num3].floatValue);
                 this.m_MuscleMaxEdit[num3] = ((!boolValue) ? HumanTrait.GetMuscleDefaultMax(num3) : this.m_MuscleMax[num3].floatValue);
             }
         }
     }
 }
예제 #2
0
        public void Add(MusclePropertyName musclePropertyName, PoseTemplate srcPoseTemplate)
        {
            var handPose = new HandPoseData();

            handPose.name = srcPoseTemplate.name;
            {
                var beginMuscle = HumanTrait.MuscleFromBone((int)HumanBodyBones.LeftThumbProximal, 2);
                var endMuscle   = HumanTrait.MuscleFromBone((int)HumanBodyBones.LeftLittleDistal, 2);
                var muscleDic   = new Dictionary <string, float>();
                for (int muscle = beginMuscle; muscle <= endMuscle; muscle++)
                {
                    var index = ArrayUtility.IndexOf(srcPoseTemplate.musclePropertyNames, musclePropertyName.PropertyNames[muscle]);
                    if (index < 0)
                    {
                        continue;
                    }
                    muscleDic.Add(srcPoseTemplate.musclePropertyNames[index], srcPoseTemplate.muscleValues[index]);
                }
                handPose.musclePropertyNames = muscleDic.Keys.ToArray();
                handPose.muscleValues        = muscleDic.Values.ToArray();
            }
            if (list == null)
            {
                list = new List <HandPoseData>();
            }
            list.Add(handPose);
        }
예제 #3
0
        // clears the animation curves before the recording starts
        private void InitAnimationCurves()
        {
            if (avatarModel == null)
            {
                return;
            }

            animTime = 0f;
            muscleCurves.Clear();
            rootPoseCurves.Clear();

            List <HumanBodyBones> mecanimBones = avatarModel.GetMecanimBones();

            foreach (HumanBodyBones boneType in mecanimBones)
            {
                for (int i = 0; i < 3; i++)
                {
                    int muscle = HumanTrait.MuscleFromBone((int)boneType, i);

                    if (muscle != -1)
                    {
                        muscleCurves.Add(muscle, new AnimationCurve());
                    }
                }
            }

            rootPoseCurves.Add("RootT.x", new AnimationCurve());
            rootPoseCurves.Add("RootT.y", new AnimationCurve());
            rootPoseCurves.Add("RootT.z", new AnimationCurve());

            rootPoseCurves.Add("RootQ.x", new AnimationCurve());
            rootPoseCurves.Add("RootQ.y", new AnimationCurve());
            rootPoseCurves.Add("RootQ.z", new AnimationCurve());
            rootPoseCurves.Add("RootQ.w", new AnimationCurve());
        }
예제 #4
0
    static int MuscleFromBone(IntPtr L)
    {
        LuaScriptMgr.CheckArgsCount(L, 2);
        int arg0 = (int)LuaScriptMgr.GetNumber(L, 1);
        int arg1 = (int)LuaScriptMgr.GetNumber(L, 2);
        int o    = HumanTrait.MuscleFromBone(arg0, arg1);

        LuaScriptMgr.Push(L, o);
        return(1);
    }
예제 #5
0
 static AnimRecorder()
 {
     for (int i = 0; i < HumanTrait.BoneCount; i++)
     {
         for (int j = 0; j < 3; j++)
         {
             MuscleFromBone[i, j] = HumanTrait.MuscleFromBone(i, j);
         }
     }
 }
    public void SetTarget(GameObject target)
    {
        this.target = target;
        selected    = -1;
        if (target == null)
        {
            return;
        }

        Animator animator = target.GetComponent(typeof(Animator)) as Animator;

        if (animator == null)
        {
            return;
        }

        avatar = animator.avatar;
        if (avatar == null || !avatar.isValid || !avatar.isHuman)
        {
            return;
        }

        muscleMinMaxValues = PSMuscleDefine.GetMuscleMinMaxValues();

        Array boneArray = Enum.GetValues(typeof(HumanBodyBones));

        Array.Sort(boneArray);

        boneInfos = new BoneInfo[HumanTrait.BoneCount];

        for (int i = 0; i < HumanTrait.BoneCount; i++)
        {
            BoneInfo info = new BoneInfo();
            info.bone          = animator.GetBoneTransform((HumanBodyBones)boneArray.GetValue(i));
            info.humanBoneName = HumanTrait.BoneName [i];
            info.boneId        = i;

            info.muscleXId = HumanTrait.MuscleFromBone(info.boneId, 0);
            info.muscleYId = HumanTrait.MuscleFromBone(info.boneId, 1);
            info.muscleZId = HumanTrait.MuscleFromBone(info.boneId, 2);
            if (info.muscleXId != -1 || info.muscleYId != -1 || info.muscleZId != -1)
            {
                boneInfos [i] = info;
            }
        }

        // get avatar methods
        getAxisLength   = avatar.GetType().GetMethod("GetAxisLength", flags);
        getPreRotation  = avatar.GetType().GetMethod("GetPreRotation", flags);
        getPostRotation = avatar.GetType().GetMethod("GetPostRotation", flags);
        getZYRoll       = avatar.GetType().GetMethod("GetZYRoll", flags);
        getLimitSign    = avatar.GetType().GetMethod("GetLimitSign", flags);
        getZYPostQ      = avatar.GetType().GetMethod("GetZYPostQ", flags);
    }
예제 #7
0
        protected bool UpdateMuscle(int muscleId, float min, float max)
        {
            Undo.RegisterCompleteObjectUndo(this, "Updated muscle range");
            m_MuscleMin[muscleId].floatValue = min;
            m_MuscleMax[muscleId].floatValue = max;

            int humanId = HumanTrait.BoneFromMuscle(muscleId);

            if (humanId != -1)
            {
                if (!m_Modified[humanId].boolValue)
                {
                    int mx = HumanTrait.MuscleFromBone(humanId, 0);
                    int my = HumanTrait.MuscleFromBone(humanId, 1);
                    int mz = HumanTrait.MuscleFromBone(humanId, 2);

                    if (mx != -1 && mx != muscleId)
                    {
                        m_MuscleMin[mx].floatValue = HumanTrait.GetMuscleDefaultMin(mx);
                        m_MuscleMax[mx].floatValue = HumanTrait.GetMuscleDefaultMax(mx);
                    }

                    if (my != -1 && my != muscleId)
                    {
                        m_MuscleMin[my].floatValue = HumanTrait.GetMuscleDefaultMin(my);
                        m_MuscleMax[my].floatValue = HumanTrait.GetMuscleDefaultMax(my);
                    }

                    if (mz != -1 && mz != muscleId)
                    {
                        m_MuscleMin[mz].floatValue = HumanTrait.GetMuscleDefaultMin(mz);
                        m_MuscleMax[mz].floatValue = HumanTrait.GetMuscleDefaultMax(mz);
                    }
                }

                m_Modified[humanId].boolValue = true;
            }

            // OnSceneGUI need focused muscle to know which one to draw
            m_FocusedMuscle = muscleId;

            // For live update, update instanciate avatar to adjust pose
            if (gameObject != null)
            {
                Animator animator = gameObject.GetComponent(typeof(Animator)) as Animator;
                Avatar   avatar   = animator.avatar;
                avatar.SetMuscleMinMax(muscleId, min, max);
            }

            // Need to repaint scene to update muscle range handle
            SceneView.RepaintAll();

            return(gameObject != null);
        }
예제 #8
0
        public static void SetHipsPositionRotation(ref HumanPose pose, Vector3 hipsT, Quaternion hipsQ, float humanScale)
        {
            var spreadQ = Quaternion.identity;

            foreach (var(i, scale) in spreadMassQ)
            {
                spreadQ *= HumanAxes.SwingTwist(new Vector3(
                                                    pose.muscles[HumanTrait.MuscleFromBone(i, 0)] * scale[0],
                                                    pose.muscles[HumanTrait.MuscleFromBone(i, 1)] * scale[1],
                                                    pose.muscles[HumanTrait.MuscleFromBone(i, 2)] * scale[2]));
            }
            var t = Quaternion.LookRotation(Vector3.right, Vector3.forward);

            pose.bodyPosition = hipsT / humanScale;
            pose.bodyRotation = hipsQ * (t * spreadQ * Quaternion.Inverse(t));
        }
예제 #9
0
        internal void InitializeProperties()
        {
            m_ArmTwistProperty          = serializedObject.FindProperty(sArmTwist);
            m_ForeArmTwistProperty      = serializedObject.FindProperty(sForeArmTwist);
            m_UpperLegTwistProperty     = serializedObject.FindProperty(sUpperLegTwist);
            m_LegTwistProperty          = serializedObject.FindProperty(sLegTwist);
            m_ArmStretchProperty        = serializedObject.FindProperty(sArmStretch);
            m_LegStretchProperty        = serializedObject.FindProperty(sLegStretch);
            m_FeetSpacingProperty       = serializedObject.FindProperty(sFeetSpacing);
            m_HasTranslationDoFProperty = serializedObject.FindProperty(sHasTranslationDoF);

            for (int i = 0; i < m_Bones.Length; i++)
            {
                SerializedProperty bone = m_Bones[i].GetSerializedProperty(serializedObject, false);
                if (bone != null)
                {
                    m_Modified[i] = bone.FindPropertyRelative(sModified);

                    int dx = HumanTrait.MuscleFromBone(i, 0);
                    int dy = HumanTrait.MuscleFromBone(i, 1);
                    int dz = HumanTrait.MuscleFromBone(i, 2);


                    if (dx != -1)
                    {
                        m_MuscleMin[dx] = bone.FindPropertyRelative(sMinX);
                        m_MuscleMax[dx] = bone.FindPropertyRelative(sMaxX);
                    }

                    if (dy != -1)
                    {
                        m_MuscleMin[dy] = bone.FindPropertyRelative(sMinY);
                        m_MuscleMax[dy] = bone.FindPropertyRelative(sMaxY);
                    }

                    if (dz != -1)
                    {
                        m_MuscleMin[dz] = bone.FindPropertyRelative(sMinZ);
                        m_MuscleMax[dz] = bone.FindPropertyRelative(sMaxZ);
                    }
                }
            }
        }
예제 #10
0
        internal void ResetValuesFromProperties()
        {
            m_ArmTwistFactor      = m_ArmTwistProperty.floatValue;
            m_ForeArmTwistFactor  = m_ForeArmTwistProperty.floatValue;
            m_UpperLegTwistFactor = m_UpperLegTwistProperty.floatValue;
            m_LegTwistFactor      = m_LegTwistProperty.floatValue;
            m_ArmStretchFactor    = m_ArmStretchProperty.floatValue;
            m_LegStretchFactor    = m_LegStretchProperty.floatValue;
            m_FeetSpacingFactor   = m_FeetSpacingProperty.floatValue;
            m_HasTranslationDoF   = m_HasTranslationDoFProperty.boolValue;

            // limit is a special case, because they are added dynamicly by the editor
            // all the default value are wrong, we must explictly query mecanim to get the default value when
            // m_Modified is set to false.
            for (int i = 0; i < m_Bones.Length; i++)
            {
                if (m_Modified[i] != null)
                {
                    bool modified = m_Modified[i].boolValue;

                    int dx = HumanTrait.MuscleFromBone(i, 0);
                    int dy = HumanTrait.MuscleFromBone(i, 1);
                    int dz = HumanTrait.MuscleFromBone(i, 2);
                    if (dx != -1)
                    {
                        m_MuscleMinEdit[dx] = modified ? m_MuscleMin[dx].floatValue : HumanTrait.GetMuscleDefaultMin(dx);
                        m_MuscleMaxEdit[dx] = modified ? m_MuscleMax[dx].floatValue : HumanTrait.GetMuscleDefaultMax(dx);
                    }

                    if (dy != -1)
                    {
                        m_MuscleMinEdit[dy] = modified ? m_MuscleMin[dy].floatValue : HumanTrait.GetMuscleDefaultMin(dy);
                        m_MuscleMaxEdit[dy] = modified ? m_MuscleMax[dy].floatValue : HumanTrait.GetMuscleDefaultMax(dy);
                    }

                    if (dz != -1)
                    {
                        m_MuscleMinEdit[dz] = modified ? m_MuscleMin[dz].floatValue : HumanTrait.GetMuscleDefaultMin(dz);
                        m_MuscleMaxEdit[dz] = modified ? m_MuscleMax[dz].floatValue : HumanTrait.GetMuscleDefaultMax(dz);
                    }
                }
            }
        }
예제 #11
0
        protected bool UpdateMuscle(int muscleId, float min, float max)
        {
            Undo.RegisterCompleteObjectUndo(this, "Updated muscle range");
            this.m_MuscleMin[muscleId].floatValue = min;
            this.m_MuscleMax[muscleId].floatValue = max;
            int num = HumanTrait.BoneFromMuscle(muscleId);

            if (num != -1)
            {
                if (!this.m_Modified[num].boolValue)
                {
                    int num2 = HumanTrait.MuscleFromBone(num, 0);
                    int num3 = HumanTrait.MuscleFromBone(num, 1);
                    int num4 = HumanTrait.MuscleFromBone(num, 2);
                    if (num2 != -1 && num2 != muscleId)
                    {
                        this.m_MuscleMin[num2].floatValue = HumanTrait.GetMuscleDefaultMin(num2);
                        this.m_MuscleMax[num2].floatValue = HumanTrait.GetMuscleDefaultMax(num2);
                    }
                    if (num3 != -1 && num3 != muscleId)
                    {
                        this.m_MuscleMin[num3].floatValue = HumanTrait.GetMuscleDefaultMin(num3);
                        this.m_MuscleMax[num3].floatValue = HumanTrait.GetMuscleDefaultMax(num3);
                    }
                    if (num4 != -1 && num4 != muscleId)
                    {
                        this.m_MuscleMin[num4].floatValue = HumanTrait.GetMuscleDefaultMin(num4);
                        this.m_MuscleMax[num4].floatValue = HumanTrait.GetMuscleDefaultMax(num4);
                    }
                }
                this.m_Modified[num].boolValue = true;
            }
            this.m_FocusedMuscle = muscleId;
            if (base.gameObject != null)
            {
                Animator animator = base.gameObject.GetComponent(typeof(Animator)) as Animator;
                Avatar   avatar   = animator.avatar;
                avatar.SetMuscleMinMax(muscleId, min, max);
            }
            SceneView.RepaintAll();
            return(base.gameObject != null);
        }
    public static int MuscleFromBone_s(IntPtr l)
    {
        int result;

        try
        {
            int i;
            LuaObject.checkType(l, 1, out i);
            int dofIndex;
            LuaObject.checkType(l, 2, out dofIndex);
            int i2 = HumanTrait.MuscleFromBone(i, dofIndex);
            LuaObject.pushValue(l, true);
            LuaObject.pushValue(l, i2);
            result = 2;
        }
        catch (Exception e)
        {
            result = LuaObject.error(l, e);
        }
        return(result);
    }
예제 #13
0
        internal void ResetValuesFromProperties()
        {
            this.m_ArmTwistFactor      = this.m_ArmTwistProperty.floatValue;
            this.m_ForeArmTwistFactor  = this.m_ForeArmTwistProperty.floatValue;
            this.m_UpperLegTwistFactor = this.m_UpperLegTwistProperty.floatValue;
            this.m_LegTwistFactor      = this.m_LegTwistProperty.floatValue;
            this.m_ArmStretchFactor    = this.m_ArmStretchProperty.floatValue;
            this.m_LegStretchFactor    = this.m_LegStretchProperty.floatValue;
            this.m_FeetSpacingFactor   = this.m_FeetSpacingProperty.floatValue;
            this.m_HasTranslationDoF   = this.m_HasTranslationDoFProperty.boolValue;
            for (int i = 0; i < this.m_Bones.Length; i++)
            {
                if (this.m_Modified[i] != null)
                {
                    bool boolValue = this.m_Modified[i].boolValue;
                    int  index     = HumanTrait.MuscleFromBone(i, 0);
                    int  num3      = HumanTrait.MuscleFromBone(i, 1);
                    int  num4      = HumanTrait.MuscleFromBone(i, 2);
                    if (index != -1)
                    {
                        this.m_MuscleMinEdit[index] = !boolValue?HumanTrait.GetMuscleDefaultMin(index) : this.m_MuscleMin[index].floatValue;

                        this.m_MuscleMaxEdit[index] = !boolValue?HumanTrait.GetMuscleDefaultMax(index) : this.m_MuscleMax[index].floatValue;
                    }
                    if (num3 != -1)
                    {
                        this.m_MuscleMinEdit[num3] = !boolValue?HumanTrait.GetMuscleDefaultMin(num3) : this.m_MuscleMin[num3].floatValue;

                        this.m_MuscleMaxEdit[num3] = !boolValue?HumanTrait.GetMuscleDefaultMax(num3) : this.m_MuscleMax[num3].floatValue;
                    }
                    if (num4 != -1)
                    {
                        this.m_MuscleMinEdit[num4] = !boolValue?HumanTrait.GetMuscleDefaultMin(num4) : this.m_MuscleMin[num4].floatValue;

                        this.m_MuscleMaxEdit[num4] = !boolValue?HumanTrait.GetMuscleDefaultMax(num4) : this.m_MuscleMax[num4].floatValue;
                    }
                }
            }
        }
예제 #14
0
        internal void ResetValuesFromProperties()
        {
            this.m_ArmTwistFactor      = this.m_ArmTwistProperty.floatValue;
            this.m_ForeArmTwistFactor  = this.m_ForeArmTwistProperty.floatValue;
            this.m_UpperLegTwistFactor = this.m_UpperLegTwistProperty.floatValue;
            this.m_LegTwistFactor      = this.m_LegTwistProperty.floatValue;
            this.m_ArmStretchFactor    = this.m_ArmStretchProperty.floatValue;
            this.m_LegStretchFactor    = this.m_LegStretchProperty.floatValue;
            this.m_FeetSpacingFactor   = this.m_FeetSpacingProperty.floatValue;
            this.m_HasTranslationDoF   = this.m_HasTranslationDoFProperty.boolValue;
            for (int i1 = 0; i1 < this.m_Bones.Length; ++i1)
            {
                if (this.m_Modified[i1] != null)
                {
                    bool boolValue = this.m_Modified[i1].boolValue;
                    int  i2        = HumanTrait.MuscleFromBone(i1, 0);
                    int  i3        = HumanTrait.MuscleFromBone(i1, 1);
                    int  i4        = HumanTrait.MuscleFromBone(i1, 2);
                    if (i2 != -1)
                    {
                        this.m_MuscleMinEdit[i2] = !boolValue?HumanTrait.GetMuscleDefaultMin(i2) : this.m_MuscleMin[i2].floatValue;

                        this.m_MuscleMaxEdit[i2] = !boolValue?HumanTrait.GetMuscleDefaultMax(i2) : this.m_MuscleMax[i2].floatValue;
                    }
                    if (i3 != -1)
                    {
                        this.m_MuscleMinEdit[i3] = !boolValue?HumanTrait.GetMuscleDefaultMin(i3) : this.m_MuscleMin[i3].floatValue;

                        this.m_MuscleMaxEdit[i3] = !boolValue?HumanTrait.GetMuscleDefaultMax(i3) : this.m_MuscleMax[i3].floatValue;
                    }
                    if (i4 != -1)
                    {
                        this.m_MuscleMinEdit[i4] = !boolValue?HumanTrait.GetMuscleDefaultMin(i4) : this.m_MuscleMin[i4].floatValue;

                        this.m_MuscleMaxEdit[i4] = !boolValue?HumanTrait.GetMuscleDefaultMax(i4) : this.m_MuscleMax[i4].floatValue;
                    }
                }
            }
        }
예제 #15
0
    public HumanoidRecoder(Animator animator, HumanBodyBones[] humanBodyBones)
    {
        rootOffset       = animator.transform.position;
        humanPoseHandler = new HumanPoseHandler(animator.avatar, animator.transform);

        foreach (HumanBodyBones unityBoneType in humanBodyBones)
        {
            for (int dofIndex = 0; dofIndex < 3; dofIndex++)
            {
                int muscle = HumanTrait.MuscleFromBone((int)unityBoneType, dofIndex);

                if (muscle != -1)
                {
                    muscleCurves.Add(muscle, new AnimationCurve());
                }
            }
        }

        rootCurves.Add("RootT.x", new AnimationCurve());
        rootCurves.Add("RootT.y", new AnimationCurve());
        rootCurves.Add("RootT.z", new AnimationCurve());
    }
예제 #16
0
        static Vector3 GetLimitSignFull(Avatar avatar, HumanBodyBones humanBone)
        {
            var sign = Vector3.zero;

            for (var b = humanBone; (int)b >= 0;)
            {
                var s = (Vector3)GetLimitSign.Invoke(avatar, new object[] { b });
                for (int i = 0; i < 3; i++)
                {
                    if (HumanTrait.MuscleFromBone((int)b, i) < 0)
                    {
                        s[i] = 0;
                    }
                    else if (sign[i] == 0)
                    {
                        sign[i] = s[i];
                    }
                }

                if (s.x * s.y * s.z != 0)
                {
                    // match orientation
                    for (int i = 0; i < 3 && (sign.x * sign.y * sign.z) != (s.x * s.y * s.z); i++)
                    {
                        if (HumanTrait.MuscleFromBone((int)humanBone, i) < 0)
                        {
                            sign[i] *= -1;
                        }
                    }
                    return(sign);
                }

                b = b == HumanBodyBones.LeftShoulder  ? HumanBodyBones.LeftUpperArm :
                    b == HumanBodyBones.RightShoulder ? HumanBodyBones.RightUpperArm :
                    (HumanBodyBones)HumanTrait.GetParentBone((int)b);
            }
            return(Vector3.one);
        }
예제 #17
0
        public MuscleLimit GetMuscleLimitNonError(Avatar avatar, HumanBodyBones humanoidIndex)
        {
            var ml = GetMuscleLimit(avatar, humanoidIndex);

            if (ml != null)
            {
                return(ml);
            }

            var muscleX = HumanTrait.MuscleFromBone((int)humanoidIndex, 0);
            var muscleY = HumanTrait.MuscleFromBone((int)humanoidIndex, 1);
            var muscleZ = HumanTrait.MuscleFromBone((int)humanoidIndex, 2);

            return(new MuscleLimit()
            {
                min = new Vector3(muscleX >= 0 ? HumanTrait.GetMuscleDefaultMin(muscleX) : 0f,
                                  muscleY >= 0 ? HumanTrait.GetMuscleDefaultMin(muscleY) : 0f,
                                  muscleZ >= 0 ? HumanTrait.GetMuscleDefaultMin(muscleZ) : 0f),
                max = new Vector3(muscleX >= 0 ? HumanTrait.GetMuscleDefaultMax(muscleX) : 0f,
                                  muscleY >= 0 ? HumanTrait.GetMuscleDefaultMax(muscleY) : 0f,
                                  muscleZ >= 0 ? HumanTrait.GetMuscleDefaultMax(muscleZ) : 0f)
            });
        }
예제 #18
0
 internal void InitializeProperties()
 {
     this.m_ArmTwistProperty          = base.serializedObject.FindProperty("m_HumanDescription.m_ArmTwist");
     this.m_ForeArmTwistProperty      = base.serializedObject.FindProperty("m_HumanDescription.m_ForeArmTwist");
     this.m_UpperLegTwistProperty     = base.serializedObject.FindProperty("m_HumanDescription.m_UpperLegTwist");
     this.m_LegTwistProperty          = base.serializedObject.FindProperty("m_HumanDescription.m_LegTwist");
     this.m_ArmStretchProperty        = base.serializedObject.FindProperty("m_HumanDescription.m_ArmStretch");
     this.m_LegStretchProperty        = base.serializedObject.FindProperty("m_HumanDescription.m_LegStretch");
     this.m_FeetSpacingProperty       = base.serializedObject.FindProperty("m_HumanDescription.m_FeetSpacing");
     this.m_HasTranslationDoFProperty = base.serializedObject.FindProperty("m_HumanDescription.m_HasTranslationDoF");
     for (int i = 0; i < this.m_Bones.Length; i++)
     {
         SerializedProperty serializedProperty = this.m_Bones[i].GetSerializedProperty(base.serializedObject, false);
         if (serializedProperty != null)
         {
             this.m_Modified[i] = serializedProperty.FindPropertyRelative("m_Limit.m_Modified");
             int index = HumanTrait.MuscleFromBone(i, 0);
             int num3  = HumanTrait.MuscleFromBone(i, 1);
             int num4  = HumanTrait.MuscleFromBone(i, 2);
             if (index != -1)
             {
                 this.m_MuscleMin[index] = serializedProperty.FindPropertyRelative("m_Limit.m_Min.x");
                 this.m_MuscleMax[index] = serializedProperty.FindPropertyRelative("m_Limit.m_Max.x");
             }
             if (num3 != -1)
             {
                 this.m_MuscleMin[num3] = serializedProperty.FindPropertyRelative("m_Limit.m_Min.y");
                 this.m_MuscleMax[num3] = serializedProperty.FindPropertyRelative("m_Limit.m_Max.y");
             }
             if (num4 != -1)
             {
                 this.m_MuscleMin[num4] = serializedProperty.FindPropertyRelative("m_Limit.m_Min.z");
                 this.m_MuscleMax[num4] = serializedProperty.FindPropertyRelative("m_Limit.m_Max.z");
             }
         }
     }
 }
예제 #19
0
        static HumanLimit GetHumanLimit(Avatar avatar, HumanBodyBones humanBone)
        {
            var limit = new HumanLimit {
                useDefaultValues = true
            };

                #if UNITY_EDITOR // this can be improved when avatar.humanDescription is exposed in unity 2019
            var importer = AssetImporter.GetAtPath(AssetDatabase.GetAssetPath(avatar)) as ModelImporter;
            var human    = (importer?.humanDescription)?.human;
            if (human != null)
            {
                for (int i = 0; i < human.Length; i++)
                {
                    if (human[i].humanName == HumanTrait.BoneName[(int)humanBone])
                    {
                        limit = human[i].limit;
                        break;
                    }
                }
            }
                #endif
            limit.axisLength = (float)GetAxisLength.Invoke(avatar, new object[] { humanBone });  // not in humanDescription
            if (limit.useDefaultValues)
            {
                Vector3 min = new Vector3(), max = new Vector3();
                for (int i = 0; i < 3; i++)
                {
                    var m = HumanTrait.MuscleFromBone((int)humanBone, i);
                    min[i] = m >= 0 ? HumanTrait.GetMuscleDefaultMin(m) : 0;             // invalid input will crash
                    max[i] = m >= 0 ? HumanTrait.GetMuscleDefaultMax(m) : 0;
                }
                limit.min = min;
                limit.max = max;
            }
            return(limit);
        }
예제 #20
0
        public void DrawMuscleHandle(Transform t, int humanId)
        {
            Vector3    vector2;
            Animator   component    = base.gameObject.GetComponent(typeof(Animator)) as Animator;
            Avatar     avatar       = component.avatar;
            int        index        = HumanTrait.MuscleFromBone(humanId, 0);
            int        num2         = HumanTrait.MuscleFromBone(humanId, 1);
            int        num3         = HumanTrait.MuscleFromBone(humanId, 2);
            float      axisLength   = avatar.GetAxisLength(humanId);
            Quaternion preRotation  = avatar.GetPreRotation(humanId);
            Quaternion postRotation = avatar.GetPostRotation(humanId);

            preRotation  = t.parent.rotation * preRotation;
            postRotation = t.rotation * postRotation;
            Color      color     = new Color(1f, 1f, 1f, 0.5f);
            Quaternion zYRoll    = avatar.GetZYRoll(humanId, Vector3.zero);
            Vector3    limitSign = avatar.GetLimitSign(humanId);
            Vector3    axis      = (Vector3)(postRotation * Vector3.right);
            Vector3    vector4   = t.position + ((Vector3)(axis * axisLength));

            Handles.color = Color.white;
            Handles.DrawLine(t.position, vector4);
            if (index != -1)
            {
                Quaternion quaternion4 = avatar.GetZYPostQ(humanId, t.parent.rotation, t.rotation);
                float      angle       = this.m_MuscleMinEdit[index];
                float      num6        = this.m_MuscleMaxEdit[index];
                axis          = (Vector3)(postRotation * Vector3.right);
                vector2       = (Vector3)(quaternion4 * Vector3.forward);
                Handles.color = Color.black;
                Vector3 center = t.position + ((Vector3)((axis * axisLength) * 0.75f));
                axis          = (Vector3)((postRotation * Vector3.right) * limitSign.x);
                vector2       = (Vector3)(Quaternion.AngleAxis(angle, axis) * vector2);
                Handles.color = Color.yellow;
                Handles.color = Handles.xAxisColor * color;
                Handles.DrawSolidArc(center, axis, vector2, num6 - angle, axisLength * 0.25f);
                vector2       = (Vector3)(postRotation * Vector3.forward);
                Handles.color = Handles.centerColor;
                Handles.DrawLine(center, center + ((Vector3)((vector2 * axisLength) * 0.25f)));
            }
            if (num2 != -1)
            {
                float num7 = this.m_MuscleMinEdit[num2];
                float num8 = this.m_MuscleMaxEdit[num2];
                axis          = (Vector3)((preRotation * Vector3.up) * limitSign.y);
                vector2       = (Vector3)((preRotation * zYRoll) * Vector3.right);
                Handles.color = Color.black;
                vector2       = (Vector3)(Quaternion.AngleAxis(num7, axis) * vector2);
                Handles.color = Color.yellow;
                Handles.color = Handles.yAxisColor * color;
                Handles.DrawSolidArc(t.position, axis, vector2, num8 - num7, axisLength * 0.25f);
            }
            if (num3 != -1)
            {
                float num9  = this.m_MuscleMinEdit[num3];
                float num10 = this.m_MuscleMaxEdit[num3];
                axis          = (Vector3)((preRotation * Vector3.forward) * limitSign.z);
                vector2       = (Vector3)((preRotation * zYRoll) * Vector3.right);
                Handles.color = Color.black;
                vector2       = (Vector3)(Quaternion.AngleAxis(num9, axis) * vector2);
                Handles.color = Color.yellow;
                Handles.color = Handles.zAxisColor * color;
                Handles.DrawSolidArc(t.position, axis, vector2, num10 - num9, axisLength * 0.25f);
            }
        }
예제 #21
0
        public void DrawMuscleHandle(Transform t, int humanId)
        {
            Avatar     avatar       = (this.gameObject.GetComponent(typeof(Animator)) as Animator).avatar;
            int        index1       = HumanTrait.MuscleFromBone(humanId, 0);
            int        index2       = HumanTrait.MuscleFromBone(humanId, 1);
            int        index3       = HumanTrait.MuscleFromBone(humanId, 2);
            float      axisLength   = avatar.GetAxisLength(humanId);
            Quaternion preRotation  = avatar.GetPreRotation(humanId);
            Quaternion postRotation = avatar.GetPostRotation(humanId);
            Quaternion quaternion1  = t.parent.rotation * preRotation;
            Quaternion quaternion2  = t.rotation * postRotation;
            Color      color        = new Color(1f, 1f, 1f, 0.5f);
            Quaternion zyRoll       = avatar.GetZYRoll(humanId, Vector3.zero);
            Vector3    limitSign    = avatar.GetLimitSign(humanId);
            Vector3    vector3_1    = quaternion2 * Vector3.right;
            Vector3    p2           = t.position + vector3_1 * axisLength;

            Handles.color = Color.white;
            Handles.DrawLine(t.position, p2);
            if (index1 != -1)
            {
                Quaternion zyPostQ   = avatar.GetZYPostQ(humanId, t.parent.rotation, t.rotation);
                float      angle     = this.m_MuscleMinEdit[index1];
                float      num       = this.m_MuscleMaxEdit[index1];
                Vector3    vector3_2 = quaternion2 * Vector3.right;
                Vector3    vector3_3 = zyPostQ * Vector3.forward;
                Handles.color = Color.black;
                Vector3 vector3_4 = t.position + vector3_2 * axisLength * 0.75f;
                Vector3 vector3_5 = quaternion2 * Vector3.right * limitSign.x;
                Vector3 from      = Quaternion.AngleAxis(angle, vector3_5) * vector3_3;
                Handles.color = Color.yellow;
                Handles.color = Handles.xAxisColor * color;
                Handles.DrawSolidArc(vector3_4, vector3_5, from, num - angle, axisLength * 0.25f);
                Vector3 vector3_6 = quaternion2 * Vector3.forward;
                Handles.color = Handles.centerColor;
                Handles.DrawLine(vector3_4, vector3_4 + vector3_6 * axisLength * 0.25f);
            }
            if (index2 != -1)
            {
                float   angle     = this.m_MuscleMinEdit[index2];
                float   num       = this.m_MuscleMaxEdit[index2];
                Vector3 vector3_2 = quaternion1 * Vector3.up * limitSign.y;
                Vector3 vector3_3 = quaternion1 * zyRoll * Vector3.right;
                Handles.color = Color.black;
                Vector3 from = Quaternion.AngleAxis(angle, vector3_2) * vector3_3;
                Handles.color = Color.yellow;
                Handles.color = Handles.yAxisColor * color;
                Handles.DrawSolidArc(t.position, vector3_2, from, num - angle, axisLength * 0.25f);
            }
            if (index3 == -1)
            {
                return;
            }
            float   angle1    = this.m_MuscleMinEdit[index3];
            float   num1      = this.m_MuscleMaxEdit[index3];
            Vector3 vector3_7 = quaternion1 * Vector3.forward * limitSign.z;
            Vector3 vector3_8 = quaternion1 * zyRoll * Vector3.right;

            Handles.color = Color.black;
            Vector3 from1 = Quaternion.AngleAxis(angle1, vector3_7) * vector3_8;

            Handles.color = Color.yellow;
            Handles.color = Handles.zAxisColor * color;
            Handles.DrawSolidArc(t.position, vector3_7, from1, num1 - angle1, axisLength * 0.25f);
        }
예제 #22
0
        public void DrawMuscleHandle(Transform t, int humanId)
        {
            Animator   animator    = base.gameObject.GetComponent(typeof(Animator)) as Animator;
            Avatar     avatar      = animator.avatar;
            int        num         = HumanTrait.MuscleFromBone(humanId, 0);
            int        num2        = HumanTrait.MuscleFromBone(humanId, 1);
            int        num3        = HumanTrait.MuscleFromBone(humanId, 2);
            float      axisLength  = avatar.GetAxisLength(humanId);
            Quaternion quaternion  = avatar.GetPreRotation(humanId);
            Quaternion quaternion2 = avatar.GetPostRotation(humanId);

            quaternion  = t.parent.rotation * quaternion;
            quaternion2 = t.rotation * quaternion2;
            Color      b         = new Color(1f, 1f, 1f, 0.5f);
            Quaternion zYRoll    = avatar.GetZYRoll(humanId, Vector3.zero);
            Vector3    limitSign = avatar.GetLimitSign(humanId);
            Vector3    vector    = quaternion2 * Vector3.right;
            Vector3    p         = t.position + vector * axisLength;

            Handles.color = Color.white;
            Handles.DrawLine(t.position, p);
            if (num != -1)
            {
                Quaternion zYPostQ = avatar.GetZYPostQ(humanId, t.parent.rotation, t.rotation);
                float      num4    = this.m_MuscleMinEdit[num];
                float      num5    = this.m_MuscleMaxEdit[num];
                vector = quaternion2 * Vector3.right;
                Vector3 vector2 = zYPostQ * Vector3.forward;
                Handles.color = Color.black;
                Vector3 vector3 = t.position + vector * axisLength * 0.75f;
                vector = quaternion2 * Vector3.right * limitSign.x;
                Quaternion rotation = Quaternion.AngleAxis(num4, vector);
                vector2       = rotation * vector2;
                Handles.color = Color.yellow;
                Handles.color = Handles.xAxisColor * b;
                Handles.DrawSolidArc(vector3, vector, vector2, num5 - num4, axisLength * 0.25f);
                vector2       = quaternion2 * Vector3.forward;
                Handles.color = Handles.centerColor;
                Handles.DrawLine(vector3, vector3 + vector2 * axisLength * 0.25f);
            }
            if (num2 != -1)
            {
                float num6 = this.m_MuscleMinEdit[num2];
                float num7 = this.m_MuscleMaxEdit[num2];
                vector = quaternion * Vector3.up * limitSign.y;
                Vector3 vector2 = quaternion * zYRoll * Vector3.right;
                Handles.color = Color.black;
                Quaternion rotation2 = Quaternion.AngleAxis(num6, vector);
                vector2       = rotation2 * vector2;
                Handles.color = Color.yellow;
                Handles.color = Handles.yAxisColor * b;
                Handles.DrawSolidArc(t.position, vector, vector2, num7 - num6, axisLength * 0.25f);
            }
            if (num3 != -1)
            {
                float num8 = this.m_MuscleMinEdit[num3];
                float num9 = this.m_MuscleMaxEdit[num3];
                vector = quaternion * Vector3.forward * limitSign.z;
                Vector3 vector2 = quaternion * zYRoll * Vector3.right;
                Handles.color = Color.black;
                Quaternion rotation3 = Quaternion.AngleAxis(num8, vector);
                vector2       = rotation3 * vector2;
                Handles.color = Color.yellow;
                Handles.color = Handles.zAxisColor * b;
                Handles.DrawSolidArc(t.position, vector, vector2, num9 - num8, axisLength * 0.25f);
            }
        }
예제 #23
0
 public static int GetMuscleFromBone(HumanBodyBones boneID, int dofID)
 {
     return(HumanTrait.MuscleFromBone((int)boneID, dofID));
 }
예제 #24
0
        public void DrawMuscleHandle(Transform t, int humanId)
        {
            Animator animator = gameObject.GetComponent(typeof(Animator)) as Animator;
            Avatar   avatar   = animator.avatar;

            int mx = HumanTrait.MuscleFromBone(humanId, 0);
            int my = HumanTrait.MuscleFromBone(humanId, 1);
            int mz = HumanTrait.MuscleFromBone(humanId, 2);

            float      axisLen = avatar.GetAxisLength(humanId);
            Quaternion preQ    = avatar.GetPreRotation(humanId);
            Quaternion postQ   = avatar.GetPostRotation(humanId);

            preQ  = t.parent.rotation * preQ;
            postQ = t.rotation * postQ;

            Vector3 normal;
            Vector3 from;

            Color      alpha  = new Color(1, 1, 1, 0.5f);
            Quaternion zyRoll = avatar.GetZYRoll(humanId, Vector3.zero);
            Vector3    sign   = avatar.GetLimitSign(humanId);

            // Draw axis
            normal = postQ * Vector3.right;
            Vector3 axisEnd = t.position + (normal * axisLen);

            Handles.color = Color.white;
            Handles.DrawLine(t.position, axisEnd);

            if (mx != -1)
            {
                Quaternion zyPostQ = avatar.GetZYPostQ(humanId, t.parent.rotation, t.rotation);

                float minx = m_MuscleMinEdit[mx];
                float maxx = m_MuscleMaxEdit[mx];

                normal = postQ * Vector3.right;
                from   = zyPostQ * Vector3.forward;

                Handles.color = Color.black;
                //Handles.DrawLine (t.position, t.position + (from * axisLen * 0.75f));

                Vector3 xDoF = t.position + (normal * axisLen * 0.75f);

                normal = postQ * Vector3.right * sign.x;
                Quaternion q = Quaternion.AngleAxis(minx, normal);
                from = q * from;

                Handles.color = Color.yellow;
                //Handles.DrawLine (t.position, t.position + (from * axisLen * 0.75f));

                // Draw Muscle range
                Handles.color = Handles.xAxisColor * alpha;
                Handles.DrawSolidArc(xDoF, normal, from, maxx - minx, axisLen * 0.25f);

                from          = postQ * Vector3.forward;
                Handles.color = Handles.centerColor;
                Handles.DrawLine(xDoF, xDoF + (from * axisLen * 0.25f));
            }

            if (my != -1)
            {
                float miny = m_MuscleMinEdit[my];
                float maxy = m_MuscleMaxEdit[my];

                normal = preQ * Vector3.up * sign.y;
                from   = preQ * zyRoll * Vector3.right;

                Handles.color = Color.black;
                //Handles.DrawLine (t.position, t.position + (from * axisLen * 0.75f));

                Quaternion q = Quaternion.AngleAxis(miny, normal);
                from = q * from;

                Handles.color = Color.yellow;
                //Handles.DrawLine (t.position, t.position + (from * axisLen * 0.75f));

                // Draw Muscle range
                Handles.color = Handles.yAxisColor * alpha;
                Handles.DrawSolidArc(t.position, normal, from, maxy - miny, axisLen * 0.25f);
            }
            if (mz != -1)
            {
                float minz = m_MuscleMinEdit[mz];
                float maxz = m_MuscleMaxEdit[mz];

                normal = preQ * Vector3.forward * sign.z;
                from   = preQ * zyRoll * Vector3.right;

                Handles.color = Color.black;
                //Handles.DrawLine (t.position, t.position + (from * axisLen * 0.75f));

                Quaternion q = Quaternion.AngleAxis(minz, normal);
                from = q * from;

                Handles.color = Color.yellow;
                //Handles.DrawLine (t.position, t.position + (from * axisLen * 0.75f));

                // Draw Muscle range
                Handles.color = Handles.zAxisColor * alpha;
                Handles.DrawSolidArc(t.position, normal, from, maxz - minz, axisLen * 0.25f);
            }
        }