2011-03-31 5 views
3

나는 Wiimote와 비슷한 안드로이드 폰을 사용하여 3-dof 컨트롤러를 만들려고합니다. 컨트롤러의 방향을 인식하기 위해 가속도계를 사용합니다. (계산에 getOrientation() 메소드 사용)안드로이드 3D 입방체 회전을위한 방향 센서

이러한 값을 사용하여 PC에서 OpenGL로 그린 큐브를 회전하여 테스트합니다. 문제는 작동하지 않는 것입니다. 전화가 특정 회전 이상으로 회전하면 큐브가 이상한 방향으로 회전합니다.

컴퓨터 그래픽에 대한 지식이 없으면 오일러 회전에서 3D 오브젝트의 최종 도형이 각 축의 회전 순서에 따라 달라지는 것을 알게되었습니다. 그것은 문제와 관련이 있습니까 ?? 그렇다면 올바른 주문은 무엇입니까? 현재 주문은 "yaw-> pitch-> roll"입니다.

값 변경이 중요하기 때문에 소위 보정 문제로 인한 것이라고 생각하지 않습니다.

답변

0

휴대 전화가 수직 위치에 접근하고 보정이 도움이되지 않으면 이상한 결과를 반환하는 것과 비슷한 문제가 발생했습니다.

쉬운 솔루션은이 센서를 사용하는 것입니다

manager = (SensorManager) context.getApplicationContext() 
           .getSystemService(Context.SENSOR_SERVICE); 
Sensor orientationSensor = manager.getDefaultSensor(Sensor.TYPE_ORIENTATION);` 

은 분명히이 센서는 새로운 플랫폼에서 더 이상 사용되지 않습니다를하지만, 어쨌든 잘 작동합니다.

1

오리엔테이션 센서는 더 이상 사용되지 않습니다. 신뢰할 수있는 센서 값을 얻는 가장 좋은 방법은 회전 벡터 센서를 사용하는 것입니다. 가속도계 및 자력계 하드웨어 기반 센서에서 데이터를 추출하는 소프트웨어 기반 센서입니다.

회전 벡터는 장치가 축 (x, y 또는 z)을 중심으로 각도 θ만큼 회전 한 각도와 축의 조합으로 장치의 방향을 나타냅니다. 다음 코드는 기본 회전 벡터 센서의 인스턴스를 가져 오는 방법을 보여줍니다. Android Dev 사이트의 info about this sensor을 참조하십시오.

public void onSensorChanged(SensorEvent event) { 
     if(sensor.getType()==Sensor.TYPE_ROTATION_VECTOR){ 
      float[] rotationMatrix = new float[16]; 
      SensorManager.getRotationMatrixFromVector(rotationMatrix, event.values); 
      SensorManager.getOrientation(rotationMatrix, mOrientValues); 
      for(int i=0; i<3; i++) 
       mOrientValues[i]=(float) 
        Math.toDegrees(mOrientValues[i])+180.0f;//orientation in degrees 
} 
:

안정적인 값을 얻을 수있는 회전 벡터를 사용하는 방법의 예입니다