谷歌纸板VR传感器

17

我正在使用谷歌纸板(其中的HeadTracker类)在一个AR应用中检测设备旋转的某些信息,它效果非常好。

但是,在一些设备上,它不起作用(没有反应)。我猜这是因为它们没有必要的传感器。我的问题是:

1)我想在运行时检测当前设备是否支持HeadTracker,即它是否有可用的必要传感器。为此,我需要知道HeadTracker使用哪些传感器,以便查询这些传感器是否存在。这些传感器是什么?

2)有没有一种方法可以在AndroidManifest中指定必要的传感器?就我所看到的,没有这种方法。因此,如果用户下载我的应用程序,应用程序将不得不在运行时通知用户他的设备不受支持。这不太好。有什么想法吗?


我正在做这种类型的任务...但是没有成功...你能帮助我吗?我之前已经创建了一个VR表面并放置了图像,但我想让这个图像随着头部运动而移动。我该怎么做? - Amardeepvijay
我假设你的清单文件中已经有了 uses-feature android:glEsVersion="0x00020000"?你能详细说明一下“什么都没发生”吗?你是指没有获得任何加速度计数据吗? - Jeffrey Mixon
是的,没有数据。 - Thomas Calc
3个回答

17

谷歌纸板(Google cardboard)的官网有一个兼容性列表页面,但似乎不完整,所以我查看了 Cardboard.jar 的源代码。HeadTracker.java里的逻辑似乎如下:

SensorManager sensorManager = (SensorManager)HeadTracker.this.mContext.getSystemService("sensor");

for (int sensorType : HeadTracker.INPUT_SENSORS) {
  Sensor sensor = sensorManager.getDefaultSensor(sensorType);
  sensorManager.registerListener(HeadTracker.this.mSensorEventListener, sensor, 0, handler);
}

在与

{TYPE_ACCELEROMETER, TYPE_GYROSCOPE};

相同的文件中定义了INPUT_SENSORS,我不确定只有这些传感器之一的手机是否可以使用HeadTracker,我的猜测是两者都是必需的。

您的应用程序可以在清单中使用以下几行代码要求运行时(甚至在Android市场上可见)特定的传感器:

<uses-feature android:name="android.hardware.sensor.accelerometer" android:required="true" />
<uses-feature android:name="android.hardware.sensor.gyroscope" android:required="true" />

使用SensorManager的public Sensor getDefaultSensor(int type)函数,您还可以在运行时检查传感器是否可供应用程序使用。


1
非常感谢,帮了我很多。很抱歉我错过了赏金截止日期(昨天我不在),所以它似乎已经被系统自动授予了。 - Thomas Calc
虽然它监听加速度计,但是获取预测的GL矩阵似乎使用了最后一个陀螺仪值,如果设备没有陀螺仪,则始终为零。如果您只使用加速度计使卡片板应用程序工作,请告诉我。 - Dileep
您在兼容性列表中发布了错误的链接。我在哪里可以找到这个列表? - Yevgen Kulik

7
谷歌卡片板头戴式显示器不仅需要加速度计,还需要陀螺仪才能正常使用。
加速度计可以检测施加在手机上的力。这包括读取地球的重力作用,因此手机可以估算“向下”的方向。但是,加速度计无法精确告诉你在三维空间中的方向,它只能根据读取的力来近似估算。
这种精度远远不够进行虚拟现实体验,因此您需要一个陀螺仪。
如果您一心想让它在没有陀螺仪的手机上运行,您可以编写自己的代码,基于加速度计数据来近似估算手机方向,但请记住,这将远远不能满足真正令人满意的虚拟现实体验。

0

欢迎来到Stack Overflow!虽然这理论上可以回答问题,但最好在此处包含答案的基本部分,并提供参考链接。 - Enamul Hassan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接