책 소개
소스 파일은 아래 깃허브 페이지에서 내려 받으실 수 있습니다.
(https://github.com/AcornPublishing/cardboard-VR)
요약
구글 카드보드 SDK를 이용하면 간단하고 쉽게 VR 앱을 만들 수 있다. 이 책은 구글 카드보드 SDK에 대한 상세한 설명 및 예제를 담고 있으며, VR앱을 만들 때 필요한 기본적인 3D 그래픽 및 OpenGL에 대한 개념도 함께 다루고 있다. 빠르고 간단한 VR 앱을 만들어 보고 싶은 개발자들에게 도움이 될 것이다.
이 책에서 다루는 내용
■ 구글 카드보드 VR 빌드
■ 카드보드 SDK 자바 클래스 및 인터페이스를 탐구하고 실용적인 VR 프로젝트에 적용
■ 쉽고 간단하게 안드로이드 스튜디오, 안드로이드 SDK 및 자바 언어 사용
■ 메모리 관리와 배터리 수명을 포함해, 모바일과 카드보드 어플리케이션을 위한 소프트웨어 개발 및 안드로이드 모범 사례 활용
■ VR 내의 메뉴와 시선을 기반으로 한 선택을 위한 사용자 인터페이스 테크닉 구현
■ 가상 현실, 특히 모바일 카드보드 VR 경험과 관련된 과학, 심리학, 수학과 기술 활용
■ 구글 디자인 랩에 의해 추진된 사례를 포함한 카드보드 VR 모범 사례 이해
이 책의 대상 독자
이 책은 구글 카드보드 네이티브 SDK를 사용해 구글 카드보드 앱을 공부하고, 개발하고 싶어 하는 안드로이드 개발자를 대상으로 한다. 이 책을 읽는 독자라면 안드로이드 개발 및 자바 언어에 관한 지식이 어느 정도 있겠지만, 3D 그래픽을 비롯해 가상현실이나 구글 카드보드는 생소할 수도 있다. 초보 개발자와 안드로이드 SDK에 익숙하지 않은 개발자라면 이 책이 다소 어렵다고 느낄지 모른다. 안드로이드에 관한 배경지식이 없는 개발자라면 유니티(Unity) 같은 게임 엔진으로 카드보드 앱을 만드는 게 좀 더 쉬울 수도 있다.
이 책의 구성
1장, ‘모두를 위한 가상현실’에서는 구글 카드보드의 정의를 살펴보고, 사용 방법과 VR 기기 범주 내에서 카드보드가 차지하는 위치를 살펴본다.
2장, ‘스켈레톤 카드보드 프로젝트’에서는 안드로이드에서 카드보드 앱의 구조와 안드로이드 스튜디오를 살펴보고, 카드보드 자바 SDK를 도입해 스타터 카드보드 프로젝트를 구축한다.
3장, ‘카드보드 박스’에서는 트랜스포메이션, 스테레오스코픽 카메라 뷰, 헤드 로테이션 등 3D 큐브 모델을 이용해 처음부터 카드보드 안드로이드 앱을 만드는 방법을 설명한다(구글의 트래저 헌트(Treasure Hunt) 샘플을 기반으로 한다). 또한 이 장에서는 3D 기하학, OpenGL ES, 셰이더, 매트릭스 수학, 렌더링 파이프라인에 대해서도 알아본다.
4장, ‘런처 로비’에서는 휴대전화에서 다른 카드보드 앱을 시작할 수 있는 앱을 만들어 본다. 이 프로젝트에서는 3D그래픽을 사용하지 않고, 스크린 공간에 스테레오스코픽 뷰를 시뮬레이트하고 시선 기반(gaze-based)으로 구현한다.
5장, ‘렌더박스 엔진’에서는 저수준 OpenGL ES API 콜을 머티리얼, 렌더 오브젝트, 컴포넌트, 트랜스폼 클래스로 추출해 새로운 카드보드 VR 앱을 만들기 위한 간단한 그래픽 엔진을 만드는 방법을 보여준다. 라이브러리는 이어지는 프로젝트에서 계속 사용되며 점점 기능이 추가된다.
6장, ‘태양계’에서는 태양열 에너지원, 텍스처 매핑 자료와 셰이더를 지닌 구형 행성 및 행성의 태양 궤도 애니메이션, 은하수의 별무리와 함께 태양계 시뮬레이션 과학 프로젝트를 구축한다.
7장, ‘360도 갤러리’에서는 일반 사진과 360도 사진을 볼 수 있는 미디어 뷰어를 만들고, 휴대전화의 카메라 폴더에 있는 사진을 격자형 작은 이미지로 로딩해서 시선을 기반으로 보고 싶은 사진을 선택해본다. 또한 더 나은 사용자 경험을 위해 프로세스 스레딩을 추가하는 방법과 다른 애플리케이션에서 이미지를 볼 수 있게 안드로이드 인텐트를 지원하는 방법을 설명한다.
8장, ‘3D 모델 뷰어’에서는 렌더박스 라이브러리를 사용해 렌더링된 OBJ 파일 형식의 3D 모델을 위한 뷰어를 설치해본다. 또한 머리의 움직임에 맞춰 모델의 뷰를 제어하는 방법도 살펴본다.
9장, ‘뮤직 비주얼라이저’에서는 전화기에 설치된 오디오 플레이어의 파형(Waveform)과 FFT 데이터를 기반으로 애니메이팅하는 VR 뮤직 비주얼라이저를 구축한다. 기하학적 애니메이션과 역동적 텍스처 셰이더 및 새로운 비주얼라이제이션을 추가하기 위해 사용되는 일반적인 아키텍처를 구현한다. 그 후 무작위로 안팎으로 전환하는 동시 다발 시각화(multiple concurrent visualizations) 및 트리피 트레일 모드(trippy trails mode)를 살펴본다.
본문에 쓰인 컬러 이미지는 여기에서 내려 받으세요.
목차
목차
- 1장, 모두를 위한 가상현실
- 왜 카드보드라고 불리는가
- VR 장치의 종류
- 구형 스테레오스콥
- 카드보드는 모바일 VR이다
- 데스크톱 가상현실 및 그 밖의 장치들
- VR의 관문
- 저가 VR의 가치
- 카드웨어(Cardware)
- 카드보드 뷰어 설정
- 카드보드를 위한 애플리케이션 개발
- 유니티 사용하기
- 네이티브로 만들기
- 가상현실 모범 사례에 대한 개요
- 요약
- 2장, 스켈레톤 카드보드 프로젝트
- 안드로이드 앱에 있는 것들
- APK 파일
- 그래들 빌드 프로세스
- 자바 컴파일러
- 안드로이드 프로젝트 구조
- 안드로이드 스튜디오로 시작하기
- 안드로이드 스튜디오 설치
- 안드로이드 스튜디오 유저 인터페이스
- 카드보드 프로젝트 생성
- 카드보드 자바 SDK 추가
- AndroidMainifest.xm 파일
- activity_main.xml 파일
- MainActivity 클래스
- OnCreate 메소드
- 빌드하고 실행하기
- 요약
- 안드로이드 앱에 있는 것들
- 3장, 카드보드 박스
- 새로운 프로젝트 생성
- 안녕, 삼각형!
- 기하학적 모양 도입하기
- 삼각형 변수
- onSurfaceCreated
- OpenGL ES 2.0 도입하기
- 간단한 셰이더들
- compileShaders 메소드
- prepareRenderingTriangle 메소드
- onDrawEye
- 빌드하고 실행하기
- 3D 카메라, 시점, 그리고 헤드 로테이션
- 매트릭스에 온 것을 환영한다
- MVP 버텍스 셰이더
- 원근 뷰 매트릭스 설정
- 원근법에 맞게 렌더링하기
- 빌드하기와 실행하기
- 삼각형 위치 변경
- 안녕, 큐브!
- 큐브 모형 데이터
- 큐브 코드
- 라이팅과 셰이딩
- 셰이더 추가
- 큐브 노멀과 색상
- 버텍스 버퍼 준비
- 셰이더 준비
- 라이트 소스 추가
- 앱을 빌드하고 실행하기
- 큐브를 회전시키기
- 바닥 추가하기
- 셰이더
- 바닥 모델 데이터
- 변수
- onCreate 메소드
- onSurfaceCreated 메소드
- initializeScene 메소드
- prepareRenderingFloor 메소드
- onDrawEye 메소드
- drawFloor 메소드
- 여기 좀 보세요
- isLookingAtObject 메소드
- 요약
- 4장, 런처 로비
- 새 프로젝트 생성
- 헬로 가상 세계 텍스트 오버레이 추가
- 간단한 텍스트 오버레이
- 차일드 뷰를 이용해 텍스트를 중앙에 배치
- 각각의 눈에 대한 입체적 뷰 생성
- MainActivity에서 오버레이 뷰 컨트롤하기
- 가상 장면 사용
- 헤드 룩에 응답
- 뷰에 아이콘 추가
- 설치된 카드보드 앱 목록
- 카드보드 앱에 대한 쿼리
- 앱에 대한 단축키 클래스 생성
- OverlayView에 단축키 추가
- OverlayEye에서 뷰 리스트 사용
- 현재 단축키에 하이라이트
- 트리거를 사용해 앱 선택하고 시작하기
- 개선 사항
- 요약
- 5장, 렌더박스 엔진
- 그래픽 엔진 RenderBox 소개
- 새 프로젝트 생성
- 렌더박스 패키지 폴더 생성
- 빈 렌더박스 클래스 생성
- IRenderBox 인터페이스 추가
- 머티리얼, 텍스처, 셰이더
- 추상화 머티리얼
- Math 패키지
- MathUtils
- Matrix4
- Quaternion
- Vector2
- Vector3
- Transform 클래스
- Parent 메소드
- Position 메소드
- Rotation 메소드
- Scale 메소드
- 매트릭스로 변환과 그리기
- Component 클래스
- RenderObject 컴포넌트
- Cube RenderObject 컴포넌트
- 버텍스 색상 머티리얼과 셰이더
- 버텍스 색상 셰이더
- VertexColorMaterial
- Camera 컴포넌트
- RenderBox 메소드
- 간단한 박스 장면
- 면 법선을 가진 큐브
- Light 컴포넌트
- 버텍스 색상 라이트 머티리얼 및 셰이더
- 애니메이션을 위한 시간
- 객체 감지
- RenderBox 패키지 내보내기
- RenderBoxLib 모듈 빌드
- RenderBox 테스트 앱
- 향후 프로젝트에서 RenderBox 사용
- 요약
- 6장, 태양계
- 새로운 프로젝트 설정
- 구(Sphere) 컴포넌트 생성
- 단색 라이트 구
- 단색 라이트 셰이더
- 단색 라이트닝 머티리얼
- 구에 머티리얼 추가
- 구 보기
- 지구 텍스처 머티리얼 추가
- 텍스처 파일 로딩
- 확산 라이트닝 셰이더
- 라이트닝 머티리얼의 확산
- 구 컴포넌트에 확산 라이트닝 텍스처 추가
- 지구 보기
- 카메라 위치 변경
- 낮과 밤 머티리얼
- 낮/밤 셰이더
- DayNightMaterial 클래스
- 낮/밤 렌더링
- 태양 만들기
- 빛 꺼짐 텍스처 셰이더
- 빛 꺼짐 텍스처 머티리얼
- 빛 꺼짐 텍스처 렌더링
- 태양 추가
- Planet 클래스 생성
- 태양계 형성
- MainActivity에서 행성 설정
- 카메라의 행성 뷰
- 천체 애니메이션
- 별이 빛나는 하늘 돔
- 지구 미세 조성
- 밤 텍스처
- 축 기울기와 흔들림
- 카메라 위치 변경
- 추가할 수 있는 개선 사항
- RenderBox 라이브러리 업데이트
- 요약
- 7장, 360도 갤러리
- 새 프로젝트 설정
- 360도 사진 보기
- 샘플 포토스피어 보기
- 배경 이미지 사용
- 일반 사진 보기
- Plane 컴포넌트 정의와 버퍼 할당
- Plane 컴포넌트에 머티리얼 추가
- 장면에 이미지 스크린 추가
- 이미지에 프레임 경계선 넣기
- 경계선 셰이더
- 경계선 머티리얼
- 경계선 머티리얼 사용
- 포토 이미지 적재 및 디스플레이
- 이미지 클래스 정의
- 이미지를 앱으로 읽어 들이기
- 이미지 로드 텍스처
- 이미지를 스크린에 표시
- 올바른 방향으로 회전
- 올바른 너비 및 높이로 보정
- 샘플 이미지를 비율에 맞게 줄이기
- 포토스피어 이미지 로드와 디스플레이
- 이미지 갤러리 유저 인터페이스
- 왼쪽에 포토 스크린 배치
- 그리드에서 섬네일 표시
- 섬네일 이미지
- Thumbnail 클래스
- 섬네일 그리드
- 섬네일을 바라볼 때 로딩하기
- 시선 기반 하이라이트
- 사진 선택과 보여주기
- 큐 이벤트
- 진동기 사용
- 스크롤 활성화
- Triangle 컴포넌트 생성
- UI에 삼각형 추가
- 스크롤 버튼으로 상호작용
- 스크롤 메소드 구현
- 응답 대기 및 스레드 사용(stay responsive and use threads)
- 스레드와 가상현실에 대한 설명
- 인텐트로 시작
- 틸트업 제스처로 그리드 표시 및 숨기기
- 구형 섬네일
- 섬네일 클래스에 구 추가
- 렌더박스 라이브러리 업데이트
- 추가할 수 있는 개선 사항
- 요약
- 8장, 3D 모델 뷰어
- 새 프로젝트 설정
- OBJ 파일 포맷 이해
- ModelObject 클래스 생성
- OBJ 모델 구문 분석
- buildBuffers
- 모델 범위, 스케일링, 센터
- 작은 주전자
- 작고 회전하는 주전자
- 스레드 세이프
- 인텐트로 시작
- 실용적이고 즉시 제작 가능
- 요약
- 9장, 뮤직 비주얼라이저
- 새 프로젝트 설정
- 오디오 데이터 캡처
- VisualizerBox 아키텍처
- 웨이브폼 데이터 캡처
- 기본 지오메트리 비주얼라이제이션
- 2D 텍스처 기반 비주얼라이제이션
- 텍스처 생성기 및 로더
- 웨이브폼 셰이더
- 기본 웨이브폼 머티리얼
- 웨이브폼 비주얼라이제이션
- FFT 비주얼라이제이션
- FFT 오디오 데이터 캡처
- FFT 셰이더
- 기본 FFT 머티리얼
- FFT 비주얼라이제이션
- 트리피 트레일스 모드
- 동시 다발 비주얼라이제이션
- 랜덤 비주얼라이제이션
- 추가 개선 사항
- 커뮤니티 초대
- 요약
도서 오류 신고
정오표
정오표
[p.67 : 아래에서 9행]
윈도우과 UI 모드를
->
윈도우와 UI 모드를
[p.88 : 아래에서 1행]
CardvoardView 인스턴스를
->
CardboardView 인스턴스를
[p.89 : 위에서 1행]
CardvoardView 인스턴스를
->
CardboardView 인스턴스를
[p.89 : 위에서 6행]
onsurfaceCreated나
->
onSurfaceCreated나
[p.89 : 위에서 8행]
setCardboardView (cardboaardView)
->
setCardboardView (cardboardView)