Unity解决:GIS(GPS的经纬度坐标)定位系统坐标转unity坐标(世界坐标)

news2024/12/26 7:44:19

目录

一、前言

二、功能实现

三、测试

四、备注

 如果要实现该效果的demo,请联系作者


一、前言

最近项目中用到了第三方的定位系统,有的是使用GPS定位、有的是使用UWB定位。第三方的定位系统把他们的定位信息通过网络发送给Unity,在Unity内实时显示人/设备的移动。因为第三方可能不是同一家厂商,他们的定位坐标系跟Unity也不一致,为了能够灵活的接入第三方定位系统,做了下面的工具。(目前使用的范围只限于二维平面坐标)

二、功能实现

要实现坐标系统的转换,我们需要知道的前提是两个坐标系的比例、旋转角度、坐标原点的偏移。计算上述三个参数、我们需要知道至少两个点分别在两个坐标系中的坐标,在Unity中的坐标我们可以直接使用transform.position就可以了,在非Unity坐标系中位置我们需要跟厂商要同样点在他们坐标系中的位置。

using UnityEngine;
public class CoordinateAnchor : MonoBehaviour
{
    /// <summary>
    /// 在非unity坐标系中的x轴坐标值
    /// </summary>
    public double AssociativeX;
    /// <summary>
    /// 在非unity坐标系中的y轴坐标值
    /// </summary>
    public double AssociativeY;
}
using UnityEngine;
/// <summary>
/// 平面坐标坐标系转换工具,把非unity的坐标转换成unity的世界坐标
/// 适用于非unity坐标系的转换包括(位移、旋转、缩放(x与y轴等比例))
/// 经纬度转换也可以,只是精度不高(高纬度地区与低纬度地区 1纬度代表距离不一样)
/// </summary>
public class CoordinateConversionManager : MonoBehaviour
{
    private CoordinateAnchor point0;
    private CoordinateAnchor point1;
    private Vector3 point0InUnity;
    private Vector3 point1InUnity;
    private double scale;//两个坐标系的缩放比()
    private float angle;//非unity坐标系的旋转角度(度)
    private float xTran;//非unity坐标系x轴相对位移
    private float yTran;//非unity坐标系y轴相对位移
    private void Reset()
    {
        if (this.transform.childCount > 0) return;
        //创建控制点
        for (var i = 0; i < 2; i++)
        {
            var obj = new GameObject("point_" + i);
            obj.AddComponent<CoordinateAnchor>();
            obj.transform.parent = this.transform;
        }
    }
    private void Start()
    {
        var child0 = this.transform.GetChild(0);
        if (child0 != null)
        {
            point0 = child0.GetComponent<CoordinateAnchor>();
            point0InUnity = child0.transform.position;
        }
        var child1 = this.transform.GetChild(1);
        if (child1 != null)
        {
            point1 = child1.GetComponent<CoordinateAnchor>();
            point1InUnity = child1.transform.position;
        }
        Vector2 v0 = new Vector2(point0InUnity.x - point1InUnity.x, point0InUnity.z - point1InUnity.z);
        Vector2 v1 = new Vector2((float)(point0.AssociativeX - point1.AssociativeX), (float)(point0.AssociativeY - point1.AssociativeY));
        //计算比例关系
        scale = v0.magnitude / v1.magnitude;
        //计算旋转关系
        angle = Vector2.SignedAngle(v1, v0);
        //计算位移关系
        xTran = GetOffset((float)point0.AssociativeX, (float)point0.AssociativeY).x - point0InUnity.x;
        yTran = GetOffset((float)point0.AssociativeX, (float)point0.AssociativeY).z - point0InUnity.z;
    }
    /// <summary>
    /// 计算两个坐标系的偏移(非unity坐标系原点在unity世界坐标系中的位置)
    /// </summary>
    /// <param name="e"></param>
    /// <param name="n"></param>
    /// <returns></returns>
    private Vector3 GetOffset(float e, float n)
    {
        e = e * (float)scale;
        n = n * (float)scale;
        float e1 = e * Mathf.Cos(Mathf.Deg2Rad * angle) - n * Mathf.Sin(Mathf.Deg2Rad * angle);
        float n1 = n * Mathf.Cos(Mathf.Deg2Rad * angle) + e * Mathf.Sin(Mathf.Deg2Rad * angle);
        return new Vector3(e1, 0, n1);
    }
    /// <summary>
    /// 获取其他坐标系坐标点在unity坐标系中的坐标
    /// </summary>
    /// <param name="x"></param>
    /// <param name="y"></param>
    /// <returns></returns>
    public Vector3 GetUnityPosition(float x,float y)
    {
        x = x * (float)scale;
        y = y * (float)scale;
        float e1 = x * Mathf.Cos(Mathf.Deg2Rad * angle) - y * Mathf.Sin(Mathf.Deg2Rad * angle);
        float n1 = y * Mathf.Cos(Mathf.Deg2Rad * angle) + x * Mathf.Sin(Mathf.Deg2Rad * angle);
        return new Vector3(e1 - xTran, 0, n1 - yTran);
    }
}

 在unity的hierarchy窗口中创建一个空物体,添加上我们的CoordinateConversionManager 脚本,它会自动生成两个带有CoordinateAnchor组件的子物体。我们在这两个子物体上配置好第三方给的坐标,然后再把这个子物体移动到对应位置即可。

三、测试

这套方案可以转换经纬度,但是因为纬度与经度不一样,纬度越高1纬度代表的距离越短。但是为了测试,我这次还是以经纬度为例。首先我们先从百度地图上截取一张图片放入Unity,并把它的格式设为UI,然后添加到场景中。

 接下来我们配置coordinateController下面的两个锚点。打开百度地图的拾取坐标系统界面(网页地址),在这个网页中找两个对角线方向容易识别的点,这里我选择的是左上方地铁的起始位置和右下方地铁和东二环的交汇位置,然后分别记录他们的经纬度再填入锚点中。

然后再在场景中添加一个sphere,在它上面新建一个脚本。

using UnityEngine;
public class ConvertorTest : MonoBehaviour
{
    public CoordinateConversionManager convertor;
    public float x;
    public float y;
    private void Update()
    {
        transform.localPosition = convertor.GetUnityPosition(x, y);
    }
}

 填入一个测试用的经纬度,然后运行Unity,小球就会移动到你输入的经纬度位置,可以看出小球大致在我们输入的经纬度位置。

四、备注

目前这个工具只能做平面二维坐标系统的转换、并且两个坐标系的x轴与y轴的比例都是相同的才行。如果要实现不同比例的换算我们还需要知道更多的位置点对应关系才能解出。

还有一个使用限制条件,第三方的坐标轴也需要是左手坐标系(目前已经完成2维GIS坐标转unity3维坐标)。

 如果要实现该效果的demo,请联系作者

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/674382.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

项目集活动—项目集定义阶段活动

项目集活动是为支持项目集而开展的任务和工作&#xff0c;贯穿整个项目集生命周期。 项目集活动包括&#xff1a; 项目集定义阶段活动 项目集交付阶段活动项目集收尾阶段活动 鉴于项目集的范围和复杂性&#xff0c;在整个项目集生命周期中&#xff0c;将执行许多项目集支持活…

走向CV的通用人工智能:从GPT和大型语言模型中汲取的经验教训 (上)

点击蓝字 关注我们 关注并星标 从此不迷路 计算机视觉研究院 公众号ID&#xff5c;计算机视觉研究院 学习群&#xff5c;扫码在主页获取加入方式 论文地址&#xff1a;https://arxiv.org/pdf/2306.08641.pdf 计算机视觉研究院专栏 Column of Computer Vision Institute 人工智能…

交织技术详解

本专栏包含信息论与编码的核心知识&#xff0c;按知识点组织&#xff0c;可作为教学或学习的参考。markdown版本已归档至【Github仓库&#xff1a;https://github.com/timerring/information-theory 】或者公众号【AIShareLab】回复 信息论 获取。 文章目录 交织技术1.突发错误…

Linux系统:ulimit命令

目录 一、理论 1.ulimit命令 二、实验 1.打开的最大文件描述符的数量为65535 一、理论 1.ulimit命令 &#xff08;1&#xff09;概念 ulimit是一个计算机命令&#xff0c;用于shell启动进程所占用的资源&#xff0c;可用于修改系统资源限制&#xff0c;限制每个用户可使用…

资源有限的大型语言模型的全参数微调

文章目录 摘要1、简介2、相关工作3、方法3.1、重新思考optimizer的功能3.1.1、使用SGD3.1.2、隐式BatchSize 3.2、LOMO:低内存优化3.3、使用LOMO稳定训练3.3.1、梯度归一化和裁剪的替代方法3.3.2、缓解精度下降 4、实验4.1、内存配置4.2、吞吐量4.3、下游性能4.3.1、主要结果4.…

复杂的HANASQL 多行并入一行

点击蓝字 关注我们 一 前言 基于HANA的内存数据库的强大性能, SAP建议把业务逻辑下沉到HANA中计算.以便减去应用服务器的负担,让程序性能更好一些. SAP本身的一些复杂的业务逻辑比如MRP运算(MD01)也有了新的事务 MD01N (MRP LIVE) 报表类的数据分析程序尤其适用. 动态报表强化了…

PromptBench:大型语言模型的对抗性基准测试

PromptBench是微软研究人员设计的一个用于测量大型语言模型(llm)对对抗性提示鲁棒性的基准测试。这个的工具是理解LLM的重要一步&#xff0c;随着这些模型在各种应用中越来越普遍&#xff0c;这个主题也变得越来越重要。 研究及其方法论 PromptBench采用多种对抗性文本攻击&am…

阿里云服务器的存储容量和性能如何?是否支持多种存储类型?

阿里云服务器的存储容量和性能如何&#xff1f;是否支持多种存储类型&#xff1f;   本文由阿里云代理商[聚搜云]撰写   阿里云服务器作为业界领先的云计算服务提供商&#xff0c;其存储容量和性能一直受到广泛关注。本文将为您介绍阿里云服务器的存储容量、性能以及支持的…

《斯坦福数据挖掘教程·第三版》读书笔记(英文版)Chapter 12 Large-Scale Machine Learning

来源&#xff1a;《斯坦福数据挖掘教程第三版》对应的公开英文书和PPT Chapter 12 Large-Scale Machine Learning Algorithms called “machine learning” not only summarize our data; they are perceived as learning a model or classifier from the data, and thus dis…

Spring Boot 如何使用 @RequestParam 进行数据校验

Spring Boot 如何使用 RequestParam 进行数据校验 在 Web 应用程序中&#xff0c;用户提交的数据通常以请求参数的形式传递。在 Spring Boot 中&#xff0c;可以使用 RequestParam 注解来获取请求参数。但是&#xff0c;如何确保这些请求参数的有效性呢&#xff1f;在本文中&a…

Webots介绍

Webots介绍 1 介绍1.1 概述1.2 应用1.3 入门要求1.4 技术支持1.5 仿真步骤世界&#xff08;webots定义&#xff09;控制器超级控制器 1.6 平台能力三维建模能力物理引擎外设支持 2 软件使用启动webots用户界面文件菜单编辑菜单查看菜单模拟菜单构建菜单叠加菜单工具菜单帮助菜单…

ROS:文件系统以及命令

目录 一、ROS文件系统二、package.xml三、CMakelists.txt四、ROS文件系统命令4.1增4.2删4.3查4.4改4.5roscode4.6rosrun4.7roslaunch 一、ROS文件系统 ROS文件系统级指的是在硬盘上ROS源代码的组织形式&#xff0c;其结构大致如下图所示&#xff1a; WorkSpace --- 自定义的…

在DailyMart中是如何支持多种登录方式的?

欢迎回来&#xff0c;我是飘渺。今天继续更新DDD&微服务的系列文章。 1. 理解DDD中的领域模型职责 在我们开始今天的主题之前&#xff0c;让我们先回答一些读者的疑问。 在上一篇文章 [[DailyMart05&#xff1a;通过用户注册呈现一个完整的DDD开发流程]] 发布以后&#xf…

团体程序设计天梯赛-练习集L1篇①

&#x1f680;欢迎来到本文&#x1f680; &#x1f349;个人简介&#xff1a;Hello大家好呀&#xff0c;我是陈童学&#xff0c;一个与你一样正在慢慢前行的普通人。 &#x1f3c0;个人主页&#xff1a;陈童学哦CSDN &#x1f4a1;所属专栏&#xff1a;PTA &#x1f381;希望各…

SpringBoot多线程异步任务:ThreadPoolTaskExecutor + CompletableFuture

SpringBoot多线程异步任务 需求 在 SpringBoot 项目中&#xff0c;一个任务比较复杂&#xff0c;执行时间比较长&#xff0c;需要采用 多线程异步 的方式执行&#xff0c;从而缩短任务执行时间。 多线程异步 将任务拆分成多个独立的子任务&#xff0c;每个子任务在独立子线…

Linux基础服务2——NFS

文章目录 一、基本了解二、NFS工作机制2.1 示例 三、NFS配置文件3.1 指定客户端3.2 指定权限3.2.1 访问权限3.2.2 用户映射选项3.2.3 其他选项 四、测试案例4.1 安装nfs服务4.2 客户端查看nfs共享策略4.3 客户端挂载nfs共享目录4.3.1 手动挂载4.3.2 自动挂载4.3.3 exportfs重新…

字符数据的表示

目录 1、 英文字符与字符串的表示 2、中文字符 1、 英文字符与字符串的表示 英文字符&#xff1a;用ASCII码&#xff08;128个字符&#xff09;表示 每个英文字符的ASCII码为一个字节&#xff0c;其中低7位有效&#xff0c;最高位为0&#xff0c;该位可用于别的目的&#x…

云原生下一代-服务治理

服务治理 在这里插入图片描述 目录 什么是服务治理如何防止外部突发流量冲垮服务 限制请求的QPS和并发请求数按照调用方进行限流通过中间件访问限流和提前通知下线节点 如何处理服务超时和限流的问题 设置超时时间并对错误进行分类处理启用服务限流控制请求的流量 如何处理服…

【kubernetes】部署网络组件Calico与CoreDNS

前言:二进制部署kubernetes集群在企业应用中扮演着非常重要的角色。无论是集群升级,还是证书设置有效期都非常方便,也是从事云原生相关工作从入门到精通不得不迈过的坎。通过本系列文章,你将从虚拟机配置开始,到使用二进制方式从零到一搭建起安全稳定的高可用kubernetes集…

【每天40分钟,我们一起用50天刷完 (剑指Offer)】第三天

专注 效率 记忆 预习 笔记 复习 做题 欢迎观看我的博客&#xff0c;如有问题交流&#xff0c;欢迎评论区留言&#xff0c;一定尽快回复&#xff01;&#xff08;大家可以去看我的专栏&#xff0c;是所有文章的目录&#xff09;   文章字体风格&#xff1a; 红色文字表示&#…