2016-08-03 15 views
0

Я разрабатываю приложение дополненной реальности с помощью Rajawali lib. Моя проблема следующая.Поверните камеру Rajawali с помощью гироскопа и магнитного датчика

Я хочу нарисовать поверхность на вид камеры, когда я попробовал последнюю версию rajawali, это не сработало. Я провел много дней и узнал, что последние больше не поддерживают рисование поверх камеры. И раджавали v0.9 работают нормально. Поэтому для v0.9 применяется следующий вопрос.

Когда я попытался зарегистрировать SensorEventListener и в onSensorChanged(), я получил 3 значения, которые представляют 3 измерения устройства Android, но он был очень шумным и неустойчивым. Я попытался реализовать фильтр нижних частот, но он все еще шумит. Наконец я нашел 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); 
}