This site uses strictly necessary cookies. More Information

X# Calculate the arc distance between 2 points on a sphere

Hello Everyone, I have an issue here, its related to math but some hints are appretiated. The player has to position 3d models on a sphere which is the globe. For example a building.. and after plotting I have to display the distance between his poltted position and the accurate position. I am getting the player chosen point by a raycast, so on mouse down the model will be plotted and I save have the hit point and the other point is defined by me. I have positioned small sphere's at the accurate position, so the position of these sphere's have to be compared to the hit point(position) to get the distance(arc distance) I think to get the arc distance I need a third point which is the center of the sphere(globe) and hence I can get the radus, since the hit point and the original position is the on surface of the globe. I really appretiate any help!

**Answer** by Owen-Reynolds
·
Jun 22, 2012 at 02:14 PM

Using the center point sounds right. Run a "spoke" from the center to one point; find the angle to the other; you know 360 degrees is a distance of 2xPIxR; find the percent. Untested:

```
Vector3 spokeToActual = playerPos-sphereCenter,
spokeToCorrect = correctPos-sphereCenter;
float angleFromCenter = Vector3.Angle(spokeToActual, spokeToCorrect);
// NOTE: angle inputs don't need normalize. In degrees(!!)
float D = 2*Mathf.PI*radius * (angleFromCenter/360);
```

As a check, print that along with `playerPos-correctPos).magnitude`

. It should only be a little bit bigger, if the player is remotely close.

sounds to be the solutoins, i'll try this out then comment! thanks alot btw

**Answer** by MV10
·
Jan 02, 2016 at 06:44 AM

Wolfram-Alpha defines great-circle spherical distance as the arcosine of the dot product of the two coordinates:

```
float SphericalDistance(Vector3 position1, Vector3 position2)
{
return Mathf.Acos(Vector3.Dot(position1, position2));
}
```

Wolfram's explanation is for a unit sphere. In most applications, radius must be considered. This makes sense. As the radius approaches infinity, the distance between P1 and P2 will almost become a straight line. But if the radius was exactly half the straight line distance between P1 and P2, then the distance would equal pi*radius.

This approach is correct, you just need to multiply by the radius at the end. Also position1 and position2 need to be normalized, otherwise acos won't return there right angle.

**Answer** by zaghaghi
·
Jun 22, 2012 at 02:57 PM

Hi, I think that you need to compute great circle distance:

If I read the vector formula correctly, the following code should calculate the orthodromic distance accurately.

```
float CalculateSurfaceDistance(Vector3 point1, Vector3 point2){
return $$anonymous$$athf.Atan((Vector3.$$anonymous$$agnitude((Vector3.Cross(point1,point2))))/(Vector3.Dot(point1, point2)));
}
```

### Your answer

### Welcome to Unity Answers

The best place to ask and answer questions about development with Unity.

To help users navigate the site we have posted a site navigation guide.

If you are a new user to Unity Answers, check out our FAQ for more information.

Make sure to check out our Knowledge Base for commonly asked Unity questions.

If you are a moderator, see our Moderator Guidelines page.

We are making improvements to UA, see the list of changes.