返回首页

介绍
前几天,我就开始制定一个控制我的手机我的电脑望远镜的计划。之前我就知道,我发现我自己的主题都是一个增强现实的一部分。我想如果我收集我的笔记一起分享,它可能是帮助他人。我想这个职位也是新的东西。除了博客文章和代码,我也取得了这些信息在视频格式,可在上面的链接。视频和这个职位包括相同的信息。
开始增强现实之前,你要确保你有一个设备,具有支持的功能。很多,我在这个系列共享的概念可以适用于其他手机,但我将集中在Windows Phone和利用的特点和功能,它提供。如果你想使用信息innbsp;其他设备上的这些文章,你可能发现或使一些高层次的功能的实现,如果您的设备和开发环境已经不提供。
要开始,你将需要一个Windows Phone开发工具安装一个Windows Phone的计算机。会的工作,虽然不是所有的Windows手机。手机会需要有GPS硬件和指南针/ magnometer的。所有Windows手机的GPS硬件,但并不是所有的手机有的magnometer。也有一些设备有的magnometer,但没有使第三方开发商提供所需的驱动程序。我写这篇文章的时候,我有两个手机,安装了芒果。我HD7的指南针,但它不具备必要的驱动程序。我的三星Focus确有必要的驱动程序。之前,我们再往前走,让我们确保您的设备支持的magnometer的。如果不是这样,你需要找到一个设备之前,你可以进行任何进一步与发展。我的电话不支持所需的API
要测试您的设备,创建一个新的Windows Phone项目,并添加一个引用到Microsoft.Devices.Sensors。你只需要一行代码来检查您的设备是否有mangometer。

bool compassFound = Motion.IsMotionAvailable;

后,该行设置一个断点,您的手机上运行的程序(目前,它会始终返回quot;在模拟器上; falsequot)。希望它会返回quot; truequot你。获取设备的方向
一旦你有一个设备,支持指南针,让我们设备的方向。至少,您的设备中有一个magnometer和加速度计。它也可能有它的gyrometer太多,如果它是一个更近的设备。你可以得到所有这些传感器的读数分别,但我们将依靠从传感器得到的信息,它认为目前对运动API,并让它执行数学需要在一个易于消耗的形式获得的数据。传感器API的交互时,你会使用的一般模式是,您将创建一个对象来代表一个传感器,订阅事件得到改变阅读有关的通知,然后调用一个start()方法来打开传感器和从它开始接收数据。
指南针(因此运动API),不时需要校准。另外一个被称为有传感器数据时的事件,也有一个通知事件,该设备需要校准。如果该事件被触发,你需要告诉用户移动他或她的电话,在图8。一旦手机校准,您的应用程序将开始接收读数,您可以删除通知。{C}
从运动API的信息,回来告诉我们设备的电流方向和运动/加速。现在,我们只关心设备的方向,将忽略其他数据可用。现在,感兴趣的领域的俯仰,偏航,滚动,和Quanternion。拳头三个数字也可用于描述飞机的议案。如果一架飞机正在改变其音高,这意味着该计划的前正在向上或向下倾斜。如果飞机翅膀保持水平,但它开始移动到左或右,然后改变其偏航。最后,如​​果飞机开始向左或向右倾斜,那么我们会说,飞机是滚动。这些条款适用于手机以类似的方式。如果你有水平表面铺设设备与设备面临比其俯仰,偏航和滚转北部的顶部都设置为零。 (我会请这quot;零positionquo​​t ;)。当您更改设备的方向,这些领域将发生相应的变化。运动API返回弧度旋转测量。这使得给定的。NET Framework提供的数学函数从工作弧度的意义。但是,当屏幕上显示他们来说,这更容易使用度。因此,仅用于显示,我有弧度度转换。
public class RadToDegreeConverter : IValueConverter

{

    public object Convert(object value, Type targetType, 

                                      object parameter, 

                                      System.Globalization.CultureInfo culture)

    {

        double v;

        if (value is float)

            v = (float)value;

        else if (value is double)

            v = (double)value;

        else if (value is decimal)

            v = (double)(decimal)value;

        else

            return String.Empty;

        v = v * 180d / Math.PI;

        return v.ToString("000.0");

    }



    public object ConvertBack(object value, 

                                             Type targetType, 

                                             object parameter, 

                                             System.Globalization.CultureInfo culture)

    {

        throw new NotImplementedException();

    }

}

Quanternion图回来也包含旋转信息,是由XNA向量类消费品。我只用于显示目的偏航,俯仰和横滚,但在实际算法中使用的Quanternion领域。增强现实应用程序将要知道,在手机上的摄像头面对的方向。假设你使用的是后面对镜头,这意味着你会想知道,正面临着设备后部的方向。为了得到这个信息,开始创建一个Vector3代表的方向,设备后部正面临着,当它是在零的位置。这个载体将得到的数据,回来从运动API和由此产生的向量告诉我们设备正面临着哪种方式旋转。{体C3}
,CurrentDirectionVector会告诉我们设备的背面,正面临着什么方向。让的转换从笛卡尔,(x,Ÿ,ž)坐标到极坐标,使我们可以显示的方向手机正在面临着从北度测量和对在天空或地面,手机是倾斜的角度。只有少数的函数调用需要做这种转换。{的C4}在屏幕上显示的值
要在屏幕上显示这些值,我将使用数据绑定。但我也想有相机的一点看法,作为计划的背景。最终,我们将在此背景下叠加图像。有作为背景的​​图像,创建一个框架元素(网格,矩形,帆布,或其他一些元素),你想要的背景显示在屏幕中的部分拉长。我有它在整个屏幕拉伸。{C5的}
在代码隐藏,我需要做一个视频画笔将用于绘制此面。视频刷将相机作为其源。{5233}
这让我们知道如何告诉设备的位置。在接下来的文章中,我将展示如何获得兴趣点的距离和方向。然后,我将展示如何投射到屏幕感兴趣的点,使它们看起来是环境的一部分。上述视频解释{A3的}3分钟代码演练{A4纸}
{A5} |乔尔象牙约翰逊:Error53

回答

评论会员:codeben1 时间:2012/02/07

好文章。
你可以放置在一个单独的文件的模板?怎么样?


评论会员:游客 时间:2012/02/07
史蒂夫Wellens:真是一个伟大的问题。我把两个模板文件,这似乎做的伎俩:{C7-}PHP网站使用不同的语法(警告,我知道关于PHP):12月'11修改史蒂夫Wellens1