2016-08-03 3 views
0

Rajawali lib로 증강 현실 애플리케이션을 개발 중입니다. 내 문제는 아래와 같습니다.자이로 스코프 및 자기 센서를 사용하여 Rajawali 카메라 회전

나는 카메라 뷰 위에 표면을 그려 넣고 싶습니다. rajawali의 최신 버전을 사용해 보았는데 작동하지 않았습니다. 나는 며칠을 보냈고 최신 카메라가 더 이상 무승부 카메라를 지원하지 않는다는 것을 알았습니다. 그리고 rajawali v0.9는 잘 작동합니다. 따라서 다음과 같은 질문이 v0.9에 적용됩니다.

내가 SensorEventListener를 등록하려고 시도하고 onSensorChanged()에 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); 
} 
관련 문제