2016-08-15 3 views
1

기기의 위치와 방향에 따라 이미지를 이동해야하는 AR 앱을 만들고 있습니다.Android에서 Game Rotation Vector의 숫자를 사용하는 방법은 무엇인가요?

게임 회전 벡터가이를 달성하는 데 필요한 데이터를 제공해야합니다. 그러나 GRV 센서에서 얻은 값이 무엇인지 이해할 수는 없습니다. 예를 들어 Z 축에서 같은 값에 도달하려면 장치를 720도 회전해야합니다. 이상하게 보입니다.

어떻게 든이 숫자를 x, y, z 좌표 방향으로 장치의 참조 프레임에서 각도로 변환 할 수 있다면 문제가 해결 될 것입니다.

나는이 문제를 며칠 동안 봤는데 GRV 좌표의 의미와 그 사용법에 대한 합리적인 정보를 찾지 못했습니다.

TL : DR GRV 센서의 숫자는 무엇을 보여줍니까? 각도로 변환하는 방법은 무엇입니까?

+0

본 적이 있습니까? https://android.googlesource.com/platform/development/+/master/samples/ApiDemos/src/com/example/android/apis/os/RotationVectorDemo.java –

답변

6

docs 상태로 GRV 센서는 3D 회전 벡터를 제공합니다. 이것은 주어진이를 구성하는 세 가지 구성 요소를 숫자로 표현된다 : 이것은 그러나 혼란

  1. x axis (x * sin(θ/2))
  2. y axis (y * sin(θ/2))
  3. z axis (z * sin(θ/2))

. 각 구성 요소는 해당 축을 중심으로 한 회전이므로 각 각도 (θ는 쎄타라고 발음 함)는 실제로는 다른 각도로 표시됩니다.

각도로 작업 할 때, 특히 3D로 작업 할 때는 일반적으로 각도가 아닌 라디안을 사용하므로 시타가 라디안으로 표시됩니다. This은 좋은 소개 설명처럼 보입니다.

그러나 형식으로 우리에게 주어진 이유는 매트릭스 회전에서 특히 quaternion처럼 쉽게 사용할 수 있다는 것입니다. 사실 이며 회전을 지정하는 구성 요소 인 쿼터니언의 처음 세 구성 요소입니다. 네 번째 구성 요소는 크기 (magnitude), 즉 원점 (0, 0)에서 얼마나 멀리 떨어져 있는지를 지정합니다. 따라서 쿼터니언은 일반적인 회전 정보를 공간의 실제 지점으로 바꿉니다.

이들은 안드로이드 (그리고 세계의 다른 지역) 3D 라이브러리 인 OpenGL에서 직접 사용할 수 있습니다. 일부 OpenGL 회전 정보에 대해서는 this tutorial을 체크하고 일반적으로 3D 프로그래밍에 적용되는 일반 쿼터니언 이론은 this one이고이 정보를 직접 사용하는 방법을 정확하게 보여주는 Android 용 Google은 this example을 확인하십시오.

기사를 읽는 이유는 왜이 형식으로 가져오고 왜 게임 회전 벡터 (Game Rotation Vector)인지 알 수 있습니다.이 시점에서 3D 프로그래머가 게임에서 수십 년 동안 사용해온 것입니다.

TLDR; This example은 우수합니다.

편집 - 3D 공간에서이 벡터에 의해 회전되는 2D 이미지를 표시하는 방법입니다.

위의 예에서 SensorManage.getRo‌tationMatrixFromVecto‌r은 게임 회전 벡터를 3D로 을 회전하기 위해 적용 할 수있는 회전 행렬로 변환합니다.. 이 회전을 2D 이미지에 적용하려면 이미지를 3D로 생각해야합니다. 실제로는 한 장의 종이처럼 평면의 세그먼트입니다. 그래서 특수 용어로 텍스처라고하는 이미지를이 평면 세그먼트에 매핑합니다.

Here은 예제 코드와 깊이있는 토론을 통해 Android 용 OpenGL에서 텍스처 큐브에 대한 자습서입니다. 큐브에서 비행기 세그먼트로가는 짧은 단계입니다. 큐브의 한 면일뿐입니다! 사실 그것은 Android에서 OpenGL을 사용하기에 좋은 자료입니다. 이전 및 이후 튜토리얼 단계도 읽는 것이 좋습니다.

번역도 언급했듯이. Google 코드 예제에서 메소드를 확인하십시오. gl.glTranslatef을 사용하여 변환하는 경우 gl.glMultMatrixf을 사용하여 회전을 수행합니다. 이것은 당신이 번역하고 회전하는 방법입니다.

이러한 작업이 적용되는 순서와 관련이 있습니다. 실험 해보는 재미있는 방법은 브라우저 내부에서 실행되는 라이브 3D 스케치 코딩 환경 인 Livecodelab입니다. 특히 this tutorial은 작업 순서를 반영하도록 권장합니다. 분명히 명령 move은 번역입니다.

+0

Google의 사례는 벡터 작동 방식을 이해하는 데 많은 도움이되었습니다. , 고마워. OpenGL을 사용한 구현은 매우 간단합니다. 'SensorManager.getRotationMatrixFromVector ( mRotationMatrix, event.values);에서 얻은 회전 행렬을 'android.graphics.Matrix'와 함께 사용하여 이미지의 회전/평행 이동을 설정하는 방법은 있습니까? –

+0

귀하의 질문에 대답하기 위해 제 대답을 확장했습니다 –

+0

이 답에서 쿼터니언에 대한 설명은 다소 혼란스럽고 잘못된 것일 수 있습니다. v = [x, y, z]라는 표기법으로 GRV에 의해보고 된 3 개의 엔트리 인 "4 진수의 허수 성분"을 나타낼 경우, 벡터 v/|| v || "회전축"을 정의하는 단위 벡터입니다. 각도 2arcsin || v || $는 Android 개발 사이트에 주어진 고정 된 글로벌 프레임을 기준으로이 축을 중심으로 시계 반대 방향으로 회전 한 시계 반대 방향의 각도입니다. –

관련 문제