Reputation:
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.
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
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