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