1

私は、向きに基づいて Android 画面に線を描画し、いくつかのヘルプやポインターを使用できるアプリに取り組んでいます。

線は次のように描画されます: 携帯電話が平らに保持されている場合、線は縮小して点になり、携帯電話を傾けて向きを変えると、線が大きくなります。つまり、携帯電話を立てると、線が下を向いて最大になります。等級 9.8 で、平らに保つと小さな点です。電話機がどの角度で保持されていても、矢印は常に下を向いています。つまり、重力の線です。

これで、電話のヨーピッチとロール角を計算する方法がわかりましたが、数学的には、この情報からこの線のベクトルを導き出す方法が少しわかりません。ポインタは大歓迎です。

ありがとう

4

1 に答える 1

2

さて、私はレプリカアイランドの情報源からの多くの助けを借りてこれを理解し、次にNvidiaの論文を見つけました。

TYPE_ORIENTATIONセンサーの読み取り値からピッチ、ロール、ヨーを取得したら、次のようにします。

        @Override   
public void onSensorChanged(SensorEvent event) 
{
    synchronized (this) 
    {
        m_orientationInput[0] = x;
        m_orientationInput[1] = y;
        m_orientationInput[2] = z;

       canonicalOrientationToScreenOrientation(m_rotationIndex, m_orientationInput, m_orientationOutput);

       // Now we have screen space rotations around xyz.
       final float horizontalMotion = m_orientationOutput[0] / 90.0f;
       final float verticalMotion = m_orientationOutput[1] / 90.0f;

       // send details to renderer....

   }
}

canonicalOrientationToScreenOrientation関数は次のとおりです。

    // From NVIDIA http://developer.download.nvidia.com/tegra/docs/tegra_android_accelerometer_v5f.pdf
private void canonicalOrientationToScreenOrientation(int displayRotation, float[] canVec, float[] screenVec) 
{ 
    final int axisSwap[][] = 
    { 
        { 1, -1, 0, 1 },   // ROTATION_0 
        {-1, -1, 1, 0 },   // ROTATION_90 
        {-1,  1, 0, 1 },   // ROTATION_180 
        { 1,  1, 1, 0 }    // ROTATION_270 
    };

    final int[] as = axisSwap[displayRotation]; 
    screenVec[0] = (float)as[0] * canVec[ as[2] ]; 
    screenVec[1] = (float)as[1] * canVec[ as[3] ]; 
    screenVec[2] = canVec[2]; 
}
于 2011-02-27T20:00:08.923 に答える