0. Overview
VR Player의 기본 동작 방식에 대한 설명
기존에 촬영된 VR Source(동영상)을 구(Sphere)에 Texture Mapping 후, Camera를 구의 한가운데 놓고 핸드폰(안드로이드)의 Gyro-Sensor입력을 받아 Camera를 움직여 VR를 구현하는 방식
1. Texture Mapping to Sphere
VR Player에서 Play를 하기 위해서, 위와 같이 기존에 촬영된 VR Source(동영상)이 필요하다. (Googling을 하면 많이 나와 있으니 참고하시길. )
영상은 가로-새로 360도로 동시에 촬영되다 보니 위와 같이 왜곡된 형태를 보인다.
이 영상은 적당한 크기의 사각형으로 나눈뒤 이를 Non-Ridig Prespective Transform 방식을 이용하여 Resize를 해야 한다.
2D Graphic에서 많이 사용하는 강체변경(Rigid Transform)과는 달리 네 꼭지점의 위치가 바뀌고 그 비율에 따라 Resize가 되므로 기존의 왜곡된 화면을 실사화면과 같이 변경할 수 있다.
위와 같이 해당 영상의 특정 사각형을 구(Sphere)의 특정 위치에 맞도록 변형(Transform)을 한다.
안드로이드에서 GLTexture에 GLE Method들을 이용하여 위와 같이 Texture Mapping을 하면 왜곡되어 보이는 VR Source를 구에 맞게 Texture Mapping을 하게 된다.
2. Gyro Scope Sensor 입력 및 처리
안드로이드에서 GyroScope Sensor에서 제공하는 Sensor 변경 값은 Angular Speed(각속도)이다. 이 부분을 주의 해야 한다. 기존의 안드로이드에서는 방향을 직접 제공했으나, 안드로이드 API19 혹은 그 이후 부터는 위와 같이 각속도로 제공한다.
우리가 VR Camera의 방향을 정하기 위해 필요한 것은 Direction Vector이다. 그래서 위와 같이 Angular Speed를 Angular로 바꾸고, 이를 Radian으로 그리고 최종적으로 Direction Vector로 변환해야 필요한 Direction Vector가 나온다.
"일정시간" 단위 (0.02 m/s, 50FPS, 이 시간단위는 개발자가 필요에 따라 변경)
센서로 부터 각속도가 날라올 때, 즉 센서 Event가 발생한 현재 System시간과 이전 센서 Event 발생한 System 시간의 차이를 보고,
1) 일정 단위 시간보다 적으면, 각속도를 이전 것에 합하고
2) 일정 단위 시간보다 크면, 각속도를 이전 것에 합하고, 해당 각속도를 움직인 각도로 설정
일정 시간 단위로 합(누적)하였으니, 적분계산과 동일한다.
이제 움직인 각도를 위의 코드처럼 Radian으로 계산한다.
3. Sphere Equation for Direction Vector
Android와 OpenGL의 Coordinate System이 다르기 때문에 Sensor의 Y가 φ, Sensor의 X가 ϴ가 되도록 설정한다.
실제 고등학교에서 배웠던 구 방정식 (x-x0)^2+(y-y0)^2+(z-z0)^2=r^2 (여기에서 카메라의 위치는 0,0,0이기 때문에 x0,y0,z0=0 ) 인데, 우리가 사용하는 구 방정식은 방향을 이용한 것이기 때문에 위와 같이 삼각함수를 이용하여 변형된 구방정식을 사용한다.
아울러 Radian을 사용한 구이기 때문에 r = 1이 된다.
또 한가지 주의할 점은, Vertical의 ϴ의 경우 시작점이 구의 꼭대기이기 때문에, 시작 Vector가 y축으로 방향을 바꾸기 위해 ϴ에 π/2(90도)를 더해야 한다. 즉 sin(ϴ+π/2) = cos ϴ 가 되도록 계산하면 된다. 위의 코드와 같이, 원래 계산식에 있는 sin ϴ 대신 cos ϴ를 넣어야 한다.
계산된 각도를 OpenGL의 LookAt Matrix에 위와 같이 넣어준다.
Position은 당연히 0,0,0이고
Direction은 이전에 계산된 각도이며
Up Vector는 위쪽 방향을 향하도록 설정한다.
Up Vector는 카메라 상단에 하나의 가상축이 있어서 그 축의 Vector 방향이 향하는 곳을 의미한다. 즉 시선에 의한 방향의 개념은 설명할 필요가 없지만, Up Vector의 경우에는 카메라의 고개를 돌려야 하는 경우 필요한다. 고개를 갸우뚱 거리거나 숙이는 등의 개념이 필요한 경우 응용된다.
'나의 SW개발 이야기 > 안드로이드' 카테고리의 다른 글
[Android] SurfaceView로 구현한 App에 Appium 사용하기 (0) | 2021.02.17 |
---|---|
Android Minimum API 별 버전 빌드하기 (0) | 2019.04.05 |
AndroidX Runtime Exception on Android 4.4.2 (0) | 2019.03.08 |
V8 안드로이드 버전 빌드 (0) | 2017.03.27 |
Uploaded by Notion2Tistory v1.1.0