2016-08-03 98 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); 
}