如何将SensorManager.getOrientation用于“我的纸飞机”之类的倾斜控制?

Android游戏“ 我的纸飞机”是如何实现倾斜控制的一个很好的例子,但我一直在努力去理解我可以如何做类似的事情。

我有以下使用SensorManager中的getOrientation()的示例。 整个事情都在这里pastebin 。 它只是将方向值打印到文本字段。 这里是最相关的片段:

private void computeOrientation() { if (SensorManager.getRotationMatrix(m_rotationMatrix, null, m_lastMagFields, m_lastAccels)) { SensorManager.getOrientation(m_rotationMatrix, m_orientation); /* 1 radian = 57.2957795 degrees */ /* [0] : yaw, rotation around z axis * [1] : pitch, rotation around x axis * [2] : roll, rotation around y axis */ float yaw = m_orientation[0] * 57.2957795f; float pitch = m_orientation[1] * 57.2957795f; float roll = m_orientation[2] * 57.2957795f; /* append returns an average of the last 10 values */ m_lastYaw = m_filters[0].append(yaw); m_lastPitch = m_filters[1].append(pitch); m_lastRoll = m_filters[2].append(roll); TextView rt = (TextView) findViewById(R.id.roll); TextView pt = (TextView) findViewById(R.id.pitch); TextView yt = (TextView) findViewById(R.id.yaw); yt.setText("azi z: " + m_lastYaw); pt.setText("pitch x: " + m_lastPitch); rt.setText("roll y: " + m_lastRoll); } } 

问题是这个吐出来的值看起来像是废话,或者至less没有办法隔离用户执行哪种types的动作。 我画了一个图表来指出我想检测的两种运动types – 1.“倾斜”用于俯仰和2.“旋转”用于滚动/转向:

图1.俯仰和摇摆

(当然,这是一个横向模式的手机等距视图)

当我沿着它的长轴向前和向后倾斜电话时 – 以1表示。 – 我预计只有一个值会发生很大的变化,但所有这些变化都很大。 同样,如果我旋转手机关于从屏幕出来的假想线 – 显示在2 – 我希望只有滚动值改变,但所有的价值改变了很多。

问题是当我校准我的游戏 – 这意味着logging的angular度x,y和z的当前值 – 我后来不知道如何解释传入更新的angular度说:“好吧,看起来像你已经倾斜手机,你想要左转3度“。 这更像是“好的,你已经移动了电话,你是同时”,即使是意图只是一个滚动。 合理?

有任何想法吗? 我试过使用remapCoordinateSystem来查看是否改变轴有任何影响。 没有快乐。 我想我错过了一些基本的东西:-(

Solutions Collecting From Web of "如何将SensorManager.getOrientation用于“我的纸飞机”之类的倾斜控制?"