65.9K
CodeProject 正在变化。 阅读更多。
Home

UltraHello

starIconstarIconstarIconstarIconstarIcon

5.00/5 (6投票s)

2012年10月16日

CPOL

6分钟阅读

viewsIcon

18468

传感器的非常规用法!

引言

UlraHello 是问候 Ultrabooks 的新方式!Ultrabooks 是指那些轻薄、续航能力强且性能强大的设备。Ultrabooks 还拥有传感器,这是笔记本/台式机所不具备的。除了常规的传感器用途外,它们还可以用于做一些它们从未被设计用来做的事情!它们可以用来创建更了解环境、更生动的应用程序。UltraHello 利用了 UltraBook 的能力,帮助您进入一个虚拟世界,您可以通过这些新的感知能力与对象/环境进行交互。

这是一个使用 C# 和 XAML 开发的 WinRT 应用程序。

目标

此处通过截图展示了完整的概念。截图不代表最终设计,可能会有更改。另外,在最终提交之前,还将添加新的功能和关卡。

功能 walkthrough

1) 通过触摸进行操作

UltraHello 利用了多点触控功能,允许用户通过手指与世界中的对象进行交互。世界使用 Farseer Physics Engine 模拟物理效果,使得物体的破碎、抛掷和碰撞非常逼真。用户最多可以用四根手指来切割物体,这比使用鼠标要有趣得多。
用户还可以同时在最多 4 个点上通过触摸来产生烟花,这在笔记本/台式机上是不可能实现的。

利用到的能力

  • 多点触控以操作多个对象
  • Core i5 ULV 处理器提供的强大性能,用于模拟非常逼真的物理效果

2) 通过加速度计/陀螺仪操控世界重力

UltraHello 将允许您通过加速度计和陀螺仪来操控世界重力。只需改变设备的物理方向,您就会看到世界以完全不同的方式运行!您可以反转重力,或者让它变得混乱!

利用到的能力

  • 加速度计/陀螺仪用于计算重力

3) 通过指南针进行旋转和摇动

通常的指南针应用程序是使用两个值编码的,一个是指南针的当前读数,另一个是试图达到最终读数的值。这会产生平滑且真实的指南针视图。制造旋转效果很简单,只需为跟随变量提供加速度,而不是恒定的速度。下面刻度盘中的每个圆环将具有不同的初始角速度,横向旋转设备将根据指南针读数精美地操纵它们。

指南针可以通过持续监测北方位置来帮助进行水平移动检测。因此,它可以用于检测设备是否在完美水平方向摇动。

利用到的能力

  • 指南针用于检索旋转数据

4) 基于天气和位置的主题

UltraHello 会自动分析用户所在地的天气和位置,并相应地设置世界主题。例如,如果正在下雨,则会显示一个带有下雨背景的世界,这在视觉上非常吸引人。UltraHello 还会识别常见的地点,如动物园和丛林,如果您在那里运行 UltraHello,它会自动设置相应的主题。此功能使此应用程序更生动、更具位置/环境感知能力。

利用到的能力

  • GPS 用于访问地理坐标,Maps API 用于访问实际位置名称
  • 天气服务

5) 环境光感应

Ultrabook 的每个主题都有两种变体:浅色和深色。利用环境光感应技术,UltraHello 在黑暗环境中设置浅色主题,在明亮环境中设置深色主题。这再次使其更具环境感知能力。

利用到的能力

  • 环境光感应

6) 使用 Windows 8 提供的具有流体动力学的新触摸反馈

当用户用两根手指旋转对象时,Windows 8 会提供旋转数据。UltraHello 利用了这一手势,让您可以实现诸如从一个杯子倒水到另一个杯子的操作。同样,仅用鼠标是无法实现的!

利用到的能力

  • Ultrabook 的性能用于模拟流体
  • 触摸数据

Using the Code

现在让我们来看看如何实现本文中提到的一些功能。我使用的 Farseer 包装器是 Physics Helper XAML(可在 CodePlex 上找到)。它非常简洁,并且可以在 WP7 和 WinRT 上运行。

将 Physics Helper XAML 添加到您的项目中

  1. http://physicshelperxaml.codeplex.com/ 获取
  2. 右键单击解决方案,然后选择“添加现有项目”。在 Physics Helper XAML ZIP 下载中,浏览到 \PhysicsHelperXaml\Farseer Physics Engine Metro\Farseer Physics Engine Metro.csproj
  3. 右键单击解决方案,然后选择“添加现有项目”。在 Physics Helper XAML ZIP 下载中,浏览到 \PhysicsHelperXaml\Spritehand.PhysicsHelper.Metro\Spritehand.PhysicsHelper.Metro.csproj
  4. 从您的主项目中,添加对 Farseer Physics Engine Metro 和 Spritehand.PhysicsHelper.Metro 项目的引用。

创建 Farseer 对象

  • 在 XAML 页的顶部添加此 namespace
    xmlns:FarseerHelper="using:Spritehand.FarseerHelper" 
  • 现在创建一个物理画布,所有启用物理效果的精灵都将是该画布的子元素。MousePickEnabled 帮助用户通过触摸/鼠标来操作对象。
     <FarseerHelper:PhysicsCanvas Height="768" Width="1366" MousePickEnabled="True">
    </ FarseerHelper:PhysicsCanvas >   
  • 现在您可以按照以下方式在画布中创建精灵
    <FarseerHelper:PhysicsCanvas Height="768" Width="1366" MousePickEnabled="True">
        <FarseerHelper:PhysicsSprite Height="100" Width="100" Canvas.Left="311" Canvas.Top="540">
        <Rectangle Fill="#FFAC809A" Height="100" Stroke="Black" Width="100"/>
        </FarseerHelper:PhysicsSprite></ FarseerHelper:PhysicsCanvas >   
  • Canvas 还有其他各种属性,如 GravityHorizontalGravityVertical,可以帮助您实现一些惊人的效果。将精灵设为 Static 会使其不可移动,应使用此技术来创建世界边界。

我不会在这里解释基础知识,因为它们已经在 Physics Helper XAML 文档中得到了很好的解释。因此,我将继续讲解流体部分。现在,您在其中一个截图看到的蓝色点肯定不像流体,但我会告诉您使其像流体的技巧。稍后我将提供完整的源代码。

什么是关节?

关节,顾名思义,是将两个物理精灵连接起来。这个关节可以被焊接,即非常坚硬,也可以是弹性的。观察以下语法

<FarseerHelper:PhysicsJoint Height="8" Width="8" Canvas.Left="1086" 
Canvas.Top="441" BodyOne="_5" BodyTwo="_6" AngleSpringConstant="0.2"/> 

这是在 (1086, 441) 位置,连接了 body _5 和 body _6(精灵),并且是一个弹性关节,弹性系数为 0.2

下一节 (Expression Blend)

那些小点就是物理关节,在所有精灵之间创建关节,您就可以模拟液体的吸引力!现在这可能不是非常精确,但通过添加额外的椭圆来覆盖空白区域,这确实变得非常可用!

传感器使用一览

在 WinRT 中利用传感器非常容易,而且大多数传感器共享相同的编码风格

  • 让我们使用加速度计,在您的 C# 代码中添加以下 namespace
    using Windows.Devices.Sensors;  
     Accelerometer accelerometer; 
     accelerometer = Accelerometer.GetDefault();
     accelerometer.ReadingChanged += accelerometer_ReadingChanged;
     accelerometer.ReportInterval = accelerometer.MinimumReportInterval; 

    假设 playerBlock 是您的 PhysicsSprite,并且您想用加速度计移动它,可以这样做(请自行尝试不同的数值!)

     void accelerometer_ReadingChanged(Accelerometer sender, AccelerometerReadingChangedEventArgs args)
            {
               
           playerBlock.Position = new Vector2() { X = (float)
                   (playerBlock.Position.X + args.Reading.AccelerationX), 
                    Y = (float)(playerBlock.Position.Y - args.Reading.AccelerationY) };
                        playerBlock.Update()
                    
                }         

精妙技巧

请注意上面的 playerBlock.Update();,这对于使引擎中的精灵与屏幕上看到的精灵保持同步是必需的。不要忘记这一点!。

关注点

Ultrabooks 确实是令人惊叹的设备——它们首次为 Windows PC 带来了美学享受以及感知能力。WinRT 也使得利用这些新系统的能力变得非常容易。Ultrabooks + Windows 8 绝对是值得期待的技术!

最后,我希望所有使用 Farseer 的用户都能注意“精妙技巧”。

未来计划

  • 流体模拟代码
  • 用加速度计操控重力
  • 产生旋转效果的代码

历史

  • 2012 年 10 月 16 日:首发帖!
© . All rights reserved.