IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 游戏开发 -> unity根据经纬度计算坐标和三维坐标转换经纬度,根据经纬度生成地球 -> 正文阅读

[游戏开发]unity根据经纬度计算坐标和三维坐标转换经纬度,根据经纬度生成地球

最近在做一个地球的东西,记录一下如何生成圆形

 public float EarthRadius = 50;
    public GameObject a, pra;//a为中心点 bra为生成物体的父级
    private int ZoomLevel=3, interval = 10;//地球精度 经纬度间隔
     private void Ins()
    {
        for (int i = 0; i < 90; i++)//经纬度上半球
        {
            if (i % interval == 0)
            {
                for (int x = 0; x < 360; x++)
                {
                    if (x % interval == 0)
                    {
                        GameObject h = Instantiate(a, pra.transform);
                        h.SetActive(true);
                        h.transform.position = GetSphericalCoordinates(i, x);
                    }
                }
            }

        }
        for (int i = 0; i > -90; i--)//经纬度下半球
        {
            if (i % -interval == 0)
            {
                for (int x = 0; x > -360; x--)
                {
                    if (x % -interval == 0)
                    {
                        GameObject h = Instantiate(a, pra.transform);
                        h.SetActive(true);
                        h.transform.position = GetSphericalCoordinates(i, x);
                    }

                }
            }
        }

    }  /// <summary>
    /// 根据经纬度计算球面坐标
    /// </summary>
    /// <param name="longitude">经度</param>
    /// <param name="latitude">纬度</param>
    /// <returns></returns>
    private Vector3 GetSphericalCoordinates(double longitude, double latitude)
    {
        latitude = latitude * Mathf.PI / 180D;
        longitude = longitude * Mathf.PI / 180D;
        double x = EarthRadius * Mathf.Cos((float)latitude) * Mathf.Sin((float)longitude);
        double y = EarthRadius * Mathf.Sin((float)latitude);
        double z = -EarthRadius * Mathf.Cos((float)latitude) * Mathf.Cos((float)longitude);
        return new Vector3((float)x, (float)y, (float)z);
    }
    /// <summary>
    /// 根据三维坐标计算经纬度
    /// </summary>
    /// <param name="pos">目标三维坐标</param>
    /// <returns></returns>
    private Vector2 CalculateLontitudeAndLatitude(Vector3 pos)
    {
        int s = 1;
        int q = 1;
        if (pos.x < 0.0f)
        {
            s = -1;
        }
        if (pos.y > 0.0f)
        {
            q = -1;
        }
        float latitudeAngle = Mathf.Asin(pos.y / EarthRadius);
        float latitude = latitudeAngle * 180.0f / Mathf.PI;

        float longtitudeAngle = Mathf.Acos(pos.z / (-1.0f * EarthRadius * Mathf.Cos(latitudeAngle)));
        float longtitude = longtitudeAngle * 180.0f / Mathf.PI;
        return new Vector2(s * longtitude, q * latitude);
    }
      /// <summary>
    /// 双曲函数
    /// </summary>
    /// <returns></returns>
    private float Sinh(float x)
    {
        float ax = (Mathf.Exp(x) - Mathf.Exp(-1.0f * x)) / 2;
        return ax;
    }
    /// <summary>
    /// 根据经纬度获取目标瓦片位置
    /// </summary>
    /// <param name="longtitude">经度</param>
    /// <param name="latitude">纬度</param>
    /// <returns></returns>
    private Vector2 CalculateTileIndex(double longtitude, double latitude)
    {
        int x = (int)(Mathf.Pow(2, ZoomLevel - 1) * (longtitude / 180 + 1));
        int y = (int)(Mathf.Pow(2, ZoomLevel - 1) * (1 - Mathf.Log((Mathf.Tan(Mathf.PI * (float)latitude / 180) + 1 / Mathf.Cos(Mathf.PI * (float)latitude / 180)), 2.7182818f) / Mathf.PI));
        return new Vector2(x, y);
    }
    /// <summary>
    /// 根据瓦片编号获取经纬度信息
    /// </summary>
    /// <param name="xtile">瓦片x编号</param>
    /// <param name="ytile">瓦片y编号</param>
    /// <returns></returns>
    private Vector2 CalculateLongAndLa(int xtile, int ytile)
    {
        float n = Mathf.Pow(2, ZoomLevel);
        float longtitude = xtile / n * 360.0f - 180.0f;
        float latitude = Mathf.Atan(Sinh(Mathf.PI * (1 - 2 * ytile / n))) * 180.0f / Mathf.PI;
        return new Vector2(longtitude, latitude);
    }
    /// <summary>
    /// 经纬度坐标转像素坐标
    /// </summary>
    /// <param name="longtitude">经度</param>
    /// <param name="latitude">纬度</param>
    /// <returns>像素坐标值</returns>
    private Vector2 LongAndLaToPixel(float longtitude, float latitude)
    {
        float pixelX = (longtitude + 180 / 360) * Mathf.Pow(2, ZoomLevel) * 256 % 256;
        float pixelY = (1 - Mathf.Log(Mathf.Tan(latitude * Mathf.PI / 180) + 1 / (Mathf.Cos(latitude * Mathf.PI / 180)), 2.7182818f) / (2 * Mathf.PI)) * Mathf.Pow(2, ZoomLevel) * 256 % 256;
        return new Vector2(pixelX, pixelY);
    }
    /// <summary>
    /// 根据瓦片上某一点的像素坐标得到经纬度坐标
    /// </summary>
    /// <param name="tileX">瓦片X编号</param>
    /// <param name="tileY">瓦片Y编号</param>
    /// <param name="pixelX">目标点X像素坐标</param>
    /// <param name="pixelY">目标点Y像素坐标</param>
    /// <returns></returns>
    private Vector2 PixelToLongAndLa(float tileX, float tileY, float pixelX, float pixelY)
    {
        float longtitude = (tileX + pixelX / 256) / (Mathf.Pow(2, ZoomLevel)) * 360 - 180.0f;
        float latitude = (Mathf.Asin(Sinh(Mathf.PI - 2 * Mathf.PI * (tileY + pixelY / 256) / (Mathf.Pow(2, ZoomLevel))))) * 180 / Mathf.PI;
        return new Vector2(longtitude, latitude);
    }

  游戏开发 最新文章
6、英飞凌-AURIX-TC3XX: PWM实验之使用 GT
泛型自动装箱
CubeMax添加Rtthread操作系统 组件STM32F10
python多线程编程:如何优雅地关闭线程
数据类型隐式转换导致的阻塞
WebAPi实现多文件上传,并附带参数
from origin ‘null‘ has been blocked by
UE4 蓝图调用C++函数(附带项目工程)
Unity学习笔记(一)结构体的简单理解与应用
【Memory As a Programming Concept in C a
上一篇文章      下一篇文章      查看所有文章
加:2022-01-14 02:19:50  更:2022-01-14 02:21:40 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/27 18:35:11-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码