Home 360 viewer 분석
Post
Cancel

360 viewer 분석

업무 중 android에서 360 viewer를 구현해야 하는 일이 생겨 해당 업무를 진행하며 분석 확인한 사항을 남긴다.

요구 사항

  • 센서를 활용한 화면 회전
  • 터치를 통한 화면 회전
  • 360 사진, 동영상 실행
  • 화면 회전에 따라 시점 변환
  • 사용자의 이벤트 없이 화면의 자동 이동
  • 영상의 시작점을 관리자가 지정한 방향으로 적용

위 조건을 요구 사항을 기준으로 업무 진행을 시작을 진행 하였으나 “com.google.vr” sdk가 2019년을 마지막으로 더이상 업데이트를 진행하지 않고 유지 관리 및 참조용으로만 남았는다는 사실을 발견 솔루션을 찾아야 할지 아니면 마지막 sdk를 기반으로 구현 해야 할지 결정이 필요 했으며, 회의를 통해 sdk를 사용하여 프로젝트를 진행 하기로 결정 했다.

문제 및 해결

  • 화면 회전시 센서데이터 조절 문제 발생
  • 사용자 이벤트 없이 화면이 이동 중 사용자의 이벤트 발생시 화면 위치가 리셋되는 현상

화면이 회전 하면 센서의 값을 SensorManager.remapCoordinateSystem값을 통해 변경할 필요가 있었음

화면 회전 상태에 따라 x, y 변경을 통해 화면 회전 상태에 따라 센서의 데이터를 조절 함

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
int orientation = getResources().getConfiguration().orientation;
switch (orientation) {
    case Surface.ROTATION_270:
        xAxis = SensorManager.AXIS_MINUS_Y;
        yAxis = SensorManager.AXIS_X;
        break;
    case Surface.ROTATION_180:
        xAxis = SensorManager.AXIS_Y;
        yAxis = SensorManager.AXIS_MINUS_X;
        break;
    case Surface.ROTATION_90:
        return;
    case Surface.ROTATION_0:
        xAxis = SensorManager.AXIS_Y;
        yAxis = SensorManager.AXIS_MINUS_X;
        break;
    default:
        throw new IllegalStateException();
}
System.arraycopy(matrix, 0, tempMatrix4x4, 0, tempMatrix4x4.length);
SensorManager.remapCoordinateSystem(tempMatrix4x4, xAxis, yAxis, matrix);

화면이 자동 회전되고 있는 상태에서 Surface의 값을 터치 이벤트 쪽에서도 확인 하고 있으며 사용자의 터치 이벤트가 발생시 해당 Surface를 기준으로 터치이벤트가 동작할 필요가 있었음

화면 자동 회전의 경우 Handler를 통해 적용 하였으며 Surface를 직접 컨트롤 하는것이 아닌 사용자의 터치 이벤트와 묶어서 처리 하였으며 유저 이벤트가 있을때는 회전 이벤트를 발생하지 않고 Handler만 유지 되도록 함

1
2
3
4
5
6
7
8
9
10
private Handler handler = new Handler(Looper.getMainLooper()) {
        @Override
        public void handleMessage(@NonNull Message msg) {
            super.handleMessage(msg);
            if (!touchTracker.isTouchAction) {
                touchTracker.setX(movePoint += 0.1f);
            }
            handler.sendEmptyMessageDelayed(0, 10);
        }
    };

해당 이벤트 처리를 하지 않으면 유저 이벤트가 있는도 중 화면이 회전하며 유저가 의도한 행동을 못하게됨.

참고

This post is licensed under CC BY 4.0 by the author.