Android ゲームのMy Paper Planeは、傾斜制御を実装する方法の良い例ですが、私はどうすれば同様のことができるかを理解するのに苦労しています。
SensorManager からgetOrientation()を使用する次の例があります。全体はこちらのペーストビンにあります。方向の値をテキスト フィールドに出力するだけです。最も関連性の高いスニペットは次のとおりです。
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);
}
}
問題は、これが吐き出す値が無意味に見えるか、少なくともユーザーが実行したモーションのタイプを特定する方法がないことです。検出したい 2 種類のモーションを示す図を作成しました。1. ピッチの「チルト」と 2. ロール/ステアリングの「回転」です。
(もちろん、これは横向きモードの電話の等角図です)
電話を長軸に沿って前後に傾けると (1 で示されます)、1 つの値だけが大幅に変化すると予想していましたが、すべてが大幅に変化したようです。同様に、画面から出てくる架空の線を中心に電話を回転させると (2. を参照)、ロール値のみが変化することを望みますが、すべての値が大幅に変化します。
問題は、ゲームを調整するときです。これは、角度 x、y、z の現在の値を記録することを意味します。後で、受信した更新された角度を解釈して「OK、電話を傾けたように見えます。左に 3 度ロールしたい」。たとえその意図が単なるロールだったとしても、それは「OK、あなたは電話を動かし、同時に傾けて転がっている」のようなものです. わかる?
何か案は?remapCoordinateSystem を使用して、軸を変更しても効果があるかどうかを確認してみました。喜びはありません。これには基本的なものが欠けていると思います:-(