user9211718
user9211718

Reputation:

Find angle between two objects while taking another object as center in Unity using C#

I am trying to find angle between two stationary objects while taking a moving object as center. I have tried a lot like finding distance between all the objects and then applying cosine rule to find angle but it calculates the wrong angle. This is the code. First it calculates the desired angles position(greatest, smallest or medium), then calling calculate angle.

enter image description here

void GenerateAngle()
{
if (transform.position != currentPos)
    {
        float angle = 0;
        distancePillarRToPillarL = Vector3.Distance(PillarR.position, PillarL.position);
        distancePlayerToPillarL = Vector3.Distance(PillarL.position, transform.position);
        distancePlayerToPillarR = Vector3.Distance(PillarR.position, transform.position);
        print(distancePillarRToPillarL + "  " + distancePlayerToPillarL + "  " + distancePlayerToPillarR);

        if (distancePlayerToPillarR > distancePlayerToPillarL && distancePlayerToPillarR > distancePillarRToPillarL)
        {
            if (distancePillarRToPillarL > distancePlayerToPillarL)
            {
                angle = CalculateAngle(distancePlayerToPillarR, distancePillarRToPillarL, distancePlayerToPillarL, AnglePos.Medium);
            }
            else if (distancePlayerToPillarL > distancePillarRToPillarL)
            {
                angle = CalculateAngle(distancePlayerToPillarR, distancePlayerToPillarL, distancePillarRToPillarL, AnglePos.Smallest);
            }
        }
        else if (distancePlayerToPillarL > distancePlayerToPillarR && distancePlayerToPillarL > distancePillarRToPillarL)
        {
            if (distancePillarRToPillarL > distancePlayerToPillarR)
            {
                angle = CalculateAngle(distancePlayerToPillarL, distancePillarRToPillarL, distancePlayerToPillarR, AnglePos.Medium);
            }
            else if (distancePlayerToPillarR > distancePillarRToPillarL)
            {
                angle = CalculateAngle(distancePlayerToPillarL, distancePillarRToPillarL, distancePlayerToPillarR, AnglePos.Smallest);
            }
        }
        else if (distancePillarRToPillarL > distancePlayerToPillarL && distancePillarRToPillarL > distancePlayerToPillarR)
        {
            if (distancePlayerToPillarL > distancePlayerToPillarR)
            {
                angle = CalculateAngle(distancePillarRToPillarL, distancePlayerToPillarL, distancePlayerToPillarR, AnglePos.Largest);
            }
            else if (distancePlayerToPillarR > distancePlayerToPillarL)
            {
                angle = CalculateAngle(distancePillarRToPillarL, distancePlayerToPillarR, distancePlayerToPillarL, AnglePos.Largest);
            }
        }
        print(angle);
        currentPos = transform.position;
    }


}



float CalculateAngle(float largest, float medium, float smallest, AnglePos pos)


 {
        float largestAngle = (Mathf.Acos((Mathf.Pow(medium, 2) + Mathf.Pow(smallest, 2) - Mathf.Pow(largest, 2)) / (2 * medium * smallest))) * Mathf.Rad2Deg;
        float angle;
        switch (pos)
        {
            case AnglePos.Medium:
                {
                    angle = Mathf.Asin((medium * Mathf.Sin(largestAngle)) / largest) * Mathf.Rad2Deg ;
                    return angle;
                }

        case AnglePos.Smallest:
            {
                angle = Mathf.Asin((smallest *  Mathf.Sin(largestAngle)) / largest) * Mathf.Rad2Deg;
                return angle;
            }

        default:
            {
                return largestAngle;
            }

    }

}

Upvotes: 1

Views: 2483

Answers (1)

babu646
babu646

Reputation: 1001

I believe you want something like this?

Vector3 center = /*...*/
Vector3 a = /*...*/
Vector3 b = /*...*/

Vector3 directionA = Vector3.Normalize(center - a);
Vector3 directionB = Vector3.Normalize(center - b);

float angle = Vector3.Angle(directionA, directionB); //degrees

This calculates the angle between 2 object directions relative to a center.

Upvotes: 2

Related Questions