2016-08-03 6 views
0

私はRajawali libを使ってAugmented realityアプリケーションを開発しています。私の問題は以下の通りです。ジャイロスコープと磁気センサーを使ってRajawaliカメラを回転する

私はカメラビューにサーフェスを描画したいと思いますが、最新のバージョンのrajawaliを試したときに動作しませんでした。私は何日も過ごしていて、最新のものがカメラを引っ張ってくれていないことを知っています。そしてrajawali v0.9はうまく動作します。したがって、次の質問はv0.9に適用されます。

SensorEventListenerを登録しようとしたときに、onSensorChanged()に3つの値があり、Androidデバイスの3次元を表していましたが、非常にノイズがあり、不安定でした。私はローパスフィルタを実装しようとしましたが、それでもノイズです。 は最終的に私は、this questionを見つけましたが、V0.9に、

getCamera().setOrientation(quaternion) 

は動作しませんでした。どうしてか分かりません。 今私が次に何をすべきか分からない:(

+0

あなたが最終的に解決策を得なかったのコードスニペット – sunjinbo

+0

ありませんが、私はもうそれで動作いけない?:Dあなたはその問題を得ましたか。 –

答えて

0

ここで、それは私のプロジェクトでは非常にうまく機能し、私はそれはあなたを助けるために願って、私のコードです。

//私のレンダラのコードスニペットクラス

@Override 
public void onRender(final long elapsedTime, final double deltaTime) { 
    mHeadTracker.getLastHeadView(mHeadTransform.getHeadView(), 0); 

    android.opengl.Matrix.invertM(mHeadTransform.getHeadView(), 0, mHeadTransform.getHeadView(), 0); 

    Quaternion q = mHeadTransform.getQuaternion(mHeadTransform.getHeadView(), 0); 

    getCurrentCamera().setOrientation(q); 

    super.onRender(elapsedTime, deltaTime); 
} 

// HeadTransformクラス

private static Quaternion sQuaternion = new Quaternion(); 
public Quaternion getQuaternion(float[] quaternion, int offset) { 
    if (offset + 4 > quaternion.length) { 
     throw new IllegalArgumentException(
       "Not enough space to write the result"); 
    } 
    float[] m = this.mHeadView; 
    float t = m[0] + m[5] + m[10]; 
    float x; 
    float y; 
    float z; 
    float w; 
    float s; 
    if (t >= 0.0F) { 
     s = (float) Math.sqrt(t + 1.0F); 
     w = 0.5F * s; 
     s = 0.5F/s; 
     x = (m[9] - m[6]) * s; 
     y = (m[2] - m[8]) * s; 
     z = (m[4] - m[1]) * s; 
    } else { 
     if ((m[0] > m[5]) && (m[0] > m[10])) { 
      s = (float) Math.sqrt(1.0F + m[0] - m[5] - m[10]); 
      x = s * 0.5F; 
      s = 0.5F/s; 
      y = (m[4] + m[1]) * s; 
      z = (m[2] + m[8]) * s; 
      w = (m[9] - m[6]) * s; 
     } else { 
      if (m[5] > m[10]) { 
       s = (float) Math.sqrt(1.0F + m[5] - m[0] - m[10]); 
       y = s * 0.5F; 
       s = 0.5F/s; 
       x = (m[4] + m[1]) * s; 
       z = (m[9] + m[6]) * s; 
       w = (m[2] - m[8]) * s; 
      } else { 
       s = (float) Math.sqrt(1.0F + m[10] - m[0] - m[5]); 
       z = s * 0.5F; 
       s = 0.5F/s; 
       x = (m[2] + m[8]) * s; 
       y = (m[9] + m[6]) * s; 
       w = (m[4] - m[1]) * s; 
      } 
     } 
    } 
    quaternion[(offset + 0)] = x; 
    quaternion[(offset + 1)] = y; 
    quaternion[(offset + 2)] = z; 
    quaternion[(offset + 3)] = w; 

    Log.d("facevr", x + "," + y + "," + z + "," + w); 

    return sQuaternion.setAll(w, x, y, z); 
} 
関連する問題