(转)unity3d 尝试 基于地理定位的 增强现实

首先说,这个尝试失败,属于死在去医院的路上那种。

基于地理定位的增强现实,AR全息实景,是一种高大上的说法,说直白点就是山寨类似随便走这样的应用。

打开应用,搜索周边信息,然后再把信息叠加在摄像头拍摄到的内容上面。


思路:用手机移动来控制unity中的camrea,将摄像头拍摄到的内容作为背景。获取地理信息,将信息转化成文字添加到unity的世界中。

1、用手机移动控制unity中的camrea。

这段代码中unity的论坛中找到,但是时间很久远,改了下发现能用。

http://forum.unity3d.com/threads/sharing-gyroscope-controlled-camera-on-iphone-4.98828/

using UnityEngine;

using System.Collections;

public class CameraManager : MonoBehaviour {

private bool gyroBool;

private Gyroscope gyro;

private Quaternion rotFix;

public void Start ()

{

Transform currentParent = transform.parent;

GameObject camParent = new GameObject ("GyroCamParent");

camParent.transform.position = transform.position;

transform.parent = camParent.transform;

GameObject camGrandparent = new GameObject ("GyroCamGrandParent");

camGrandparent.transform.position = transform.position;

camParent.transform.parent = camGrandparent.transform;

camGrandparent.transform.parent = currentParent;

gyroBool = SystemInfo.supportsGyroscope;

if (gyroBool) {

gyro = Input.gyro;

gyro.enabled = true;

if (Screen.orientation == ScreenOrientation.LandscapeLeft) {

camParent.transform.eulerAngles = new Vector3 (90, 90, 0);

} else if (Screen.orientation == ScreenOrientation.Portrait) {

camParent.transform.eulerAngles = new Vector3 (90, 180, 0);

} else if (Screen.orientation == ScreenOrientation.PortraitUpsideDown) {

camParent.transform.eulerAngles = new Vector3 (90, 180, 0);

} else if (Screen.orientation == ScreenOrientation.LandscapeRight) {

camParent.transform.eulerAngles = new Vector3 (90, 180, 0);

} else {

camParent.transform.eulerAngles = new Vector3 (90, 180, 0);

}

if (Screen.orientation == ScreenOrientation.LandscapeLeft) {

rotFix = new Quaternion (0, 0,0.7071f,0.7071f);

} else if (Screen.orientation == ScreenOrientation.Portrait) {

rotFix = new Quaternion (0, 0, 1, 0);

} else if (Screen.orientation == ScreenOrientation.PortraitUpsideDown) {

rotFix = new Quaternion (0, 0, 1, 0);

} else if (Screen.orientation == ScreenOrientation.LandscapeRight) {

rotFix = new Quaternion (0, 0, 1, 0);

} else {

rotFix = new Quaternion (0, 0, 1, 0);

}

//Screen.sleepTimeout = 0;

} else {

#if UNITY_EDITOR

print("NO GYRO");

#endif

}

}

public void Update ()

{

if (gyroBool) {

Quaternion quatMap;

#if UNITY_IOS

quatMap = gyro.attitude;

#elif UNITY_ANDROID

quatMap = new Quaternion(gyro.attitude.x,gyro.attitude.y,gyro.attitude.z,gyro.attitude.w);

#endif

transform.localRotation = quatMap * rotFix;

}

}

}

2、背景摄像头显示摄像机内容

摄像头的内容可以显示在guitexure上也可以显示在plan上,但是在guitexrue上显示的时候,方向转了90度,最后只好显示在plan上。

using UnityEngine;

using System.Collections;

public class WebCamManager : MonoBehaviour {

// Use this for initialization

void Start () {

WebCamTexture webcamTexture = new WebCamTexture ();

//如果有后置摄像头,调用后置摄像头

for (int i = 0; i < WebCamTexture.devices.Length; i++) {

if (!WebCamTexture.devices [i].isFrontFacing) {

webcamTexture.deviceName = WebCamTexture.devices [i].name;

break;

}

}

Renderer renderer = GetComponent<Renderer>(); 

renderer.material.mainTexture = webcamTexture; 

webcamTexture.Play(); 

}

}

3、调用高德地图的地理定位和搜索附近

详细内容请看我之前的博客

http://blog.csdn.net/wuyt2008/article/details/50774017

http://blog.csdn.net/wuyt2008/article/details/50789423

4、当搜索到内容以后,将名称信息添加到unity的世界里。

using UnityEngine;

using System.Collections;

using System.Collections.Generic;

using UnityEngine.UI;

public class ARMange : MonoBehaviour {

public List<PlaceInfo> places = new List<PlaceInfo>();

public GameObject perfab;

public PlaceInfo location = new PlaceInfo ();

public void ShowPlaces(){

ClearPlace ();

for (int i = 0; i < places.Count; i++) {

GameObject newPlace = Instantiate<GameObject> (perfab);

newPlace.transform.parent = this.transform;

double posZ = places [i].Latitude - location.Latitude;

double posX = places [i].Longitude - location.Longitude;

float z = 0;

float x = 0;

float y = 0;

if (posZ > 0) {

z = 500f;

} else {

z = -500f;

}

if (posX > 0) {

x = 500f;

} else {

x = -500f;

}

z = z + (float)(posZ * 1000);

x = x + (float)(posX * 1000);

y = y + i * 20;

newPlace.transform.position = new Vector3 (x, y, z);

newPlace.transform.LookAt (this.transform);

newPlace.transform.Rotate (new Vector3 (0f, 180f, 0f));

newPlace.gameObject.GetComponentInChildren<Text> ().text = places [i].Name;

}

}

private void ClearPlace(){

GameObject[] oldPlaces = GameObject.FindGameObjectsWithTag ("Place");

for (int i = 0; i < oldPlaces.Length; i++) {

Destroy (oldPlaces [i].gameObject);

}

}

}

5、这个时候显示内容没问题,但是方向会偏移。于是加了个指南针来矫正方向

using UnityEngine;

using System.Collections;

using UnityEngine.UI;

public class CompassManage : MonoBehaviour {

public Transform cam;

void Start () {

Input.location.Start ();

Input.compass.enabled = true;

}

// Update is called once per frame

void Update () {

transform.rotation = Quaternion.Euler(0, cam.eulerAngles.y-Input.compass.trueHeading, 0);

}

}

6、最后遇到的,我无法解决的问题

简单一句话,就是滤波。这个应用需要准确稳定的判断出当前手机方向位置状态,但是,输入的内容,重力,罗盘,加速度都是在不断变化,并且会有偏移的量,需要滤波。

虽然大致知道了是应该用互补滤波和卡尔曼滤波,但是,我的水平只能看懂名字,看不懂内容。

数学无力的我只好放弃。等遇到别人写好的代码再抄下吧。

这是死在半路上的结果的样子


这样的结果呢,当然是不甘心的,但是没时间去仔细研究这个问题了,所以只好放弃。如果哪位大侠知道怎么根据重力,罗盘,加速判断手机状态的,在这里跪求先。

源码和编译的apk:http://download.csdn.net/detail/wuyt2008/9458508

====================

在SearchManage.cs文件中,我把搜索范围限定在了昆明,

//txtInfo.text = txtInfo.text + "\r\n";

AndroidJavaObject query = amapHelper.Call<AndroidJavaObject>("getPoiSearch",inputQuery.text,"","0871");

txtInfo.text = txtInfo.text + "query get...";

将0871改成其他地方的区号就可以了,(为空是全国范围,但是没验证过)

原文:https://blog.csdn.net/wuyt2008/article/details/50854262

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,265评论 6 490
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,078评论 2 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 156,852评论 0 347
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,408评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,445评论 5 384
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,772评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,921评论 3 406
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,688评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,130评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,467评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,617评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,276评论 4 329
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,882评论 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,740评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,967评论 1 265
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,315评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,486评论 2 348

推荐阅读更多精彩内容