public AngleBasedHandModel createRandomFromSavedMorph()
    {
        TrainingUnit first = PostureDataHandler.instance.getRand();
        TrainingUnit second;

        do
        {
            second = PostureDataHandler.instance.getRand();
        }while(first.posture == second.posture);


        AngleBasedHandModel temp1  = first.hand;
        AngleBasedHandModel temp2  = second.hand;
        AngleBasedHandModel result = new AngleBasedHandModel();

        for (int i = 0; i < result.fingers.Length; i++)
        {
            result.fingers [i] = AngleBasedFingerModel.Lerp(temp1.fingers[i], temp2.fingers[i], ((float)i) / ((float)result.fingers.Length));
        }

        //Debug.Log ("First: "+first.posture+", Second: "+second.posture);
        temp1        = PostureDataHandler.instance.getRand().hand;
        result.thumb = temp1.thumb;
        return(result);
    }
    public AngleBasedHandModel createRandomRandom()
    {
        AngleBasedHandModel result = new AngleBasedHandModel();
        float random = Mathf.Pow(Random.value, 2.0f);

        result.fingers[(int)AngleBasedHandModel.FingerName.index].mcp  = Quaternion.Euler(Random.Range(XMCP_min, XMCP_max), random * abduct_index, 0);
        result.fingers[(int)AngleBasedHandModel.FingerName.middle].mcp = Quaternion.Euler(Random.Range(XMCP_min, XMCP_max), 0, 0);
        result.fingers[(int)AngleBasedHandModel.FingerName.ring].mcp   = Quaternion.Euler(Random.Range(XMCP_min, XMCP_max), random * abduct_ring, 0);
        result.fingers[(int)AngleBasedHandModel.FingerName.pinky].mcp  = Quaternion.Euler(Random.Range(XMCP_min, XMCP_max), random * abduct_pinky, 0);

        for (int i = 0; i < result.fingers.Length; i++)
        {
            AngleBasedFingerModel finger = result.fingers[i];
            random = Random.value;
            finger.jointAngles[(int)AngleBasedFingerModel.Fingerjoints.DIP] = DIP_min + random * (DIP_max - DIP_min);
            finger.jointAngles[(int)AngleBasedFingerModel.Fingerjoints.PIP] = PIP_min + random * (PIP_max - PIP_min);
        }

        random = Random.value;

        result.thumb.tmc = Quaternion.Lerp(PostureDataHandler.instance.getRand().hand.thumb.tmc, Quaternion.Euler(Random.Range(XTMC_min, XTMC_max), Random.Range(YTMC_min, YTMC_max), Random.Range(ZTMC_min, ZTMC_max)), 0.5f);
        result.thumb.jointAngles[(int)AngleBasedThumbModel.Fingerjoints.IP] = IP_min + random * (IP_max - IP_min);
        result.thumb.jointAngles[(int)AngleBasedThumbModel.Fingerjoints.MP] = MP_min + random * (MP_max - MP_min);

        result.rotation = Quaternion.identity;
        result.position = Vector3.zero;
        return(result);
    }
 public AngleBasedHandModel()
 {
     rotation = new sQuaternion();
     position = new sVector3(0, 0, 0);
     thumb    = new AngleBasedThumbModel();
     for (int i = 0; i < fingers.Length; i++)
     {
         fingers[i] = new AngleBasedFingerModel();
     }
 }
    public AngleBasedHandModel createRandomProcedural()
    {
        AngleBasedHandModel result = new AngleBasedHandModel();

        FingerState[] fingers = new FingerState[result.fingers.Length];
        for (int i = 0; i < fingers.Length; i++)
        {
            fingers [i] = (FingerState)Random.Range(0, System.Enum.GetNames(typeof(FingerState)).Length);
        }
        //abduction
        float random = Mathf.Pow(Random.value, 2.0f);

        float[] abductions = { random *abduct_index, 0, random *abduct_ring, random *abduct_pinky };
        for (int i = 0; i < result.fingers.Length; i++)
        {
            float xmcp = 0;
            if (fingers [i] == FingerState.ForwardFist || fingers [i] == FingerState.Flat)
            {
                xmcp = 0;
            }
            if (fingers [i] == FingerState.Fist)
            {
                xmcp = XMCP_max;
            }
            if (fingers [i] == FingerState.HyperExtended)
            {
                xmcp = XMCP_min;
            }

            result.fingers [i].mcp = Quaternion.Euler(xmcp, abductions[i], 0);

            AngleBasedFingerModel finger = result.fingers[i];
            if (fingers [i] == FingerState.HyperExtended || fingers [i] == FingerState.Flat)
            {
                finger.jointAngles [(int)AngleBasedFingerModel.Fingerjoints.DIP] = DIP_min;
                finger.jointAngles [(int)AngleBasedFingerModel.Fingerjoints.PIP] = PIP_min;
            }
            if (fingers [i] == FingerState.Fist || fingers [i] == FingerState.ForwardFist)
            {
                finger.jointAngles [(int)AngleBasedFingerModel.Fingerjoints.DIP] = DIP_max;
                finger.jointAngles [(int)AngleBasedFingerModel.Fingerjoints.PIP] = PIP_max;
            }
        }

        ThumbState thumb = (ThumbState)Random.Range(0, System.Enum.GetNames(typeof(ThumbState)).Length);

        result.thumb = PostureDataHandler.instance.getRand().hand.thumb;

        result.rotation = Quaternion.identity;
        result.position = Vector3.zero;

        result = AngleBasedHandModel.Lerp(result, PostureDataHandler.instance.getRand(TrainingUnit.Posture.idle).hand, 0.2f);

        return(result);
    }
Пример #5
0
    public float euclidianDistance(AngleBasedFingerModel other)
    {
        float result = 0;

        for (int i = 0; i < jointAngles.Length - 2; i++)
        {
            result += Mathf.Pow(jointAngles [i] - other.jointAngles [i], 2.0f);
        }
        result += Mathf.Pow(Quaternion.Angle(other.mcp, mcp), 2.0f);
        return(Mathf.Sqrt(result));
    }
Пример #6
0
    public static AngleBasedFingerModel Lerp(AngleBasedFingerModel first, AngleBasedFingerModel second, float t)
    {
        AngleBasedFingerModel result = new AngleBasedFingerModel();

        t          = Mathf.Clamp(t, 0, 1);
        result.mcp = Quaternion.Lerp(first.mcp, second.mcp, t);

        for (int i = 0; i < result.jointAngles.Length; i++)
        {
            result.jointAngles [i] = Mathf.Lerp(first.jointAngles [i], second.jointAngles [i], t);
        }
        return(result);
    }
    public static string getCSVHeader(string endl, string handname)
    {
        string result = "";

        result += AngleBasedThumbModel.getCSVHeader(endl, handname + "Thumb") + endl;
        for (int i = 0; i < System.Enum.GetNames(typeof(FingerName)).Length; i++)
        {
            result += AngleBasedFingerModel.getCSVHeader(endl, handname + System.Enum.GetNames(typeof(FingerName))[i]) + endl;
        }
        result += sQuaternion.getCSVHeader(endl, handname + "Rot") + endl;
        result += sVector3.getCSVHeader(endl, handname + "Pos");

        return(result);
    }
    public static AngleBasedHandModel Lerp(AngleBasedHandModel first, AngleBasedHandModel second, float t)
    {
        AngleBasedHandModel result = new AngleBasedHandModel();

        t = Mathf.Clamp(t, 0, 1);
        result.rotation = Quaternion.Lerp(first.rotation, second.rotation, t);
        result.position = Vector3.Lerp(first.position, second.position, t);

        for (int i = 0; i < result.fingers.Length; i++)
        {
            result.fingers [i] = AngleBasedFingerModel.Lerp(first.fingers [i], second.fingers [i], t);
        }
        result.thumb = AngleBasedThumbModel.Lerp(first.thumb, second.thumb, t);
        return(result);
    }