博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【Unity3D】AR应用中,关于东南西北方位的判断。
阅读量:4485 次
发布时间:2019-06-08

本文共 3551 字,大约阅读时间需要 11 分钟。

这篇文章的应用场景是这样子的:

  首先我们要做的是一个带有LBS定位服务(比如高德地图、百度地图等)AR功能,在这个场景中,会有一些地图上的”点“(如派出所、学校)是我们需要显示在我们的AR镜头上的,如下图:

图片摘自wuyt2008的博客:《》

  本文要解决的问题就是,如何判断这些Point的东南西北,即坐标。

    博主采用的开发环境是

  1. Unity3D: 5.3.5;
  2. EazyAR: SKD v1.3.0;
  3. GyroDroid :这个Unity3D 的传感器插件包上网搜一下就有了。

    要应用本博客的内容之前,必须先看过wuyt2008的博客《》。

    开坑:

  实际上我们要实现功能的原理就是根据定位返回的自身(Location)坐标(XL,ZL),跟我们需要标注显示出来的Marker的坐标(XM,ZM)进行坐标系的运算,很简单,

X=XL-XM

Z=ZL-ZM

  然后我们再把我们的主摄像机的Position的x、z轴(Y是控制高的,与物体平面定位没有关系)设置为(0,0),这样呢,Marker在Unity中得坐标,就是(X,Z),并且经过我的测试,Unity中在使用ARCamera的情况下,+X轴指的方向是东90°,+Z轴指的方向是北90°。我们根本不需要做任何其他判断,只需要根据这个特性,再根据经纬度的数据特性,如果X的值为负,则表示Marker位于东边(相对自身),如果Z的值为负,则表示Marker位于北边(相对自身),所以只需要按照(-X,-Z)设置Marker的(X,Z)坐标,即可准确的安放Marker的位置。

  首先,我们使用EazyAR SDK 中提供的AR摄像机,为什么说它是AR摄像机呢,因为它本身已经根据AR应用的特性,进行了一些优化,还有添加了一些C# Script,所以直接拿来用,你会发现比你自己写一大堆乱七八糟的代码好多了。然后呢,再将GyroDroid插件包中的“MinimalSensorCamera”脚本,绑定到摄像机上,让AR摄像机镜头随着手机的旋转而旋转。

  然后就是最重要的一个环节,这里要结合wuyt2008博主的博客中得代码来介绍,我把代码贴一下,并且我自己加了一些注释,助于观看:

1 using UnityEngine; 2 using System.Collections; 3 using System.Collections.Generic; 4 using UnityEngine.UI; 5  6 public class ARMange : MonoBehaviour { 7  8     public List
places = new List
();//Marker的集合(Marker是什么,请学习一下高德地图api的应用,简单的说,就是你想要标记在地图上的点,比如一些餐厅或景点之类,甚至可以是自定义的点) 9 public GameObject perfab;10 public PlaceInfo location = new PlaceInfo ();//根据高德API定位后传递过来的自身坐标信息11 12 public void ShowPlaces(){13 ClearPlace ();14 15 for (int i = 0; i < places.Count; i++) {16 17 GameObject newPlace = Instantiate
(perfab);18 newPlace.transform.parent = this.transform;19 20 double posZ = places [i].Latitude - location.Latitude;//计算相对距离,z轴(Unity中的坐标系)21 double posX = places [i].Longitude - location.Longitude;//计算相对距离,x轴(Unity中的坐标系)22 23 float z = 0;24 float x = 0;25 float y = 0;26 27 if (posZ > 0) {28 z = 500f;29 } else {30 z = -500f;31 }32 33 if (posX > 0) {34 x = 500f;35 } else {36 x = -500f;37 }38 39 z = z + (float)(posZ * 1000);40 x = x + (float)(posX * 1000);41 y = y + i * 20;42 43 newPlace.transform.position = new Vector3 (x, y, z);//设置Marker44 newPlace.transform.LookAt (this.transform);45 newPlace.transform.Rotate (new Vector3 (0f, 180f, 0f));46 47 newPlace.gameObject.GetComponentInChildren
().text = places [i].Name;48 }49 }50 51 private void ClearPlace(){52 GameObject[] oldPlaces = GameObject.FindGameObjectsWithTag ("Place");53 for (int i = 0; i < oldPlaces.Length; i++) {54 Destroy (oldPlaces [i].gameObject);55 }56 }57 }

  然后我们把Unity3D中,ARCamera(AR摄像机)的Position,设置为(0,0,0)这么做呢,是方便等会儿设定Marker的坐标,只有相机坐标设置为这样子,X和Z的值才是Marker的直接坐标,否则还得进行一些运算。不过这里值得注意的是,坐标系的设定,应该在CameraDevice对象上,否则是无效的。

  然后我们修改上述的代码,修改起来,并不会太难,只需要修改第43行,改成:

20 double posZ = places [i].Latitude - location.Latitude;//计算相对距离,z轴(Unity中的坐标系)21 double posX = places [i].Longitude - location.Longitude;//计算相对距离,x轴(Unity中的坐标系) 43 newPlace.transform.position = new Vector3 (-x, y, -z);//设置Marker

  这样就完事儿了。。。wuyt2008的博客《》最后所提及的偏移问题,貌似没有这种情况,可能是跟EazyAR提供的ARCamera有关,以及镜头自动会有东南西北的方向感。最后感谢wuyt2008,最近在做AR的项目CityHunter,一直在研究如何将高德定位整合进Unity3D来,虽然应用方面与其所描述的不太相干(实际上我要运用的是高德API的电子围栏的功能),但是在操作中可举一反三,果断是学习到了。

转载于:https://www.cnblogs.com/wuxinzhe/p/5700553.html

你可能感兴趣的文章
《构建之法》(五)
查看>>
创建django项目
查看>>
Linux Bash基本功能
查看>>
一则小脚本(工作中用)
查看>>
软件工程结对作业
查看>>
Keil 4.0 生成bin文件
查看>>
sql语句的进化--hibernate篇
查看>>
python爬虫之cookie
查看>>
11.超市收银系统的项目
查看>>
2017年5月29号课堂笔记
查看>>
HDU4247【瞎搞】
查看>>
lightoj 1125【背包·从n个选m个】
查看>>
HDU 1243 反恐训练营(最长公共序列)
查看>>
mysql数据库隔离级别
查看>>
(六)buildroot使用详解
查看>>
chrome修改UserAgent,调试
查看>>
Source Insight4.0 试用。。试用。。试用。。
查看>>
python循环for,range,xrange;while
查看>>
hadoop的节点间的通信
查看>>
HashMap
查看>>