【问题标题】:Making Virtual Object Interactive with Mobile's Touch Input - Augmented Reality使虚拟对象与移动设备的触摸输入交互 - 增强现实
【发布时间】:2015-09-12 08:13:39
【问题描述】:

我想为 android 开发一个增强现实应用程序,该应用程序能够使用标记生成 3D 对象,并且这些 3D 对象在使用移动设备的触摸输入进行触摸时是交互式的。

我浏览了Vuforia、Junaio 或Layar Player 等可用的SDK,发现它们都支持:

  • 使用 3D 虚拟图像叠加进行标记检测
  • 虚拟按钮在您使它们不可见时激活。 (Vuforia)
  • 交互式视频播放。

但是,我正在寻找的是:

  • AR 中的虚拟对象,可以使用移动设备的触摸进行交互。

我很确定这是可能的,因为有虚拟视频叠加层,在点击/点击时会开始播放视频(类似于交互式虚拟元素)。

问。有人可以建议一个最适合我正在寻找的功能的库/工具包吗?

问。在使用上述已经支持我想要的功能的工具包进行搜索时,我是否明显遗漏了什么?

【问题讨论】:

  • 嗨 HawkPriest,基本上,虚拟对象是您绘制的东西,因此您可以通过移动设备的触摸来管理它的交互性。使用您提到的任何 AR 库,您都可以确保在检测到现实中的正确目标时,该对象会出现。所以不是很清楚你缺少什么 - 请尝试解释你到底需要什么。
  • 嗨 yakobom,上面提到的库支持标记检测和虚拟图像叠加交互,我的意思是负责检测标记的相机也检测到图像的某些部分被遮挡并且因此能够与虚拟对象进行交互,而不是使用手机的内置触摸与“覆盖”的虚拟对象进行交互。我最近在某处读到了一种可行的技术,即使用光线投射将屏幕上的触摸位置转换为相机坐标,并检查它是否与虚拟对象相交。感谢您的回复!。
  • 你好。你说的是正确的,但这是两件不同的事情。图像被遮挡,如 Vuforia 的“虚拟按钮”,指的是“自然界面”——你触摸相机前面的空气。在特定的虚拟对象上触摸屏幕是完全不同的……是的,这可以使用光线投射(或其他方法)来完成。我相信在 Vuforia 的论坛中他们有这样的例子 - 但首先告诉我这是否确实是你需要的。
  • 嗨,是的,这就是我要找的。我在您提到的 Vuforia 开发者社区论坛上在线阅读了这些讨论,但是它们似乎是针对 Unity 而不是直接针对 android。即使我可以将 Unity 项目导出到 android 项目,我也会处理 Unity 播放器,但我发现代码并不是直接操作虚拟对象。所以我正在寻找一个简单直接的解决方案,直接解决 android 上基于触摸的交互(可能通过 3rd 方库)。再次感谢您的回复!。

标签: android augmented-reality toolkit vuforia layar


【解决方案1】:

根据你最后的描述,Vuforia支持你需要的,还有纯Android(无Unity)的样例。

您需要查看 Dominos 示例,其中展示了如何在屏幕上拖动 OpenGL 多米诺对象。 在这里查看快速描述: https://developer.vuforia.com/forum/faq/android-how-do-i-project-screen-touch-target

如果您在尝试自己实现它时遇到一些问题,您可以在 Vuforia 论坛上搜索其他人遇到的常见问题的一些答案。但基本上,它在他们的示例中运行良好。

【讨论】:

    【解决方案2】:

    嗯,这是针对 Unity 5.x 的

    首先,请阅读 Vuforia 的文档以了解有关 Image TargetsAR Camera 的更多信息。

    将您的 3D 模型导入场景,以便所有交互式对象都是图像目标的子对象。

    在手机上读取触摸(我的项目使用了android)

    if(Input.touchCount > 0 && Input.GetTouch(0).phase == TouchPhase.Began)
    

    将触摸点转换为从屏幕进入 3D 世界的射线

    Ray ray = Camera.main.ScreenPointToRay(Input.GetTouch(0).position);
    

    在场景中创建一个平面(让光线命中)

    Plane plane = new Plane(Vector3.up, Vector3.zero);
    

    如果射线击中平面,则获取 x,y,z 位置。 pos 的值将具有世界位置

    if (plane.Raycast(ray, out distance)){
        Vector3 pos = ray.GetPoint(distance); 
    }
    

    请根据您的需要修改代码。这是一个非常基本的例子。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-12-19
      • 2019-04-03
      • 2019-11-26
      • 1970-01-01
      • 1970-01-01
      • 2012-09-24
      • 1970-01-01
      相关资源
      最近更新 更多