2010-05-18 3 views
7

Sensor.TYPE_ORIENTATION에서 얻은 데이터 중에서 회전 벡터를 계산해야합니다.Sensor.TYPE_ORIENTATION 데이터에서 회전 벡터를 계산해야합니다.

센서 데이터는 다음과 같이 정의된다 :

  • 값이 정확한 3 차원 위치되기 위해 계산 될 수있다 : 값 [0] : 방위각 주위 자북 방향 및 Y 축 사이의 각도, Z 축 (0 ~ 359). 0 = 북쪽, 90 = 동쪽, 180 = 남쪽, 270 = 서쪽
  • 값 : 피치, X 축을 중심으로 한 회전 (-180 ~ 180), z 축이 y 축 방향으로 움직일 때 양의 값을 가짐.
  • 값 [2] : X 축이, Z 축으로부터 멀어 양수 롤, Y 축 (-90 ~ 90) 주위의 회전

I는 Z와 같은 세 개의 값이 필요 축 값 (0 ~ 360도). 나는 많은 시도했지만이 수행하는 방법을 알아낼 질수 :/

(편집 : 당신이 볼 수있는 코드를 작업의 아이디어를 뒤에 참조 거기 DroidAR framework의 클래스 ActionWithSensorProcessing을 살펴하는 방법에 여러 가지 이벤트 유형이 할 수있는)

또한이 3D 벡터를 직접 계산하려면 Sensor.TYPE_ACCELEROMETER 및 Sensor.TYPE_MAGNETIC_FIELD를 사용하려고했습니다. 코드는 다음과 같습니다.

그러나 이것은 효과가 없었고 복잡하다고 생각합니다. 그래서 간단한 솔루션을 어떻게 ensor.TYPE_ORIENTATION 값을 다시 recalc 수 있도록 그들에게 3 차원 회전 벡터,하지만 난 그냥 어떻게 해야할지 모르겠다. 대답을 안다면 나에게 말해줘.

편집 : 나는이 같은 축에 정렬의 OpenGL에이 값을 전달하려는 추가해야합니다 :

gl.glRotatef(values[1], 1, 0, 0); 
gl.glRotatef(values[2], 0, 1, 0); 
gl.glRotatef(values[0], 0, 0, 1); 

하지만 때문에 분명 캔트 이렇게 이상한 값 범위의

. 마찬가지로 에서 SensorManager.getOrientation의 값은 지평선을 지나칠 때 뒤집어지기 때문입니다.

다른 해결책은 inR 행렬을 사용하여 각도를 계산하는 것이지만 더 쉬운 해결책이 될 것이라고 생각합니까?)

답변

3

확인과 같은 코드의 마지막 줄을 변경해야 이 순서 :

gl.glRotatef(values[2], 0, 1, 0); 
gl.glRotatef(values[1], 1, 0, 0); 
gl.glRotatef(values[0], 0, 0, 1); 

을 SensorManager.getOrientation과 함께 사용하면 작동합니다.누군가 Sensor.TYPE_ORIENTATION 데이터로이를 수행하는 방법을 알고 있다면 알려주십시오.

+0

Sensor.TYPE_ORIENTATION 데이터로이 작업을 수행하는 방법을 알고 싶습니다. 감사. – jakeoung

+0

왜 작동합니까? – jakeoung

12

이 Sensor.TYPE_MAGNETIC_FIELD 및 Sensor.TYPE_ACCELEROMETER 입력을 사용 (작동합니다)

switch (event.sensor.getType()) { 
    case Sensor.TYPE_MAGNETIC_FIELD: 
     magnitude_values = event.values.clone(); 
     sensorReady = true; 
     break; 
    case Sensor.TYPE_ACCELEROMETER: 
     accelerometer_values = event.values.clone(); 
    } 

    if (magnitude_values != null && accelerometer_values != null && sensorReady) { 
     sensorReady = false; 

     float[] R = new float[16]; 
     float[] I = new float[16]; 

     SensorManager.getRotationMatrix(R, I, this.accelerometer_values, this.magnitude_values); 

     float[] actual_orientation = new float[3]; 
     SensorManager.getOrientation(R, actual_orientation); 
} 

은 onSensorChanged이 귀족을 넣습니다. actual_orientation에서는 실제 위치와 관련하여 북쪽을 가리키는 벡터를 갖게됩니다. 당신이보기의 카메라 지점에서 북쪽을 감지 할 경우

당신은 당신의 OpenGL을 회전해야 할, 내가 해결책을 가지고 지금이

float[] outR = new float[16]; 
SensorManager.remapCoordinateSystem(R, SensorManager.AXIS_X, SensorManager.AXIS_Z, outR); 
SensorManager.getOrientation(outR, actual_vals); 
+0

코드에 대한 감사합니다. 내 게시물에서 볼 수 있듯이 거의 동일합니다. getOrientation에서 리턴 된 actual_orientation 값은 이상한 값 범위를 가지며, 각도가 아니거나 -1에서 +1 또는 이와 비슷한 값을가집니다. 그리고 나는 당신이 장치를 회전 할 때 (수평선 수준의 어딘가에서) 여전히 가치 플립이 있다고 생각합니다. 이 코드 조각 다음에 actual_vals로 무엇을 했습니까? –

+0

예 .. getOrientation은 라디안 단위의 값을 반환합니다. 학위의 가치를 원한다면 actual_vals를 은밀하게 처리해야합니다. 환영합니다 – hara

관련 문제