How to georeference model in Unity3d?

Hello everyone, I wonder if there is a possibility to assign GPS coordinates to a 3D model (.fpx), because, in part of my project, I have a shp file in which I have GIS data and to import file into Unity3d I had to go through the blender to convert the shapefile to .fpx model, but by doing this, I lose information about GPS coordinates. Would you have any ideas for me ?, any suggestion will be welcome.

Hi, I don’t know what it is that you are trying to do, so what I’m about to say may not be relevant and for that, I apologise.

Anyway, I am looking at mapping objects with lat and lon coordinates to the surface of a sphere. I took the coordinates from various places around the world from this site (http://www.latlong.net/) so that I could place the objects and see if their positions matched with the texture of the sphere (earth texture).

Note: Unity mesh is not suitable for this… you must get a mesh from blender with the UVs or download one from the web. I used this one: http://tf3dm.com/3d-model/planet-earth-99065.html.

Import the mesh into Unity, and download a texture: NASA Visible Earth - Home I used this one: http://eoimages.gsfc.nasa.gov/images/imagerecords/73000/73909/world.topo.bathy.200412.3x5400x2700.png

To map from Polar (lat lon) coordinates to Cartesian (xyz), you can use this function:

 private Vector3 PolarToCartesian(LatLon polar, float radius)
    {
        var latitude = DegreeToRadian(polar.Latitude);
        var longitude = DegreeToRadian(polar.Longitude);

        latitude = 1.570795765134f - latitude; // subtract 90 degrees (in radians)

        return new Vector3
        {
            x = (radius)*Mathf.Sin(latitude)*Mathf.Cos(longitude),
            y = (radius)*Mathf.Cos(latitude),
            z = (radius)*Mathf.Sin(latitude)*Mathf.Sin(longitude)
        };
    }

Radius is the radius of the sphere onto which I map the objects.

LatLon is just…

public class LatLon
{
    public float Latitude { get; set; }
    public float Longitude { get; set; }
}

and you need to convert your degrees to Radians:

  private float DegreeToRadian(float input)
    {
        return Mathf.PI * input / 180;
    }

So, for example, you have a sphere with radius 10 and you want to place a game object at based on the coordinates of London: 51.500083, -0.126182.

You can create a new game object like such:

 GameObject item = GameObject.CreatePrimitive(PrimitiveType.Cylinder);
 Vector3 itemPosition = (PolarToCartesian(new LatLon {Latitude = lat,Longitude=  lon},RadiusOfParentSphere));
 item.transform.Translate(itemPosition );
 item.gameObject.GetComponent<Renderer>().material.color = color;

Everything here is based off the fantastic work done by mgear: Latitude Longitude Position On 3D Sphere (V2) « Unity Coding – Unity3D

Note: you may need to rotate your sphere a bit to get the mapped object to align with the texture.

Hope this helps!