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();
     }
 }
示例#2
0
 public static sQuaternion normalized(sQuaternion quat)
 {
     quat.normalize();
     return(quat);
 }
示例#3
0
    public sQuaternion mirroredY()
    {
        sQuaternion temp = new sQuaternion(this.x, this.y, this.z, this.w);

        return(temp.mirrorY());
    }
    // Update is called once per frame
    void Update()
    {
        //TODO: this seems to not be correct; position values are funny
        hand.rotation = root.rotation;
        hand.position = root.position;

        sQuaternion temp = Quaternion.Inverse(root.rotation) * thumb1.rotation;

        if (rightHanded)
        {
            temp.mirrorX();
        }
        hand.thumb.tmc = temp;
        hand.thumb.jointAngles [(int)AngleBasedThumbModel.Fingerjoints.TMC_X] = ((Quaternion)temp).eulerAngles.x;
        hand.thumb.jointAngles [(int)AngleBasedThumbModel.Fingerjoints.TMC_Y] = ((Quaternion)temp).eulerAngles.y;
        hand.thumb.jointAngles [(int)AngleBasedThumbModel.Fingerjoints.TMC_Z] = ((Quaternion)temp).eulerAngles.z;
        hand.thumb.jointAngles [(int)AngleBasedThumbModel.Fingerjoints.MP]    = Vector3.Angle(thumb1.forward, thumb2.forward);
        hand.thumb.jointAngles [(int)AngleBasedThumbModel.Fingerjoints.IP]    = Vector3.Angle(thumb3.forward, thumb2.forward);

        temp = Quaternion.Inverse(root.rotation) * index1.rotation;
        if (rightHanded)
        {
            temp.mirrorX();
        }
        hand.fingers [(int)AngleBasedHandModel.FingerName.index].mcp = temp;
        hand.fingers[(int)AngleBasedHandModel.FingerName.index].jointAngles[(int)AngleBasedFingerModel.Fingerjoints.MCP_SIDE] = ((Quaternion)temp).eulerAngles.y;
        hand.fingers[(int)AngleBasedHandModel.FingerName.index].jointAngles[(int)AngleBasedFingerModel.Fingerjoints.MCP_UP]   = ((Quaternion)temp).eulerAngles.x;
        hand.fingers[(int)AngleBasedHandModel.FingerName.index].jointAngles[(int)AngleBasedFingerModel.Fingerjoints.PIP]      = Vector3.Angle(index1.forward, index2.forward);
        hand.fingers[(int)AngleBasedHandModel.FingerName.index].jointAngles[(int)AngleBasedFingerModel.Fingerjoints.DIP]      = Vector3.Angle(index2.forward, index3.forward);

        temp = Quaternion.Inverse(root.rotation) * middle1.rotation;
        if (rightHanded)
        {
            temp.mirrorX();
        }
        hand.fingers [(int)AngleBasedHandModel.FingerName.middle].mcp = temp;
        hand.fingers[(int)AngleBasedHandModel.FingerName.middle].jointAngles[(int)AngleBasedFingerModel.Fingerjoints.MCP_SIDE] = ((Quaternion)temp).eulerAngles.y;
        hand.fingers[(int)AngleBasedHandModel.FingerName.middle].jointAngles[(int)AngleBasedFingerModel.Fingerjoints.MCP_UP]   = ((Quaternion)temp).eulerAngles.x;
        hand.fingers[(int)AngleBasedHandModel.FingerName.middle].jointAngles[(int)AngleBasedFingerModel.Fingerjoints.PIP]      = Vector3.Angle(middle1.forward, middle2.forward);
        hand.fingers[(int)AngleBasedHandModel.FingerName.middle].jointAngles[(int)AngleBasedFingerModel.Fingerjoints.DIP]      = Vector3.Angle(middle2.forward, middle3.forward);

        temp = Quaternion.Inverse(root.rotation) * ring1.rotation;
        if (rightHanded)
        {
            temp.mirrorX();
        }
        hand.fingers [(int)AngleBasedHandModel.FingerName.ring].mcp = temp;
        hand.fingers[(int)AngleBasedHandModel.FingerName.ring].jointAngles[(int)AngleBasedFingerModel.Fingerjoints.MCP_SIDE] = ((Quaternion)temp).eulerAngles.y;
        hand.fingers[(int)AngleBasedHandModel.FingerName.ring].jointAngles[(int)AngleBasedFingerModel.Fingerjoints.MCP_UP]   = ((Quaternion)temp).eulerAngles.x;
        hand.fingers[(int)AngleBasedHandModel.FingerName.ring].jointAngles[(int)AngleBasedFingerModel.Fingerjoints.PIP]      = Vector3.Angle(ring1.forward, ring2.forward);
        hand.fingers[(int)AngleBasedHandModel.FingerName.ring].jointAngles[(int)AngleBasedFingerModel.Fingerjoints.DIP]      = Vector3.Angle(ring2.forward, ring3.forward);

        temp = Quaternion.Inverse(root.rotation) * pinky1.rotation;
        if (rightHanded)
        {
            temp.mirrorX();
        }
        hand.fingers [(int)AngleBasedHandModel.FingerName.pinky].mcp = temp;
        hand.fingers[(int)AngleBasedHandModel.FingerName.pinky].jointAngles[(int)AngleBasedFingerModel.Fingerjoints.MCP_SIDE] = ((Quaternion)temp).eulerAngles.y;
        hand.fingers[(int)AngleBasedHandModel.FingerName.pinky].jointAngles[(int)AngleBasedFingerModel.Fingerjoints.MCP_UP]   = ((Quaternion)temp).eulerAngles.x;
        hand.fingers[(int)AngleBasedHandModel.FingerName.pinky].jointAngles[(int)AngleBasedFingerModel.Fingerjoints.PIP]      = Vector3.Angle(pinky1.forward, pinky2.forward);
        hand.fingers[(int)AngleBasedHandModel.FingerName.pinky].jointAngles[(int)AngleBasedFingerModel.Fingerjoints.DIP]      = Vector3.Angle(pinky2.forward, pinky3.forward);

        if (isDetecting)
        {
            if (Input.GetKeyDown("k"))
            {
                saveCurrentAs(trainingPosture);
            }
            else if (Input.GetKeyDown("s"))
            {
                PostureDataHandler.instance.saveData();
            }
            else
            {
                currentPosture = knn.detectPosture(hand);
                if (poseText)
                {
                    poseText.text = "Posture: " + currentPosture + "; Discomfort: " + getDiscomfort() + "; Comfort: " + Comfort.getRRPComponent(hand);
                }
            }
        }
    }