2016-08-03 101 views
0

我正在開發Rajawali lib的增強現實應用程序。我的問題如下。使用陀螺儀和磁性傳感器旋轉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); 
}