2016-08-18 8 views
1

나는 getQuaternionFromVector()을 사용하여 안드로이드의 Sensor.TYPE_ROTATION_VECTOR 융합 센서로부터 쿼터니온을 얻습니다. 내 쿼터니언을 사용하여 내 Rajawali 앱의 카메라를 제어하고 싶습니다.센서 쿼터니온과 3d 카메라 쿼터니온 간의 변환 방법?

  • 노스 :

    값은 (X, Y, Z W) I는 (프리 전화 똑바로보고)이다 센서로부터 얻을 수 (0.5, 0.5, -0.5, 0.5)

  • 동 : (0.71, 0, -0.71, 0)
  • 남 : (0.5, -0.5, -0.5, -0.5)
  • 웨스트 : (0, 0.71, 0, 0.71)

이 값을 다음 올바른 값으로 변환해야합니다.

  • 북한 (1.0, 0, 0, 0)
  • 동 : (0.71, 0, 0.71, 0)
  • 남 : (0, 0, 1, 0)
  • 웨스트 : (-0.71, 0, 0.71, 0)

몇 가지 시행 착오를 통해 해결책을 찾았지만 여전히 방법이 있습니다. I 먼저 Y 축에 대하여 90 °, 및 X 축에 대해 -90 ℃에서 회전 경우

Quaternion a = new Quaternion(Vector3.Y, 90); 
a.multiply(q); 
Quaternion b = new Quaternion(Vector3.X, -90); 
b.multiply(a); 

I 얻는 값이다 :

  • 노스 (1, 0, 0, 0)
  • 동 : (0.71, -0.71, 0, 0)
  • 남 : (0, -1, 0, 0)
  • 웨스트 : (0.71, 0.71, 0, 0)

결과는 북쪽이 정확하고, 동쪽은 위로, 서쪽은 아래로, 남쪽은 거꾸로되어 있습니다. 베어링이 피치와 섞여 있음을 알았습니다 (저는 장치의 피치를 변경하고 카메라의 방향이 바뀌 었으며 리 서버).

예상 쿼터니온 값과 일치하도록 센서 쿼터니언을 수정하는 방법에 대한 제안 사항이 있습니까? 센서 베어링이 카메라 베어링이 아닌 피치를 변경하도록 어떻게 변경할 수 있습니까?

미리 감사드립니다.

답변

0

처리 방법 :

public static Quaternion transform(Quaternion q) { 
    Quaternion a = new Quaternion(Vector3.Y, 90).multiply(q); 
    Quaternion b = new Quaternion(a.w, a.y, -a.x, -a.z); 
    return b.multiply(new Quaternion(Vector3.Y, 90)); 
}