Android 如何将SensorManager.getOrientation用于倾斜控制,如;我的纸飞机;?

Android 如何将SensorManager.getOrientation用于倾斜控制,如;我的纸飞机;?,android,screen-orientation,tilt,Android,Screen Orientation,Tilt,Android游戏是如何实现倾斜控制的一个很好的例子,但我一直在努力理解如何做类似的事情 我有一个使用SensorManager的示例。一切都在进行中。它只是将方向值打印到文本字段。以下是最相关的片段: private void computeOrientation() { if (SensorManager.getRotationMatrix(m_rotationMatrix, null, m_lastMa

Android游戏是如何实现倾斜控制的一个很好的例子,但我一直在努力理解如何做类似的事情

我有一个使用SensorManager的示例。一切都在进行中。它只是将方向值打印到文本字段。以下是最相关的片段:

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);
    }
}
问题是,它吐出的值看起来像胡说八道,或者至少无法区分用户执行了哪种类型的运动。我已经画了一张图表来表示我想要检测的两种运动类型-1。俯仰和2的“倾斜”。滚动/转向的“旋转”:

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

当我将手机沿长轴前后倾斜时-如1所示。-我只期望其中的一个值会发生很大的变化,但它们似乎都发生了剧烈的变化。类似地,如果我将手机绕着屏幕上的一条假想线旋转,如图2所示我希望只有滚动值会改变,但所有的值都会改变很多

问题是当我校准我的游戏时——这意味着记录角度x、y和z的当前值——我后来不知道如何解释传入的更新角度,说“好的,看起来你倾斜了手机,你想向左滚动3度”。这更像是“好吧,你已经移动了手机,同时你在翻滚”,即使目的只是翻滚。有道理吗


有什么想法吗?我试过使用remapCoordinateSystem来查看更改轴是否有任何效果。没有快乐。我想我缺少了一些基本的东西:-(

你混合了加速器和磁传感器阵列。代码应该是:

if (SensorManager.getRotationMatrix(m_rotationMatrix, null,
                                    m_lastAccels, m_lastMagFields)) {

看看

好吧,那太尴尬了。另外:非常感谢!我不知道在过去的几天和几周里,我为这件事浪费了多少时间。是的,按照预期使用API会让事情变得更好。我知道这种感觉;)对于这类问题,第二双眼睛真的很有帮助。我看到这篇文章似乎得到了回答,而且有点老了,但我已经写了一篇你在这里寻找的东西:-希望它能帮助别人!