using UnityEngine; public class ScenePointToRealWorldPointExample:MonoBehaviour { public RealWorldTerrainContainer container; /// /// Converts scene point to real world point. /// /// Real World Terrain Container /// Scene Point /// Real World Point(X - Longitude, Y - Elevation, Z - Latitude) public static Vector3 ScenePointToRealWorldPoint(RealWorldTerrainContainer container, Vector3 scenePoint) { if (container == null) return Vector3.zero; Bounds bounds = new Bounds(); bool hasBounds = false; foreach (RealWorldTerrainItem item in container.terrains) { if (item == null) continue; if (!hasBounds) { bounds = item.bounds; hasBounds = true; } else bounds.Encapsulate(item.bounds); } if (!hasBounds) return Vector3.zero; float lngScale = container.area.width / bounds.size.x; float latScale = -container.area.height / bounds.size.z; float elevationScale = (container.maxElevation - container.minElevation) / bounds.size.y; Debug.Log(container.maxElevation + " " + container.minElevation + " " + bounds.size.y); Vector3 p = scenePoint - container.transform.position; return new Vector3(p.x * lngScale + container.area.xMin, p.y * elevationScale + container.minElevation, container.area.yMax + p.z * latScale); } private void Update() { Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); RaycastHit hit; if (Physics.Raycast(ray, out hit)) { Debug.Log(ScenePointToRealWorldPoint(container, hit.point).ToString("F4")); } } }