예제 #1
0
    float CenterOfGravity(BodyJoints body, float myMass)
    {
        Vector3 v = new Vector3(body.joints[JointType.Head].worldPosition.x,
                                body.joints[JointType.Head].worldPosition.y, body.joints[JointType.Head].worldPosition.z);
        float mass = myMass; //kg
        float leftM, rightM;

        var     vectors = MovementAnalyzer.GenerateLowerBodyPlanes(body);
        Vector3 sFrame  = vectors[BasePlanes.Frontal];
        float   A       = sFrame.x,
                B       = sFrame.y,
                C       = sFrame.z;

        float angle = (float)Math.Asin(Math.Abs(A * v.x + B * v.y + C * v.z));

        if (angle == 90.0f)
        {
            leftM  = mass / 2.0f;
            rightM = mass / 2.0f;
        }

        float distanceFrom90 = 90.0f - angle;

        if (distanceFrom90 > 0)
        {
            float leftMultiple = distanceFrom90 / 90.0f;
            leftM  = mass * leftMultiple;
            rightM = mass - leftM;
        }
        else
        {
            float rightMultiple = distanceFrom90 / 90.0f;
            rightM = rightMultiple * mass;
            leftM  = mass - rightMultiple;
        }


        // Calculado em relação a cabeça!
        var footLeft  = body.joints[JointType.LeftFoot].worldPosition;
        var footRight = body.joints[JointType.RightFoot].worldPosition;

        float distanceFromDataumLeft = (float)Math.Sqrt(
            Math.Pow(v.x - footLeft.x, 2.0)
            + Math.Pow(v.y - footLeft.y, 2.0)
            + Math.Pow(v.z - footLeft.z, 2.0));

        float distanceFromDataumRight = (float)Math.Sqrt(
            Math.Pow(v.x - footRight.x, 2.0)
            + Math.Pow(v.y - footRight.y, 2.0)
            + Math.Pow(v.z - footRight.z, 2.0));


        float momentLeft  = distanceFromDataumLeft * leftM;
        float momentRight = distanceFromDataumRight * rightM;

        float momentSum = momentLeft + momentRight;

        return(momentSum / mass);
    }
예제 #2
0
    public void ReceiveData(BodyJoints[] data)
    {
        foreach (var body in data)
        {
            if (body.status != Status.Tracking)
            {
                continue;
            }

            bones = MovementAnalyzer.ExtractBonesFromBodyJoints(body);
            RenderBones();
        }
    }
예제 #3
0
    public void ReceiveData(BodyJoints[] data)
    {
        foreach (var body in data)
        {
            if (body.status != Status.Tracking)
            {
                continue;
            }

            var currentBodyAngles = new BodyAngles(body);
            var errors            = MovementAnalyzer.CompareBodyAngles(currentBodyAngles, targetBodyAngles, angleTolerance);

            foreach (var error in errors)
            {
                //   Debug.Log(error.plane + " " + error.boneTypes[0] + "/" + error.boneTypes[1]);
            }
        }
    }
예제 #4
0
 public void Init()
 {
     _movementThoughts = new MovementAnalyzer();
 }
예제 #5
0
    public void ReceiveData(Voxar.BodyJoints[] bodys)
    {
        foreach (var body in bodys)
        {
            if (body.status == Status.Tracking)
            {
                Voxar.BodyAngles currentAngle = new Voxar.BodyAngles(body);
                var errors = MovementAnalyzer.CompareBodyAngles(currentAngle, Target, 10.0f);
                // MovementAnalyzer.CalculateAngleForBones(body, BoneType.RightClavicule, BoneType.LeftClavicule);

                // Debug.Log(currentAngle.FrontalAngles.GetAngle(BoneType.LeftClavicule, BoneType.RightClavicule));
                // pegar o angulo padrão entre eles!!!!
                bool entrei = false;
                foreach (var error in errors)  // Vejo se a postura tá boa.
                {
                    entrei = true;
                    var angle = currentAngle.FrontalAngles.angles[error.boneTypes[0]][error.boneTypes[1]];
                    Debug.Log(angle);
                    text.SetActive(true);
                }
                if (!entrei)
                {
                    text.SetActive(false);
                }

                leftFoot  = body.joints[JointType.LeftFoot].worldPosition / 1000.0f;
                rightFoot = body.joints[JointType.RightFoot].worldPosition / 1000.0f;
                var distanceFoots = Vector3.Distance(leftFoot, rightFoot);

                var     vectors = MovementAnalyzer.GenerateLowerBodyPlanes(body);
                Vector3 myDirectionmyDirection = vectors[BasePlanes.Frontal];
                Vector3 mustBeTheNext;

                if (begin)
                {
                    mustBeTheNext = rightFoot;
                    ball.transform.localPosition = mustBeTheNext;
                    begin = false;
                }
                if (turnFoot == false && distanceFoots >= 0.5 && !andando)  // Pé direito
                {
                    mustBeTheNext = rightFoot /*myDirection.normalized * 0.0045f */;
                    ball.transform.localPosition = mustBeTheNext;
                    var cubeRenderer = ball.GetComponent <Renderer>();
                    cubeRenderer.material.SetColor("_Color", Color.red);
                    turnFoot = !turnFoot;
                    andando  = true;
                }
                else if (distanceFoots >= 0.5 && turnFoot == true && !andando)   // Pé esquerdo
                {
                    mustBeTheNext = leftFoot /*myDirection.normalized * 0.0045f */;
                    ball.transform.localPosition = mustBeTheNext;
                    var cubeRenderer = ball.GetComponent <Renderer>();
                    cubeRenderer.material.SetColor("_Color", Color.blue);
                    turnFoot = !turnFoot;
                    andando  = true;
                }
                if (distanceFoots < 0.5 && andando)
                {
                    andando = false;
                }

                float cg = CenterOfGravity(body, 71.45f); // value just for test

                float p  = body.joints[JointType.RightAnkle].worldPosition.z / 1000.0f;
                float q  = body.joints[JointType.LeftAnkle].worldPosition.z / 1000.0f;
                float pt = (float)(Math.Truncate((double)p * 100.0) / 100.0);
                float qt = (float)(Math.Truncate((double)q * 100.0) / 100.0);

                float vp  = (pt - qt) / (10 * (Time.deltaTime));
                float vpp = 36 * (Math.Abs(vp / 10)) / 10;
                float vpt = (float)(Math.Truncate((double)vpp * 100.0) / 100.0);

                textRenderer.text = $"R {pt} Metros" + "\r\n" + $"L {qt} Metros" + "\r\n" + $"L {vpt} p/s";
                Debug.Log(p + "Meters");
            }
        }
    }