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)));
}