<시험정리> 가상현실프로그래밍

2021. 10. 23. 20:32학교수업

Unity 사용처

- Unity 게임 솔루션

- 자동차, 운송 및 제조

- 영화, 애니메이션 및 시네마틱

- 설계, 엔지니어링 및 건축

 

Unity 2017

- Real-time Rendering / VR,AR support

- 타임라인, 시네머신

 

Unity 2018

1. Scriptable Render Pipeline

- 프로그램 가능한 rend pipeline (프로젝트에 맞는 렌더링 파이프라인을 수정 가능)

- Lightweight Render Pipeline(LWRP) - 실시간 rendering (모바일 플랫폼 용도)

- High-Definition Render Pipeline(HDRP) - 차세대 고해상도 렌더링 : 시각적으로 높은 수준, 정확도 제공을 목표

-> PC, 콘솔 플랫폼 용도로 사용

- 3D Render Pipeline : 3D 세계에 대한 기하학적 표현과 이 세계를 바라보는 관점을 정의

-> 가상 카메라를 이용해 2D 이미지 표현

2. Entity Component System(ECS)

- 고성능 차세대 프로그래밍 모델

- 고성능 멀티스레드 데이터 지향 기술 스택

-> 멀티스레드 코드를 효율적으로 실행, 게임 제작에 적합한 객체 설계, 고도로 최적화된 네이티브 코드 생성

3. Shader Graph

- 코딩 없는 손쉬운 shader 설계

- 쉐이더를 시각적으로 빌드, 실시간 결과 확인

4. Post Processing Stack

- 손쉬운 필터 적용

- 여러 post processing 효과 세트를 단일 포스트 프로세싱 파이프라인으로 결합

5. Timeline & cinemachine

- 애니메이션과 카메라 연출

6. Probuilder & Polybrush

- mesh 편집 및 texture 에디터

- Probuilder : 에디터 내에서 3D 모델링(편집) 가능

- Polybrush : 서브 메시 재지정, 커스텀 조명이나 색을 칠하고 메시를 가로질러 텍스처를 혼합

 

Unity 2019

1. 2D shader Graph : 2D shader를 그래프로 생성

- 시각 작업을 통해 쉐이더 손쉽게 제작

- 코드 없이 네트워크 그래프에서 노드 생성/연결

2. 2D Animation Update : 교체 가능한 스프라이트

3. 2D Lights : 2D 그래픽을 위한 조명 (손쉬운 2D 광원 생성)

4. HDRP : 비주얼 이펙트 그래프와 HDRP(고해상도 렌더 파이프라인)간 통합 개선

- SSAO 지원 : 서로 인접해 있는 표면을 어둡게 하는 효과

5. Denoising : 라이트맵 노이즈 제거

6. Mobile Improvements : 안드로이드 frame 최적화

- Android용 Optimized Frame Pacing : 프레임 속도 변화가 적도록 프레임을 잘 배분 -> 일괄된 프레임 속도 제공

- 노치 디자인 지원

7. Screen Brightness Control

8. AR Foundation : 얼굴 추적, 2D 이미지 추적, 3D 오브젝트 추적

- 환경 프로브(ARKit) : 환경의 특정 영역에서 조명, 컬러 정보를 감지 -> 3D 콘텐츠가 주변 환경과 매끄럽게 블렌딩

9. Bolt Visual Scripting : 코드 작성 없이 게임, 앱 로직을 만들 수 있다.

- 노드 기반 시각적 그래프 사용한 코딩 (Unreal의 Blueprint)

10. 머신러닝

 

기본 project 구성 : Main Camera + Driectional Light

- 카메라 없으면 Game 뷰에 아무것도 나오지 않는다.

 

Camera 객체

- 플레이어가 보는 화면을 구성하는 객체 ( Scene에 있는 3D 객체를 Game 뷰에 프로젝션 )

- Camera 객체의 Component

1) Transform 

 1. Position : 카메라의 물리적 위치 설정

 2. Rotation : 카메라의 물리적 회전 각도 설정

 3. Scale : 의미 X

 4. Ctrl + Shift + F : Scene view에서 보여지는 방향으로 transform 변경

2) Camera

3) Audio Listener 

 1. Scene에서 일어나는 소리를 받아들이는 기능

 2. 기본적으로 카메라는 Audio Listener를 가지고 있다.

 3. 두 대 이상 카메라 사용시 Audio Listener가 두 개가 된다.

 -> 한 개만 동작하도록 제어 or 제거 ( 다수 Audio Listener 사용시 경고 메세지 출력 )

- 고정 카메라 : 고정된 Main Camera 사용, 카메라는 1인칭 객체와 독립적으로 존재

- 1인칭 카메라 : 1인칭 객체 자식요소로 카메라 추가, 카메라 transform 설정은 원점에서 시작

-> 1인칭 객체보다 눈 역할 하는 하위 객체의 자식 요소로 카메 추가 ( 1인칭 객체의 이동/ 회전 함께 수행 )

- Wide 1인칭 카메라 : 카메라 위치를 1인칭 객체 뒤에 배치해 3인칭 시점 구현

-> 1인칭 객체 이동/회전 따라 카메라도 함께 수행

 

카메라의 회전을 코딩할 때, 현재 위치에서 rotation이 아닌 값을 누적해서 절대 각도로 설정을 해야 한다.

-> 현재 위치 rotation은 정확한 회전이 이루어지지 않기 때문

 

실시간 카메라 시점 변경 : 카메라 위치를 hard coding 하지 않고 다수 카메라 객체 사용 (상황 따라 필요 카메라 활성화)

기본적으로 Camera는 GameObject기 때문에

public GameObject[] cameras;로 생성

Input.GetKeyDown()을 통하여 키 입력 시 변경을 시키며

cameras[0].SetActive(true)를 이용해 해당 카메라 활성화 (false를 통해 비활성화)

 

멀티카메라 랜더링 : 다수 카메라 사용해 다양한 시점의 뷰를 동시에 제공 (다양한 카메라 연출에 사용)

Viewprot rect를 이용한 멀티 카메라 렌더링

- Game 뷰에 카메라가 차지하는 영역 지정 

- default (X=0, Y=0, W=1, H=1) <- Game뷰에 여백 X // X, Y 시작 지점, W는 X 너비, H는 Y너비

1. Camera Viewprot Rect를 이용한 멀티카메라 사용

- 다수 카메라 겹치지 않게 Viewport Rect 조정

- Depth 값 사용해 카메라간 우선 순위 결정 (작을 수록 먼저 draw)

- ex) 자동차 미러 시스템 ( 속도감, 몰입감 및 다양한 부가 정보 출력을 위한 멀티카메라 사용 )

- main 카메라 객체를 바탕으로 sub 카메라 객체를 안에 위치 및 크기 조절

2. Render Texture를 이용한 멀티카메라 사용

- 런타임 시점에 생성되고 업데이트 가능한 특수한 타입의 텍스처

- 동적으로 변하는 가상의 카메라 출력을 텍스쳐로 사용

- Render texture는 임의 3D 공간에 texture 출력

- Camera에서 Target Texture 설정

- Material Albedo에서 texture 설정하는 render texture 설정

->3D Model(Quad에 Material로 설정)

- 객체가 4개 필요 (생성)

 1. GameObject > Camera (카메라)

 2. Asset > Create > Render Textrue (렌더 텍스쳐)

 3. Material (머테리얼)

 4. Quad (Material을 적용시킬 엑터, 3D Object)

- 연결하기

 1. Camera에서 Target Texture를 위에서 만든 RenderTexture로 설정

 2. Material의 texture로 위에서 만든 RenderTexture로 설정

 3. Quad에 Material 설정

- ex) Mirror 카메라(좌우 반전) 같은 곳에 사용 // 좌우 반전은 x축에 마이너스 값을 줘서 해결

- ex) Zoom 카메라에 사용 (FPS 게임 스코프에 사용) // FOV값을 조절하며 시야각 조절, z축 조절로 확대 정도 결정

- ex) Layer 기반 Top View 카메라 // Layer를 통해 뷰에 보여지는 내용 마스킹 수행, 최적화를 위해 단순화된 객체 사용

- Camera : culling mask // Layer에 따라 오브젝트 보이게 할지 말지 설정 (상황에 따라 불필요한 요소 제어 -> 최적화)

-> 가능 옵션 1. Everything(default) : 모든 layer 출력 2. Nothing : 아무것도 출력X 3. Custom : 원하는 layer만 출력

 

3D 게임에서의 UI => 3D 그래픽 환경에 2D UI 합성

가상현실 게임에서의 UI => 3D공간에 UI배치 (사용자 시선, 컨트롤러 고려해 UI배치)

 

가상현실 UI 설계시 고려 사항

1. 1인칭 시점의 작은 FOV(Field of View)

2. 거리의 존재

3. 해상도 낮음

4. 가독성이 떨어진다.

5. 항상 카메라 방향으로 출력이 필요

6. 카메라와 거리 고려해 일정한 크기 유지

 

Canvas 객체

- UI 항목을 화면에 배치하고 렌더링 하는 역할 ( 모든 UI 항목은 Canvas 객체 하위에 위치 )

- 출력 위치를 위해 Rect Transform을 가지고 있다.

- EventSystem 객체는 시스템에서 발생하는 키보드, 조이스틱, 스크린터치 등의 입력정보를 Canvas 하위에 UI에 전달

 

UI 구현 : 2D Canvas 

UI 구현 : 3D Canvas

Canvas 관리

- Canvas는 한 씬에 여러 개 생성 가능

- Canvas의 하위 객체로 생성 가능 ( 일반적으로 한 개 Canvas로 저체 설계, 하위 객체로 canvas사용하여 논리관계 표현)

 

Canvas 컴포넌트 

1. RectTransform

- 기존 Transform 컴포넌트와 동일한 역할을 UI 객체에 적용

- RectTool로 크기와 위치 동시 조절

- 2D화면으로 전환해 UI 배치

2. Render Mode
 1) Screen Space - Overlay : 화면 해상도에 맞춰 자동으로 스케일

 -> 3D + 2D UI 합성 방식으로 일반적 사용 // 단, 가상현실에서 사용 불가능

 - Scene에 렌더링 될 UI 요소를 화면에 배치, 3D 공간 위 canvas rendering (canvas는 출력 스크린 맞춰 자동 resize)

 - 해상도와 aspect 모두 고려됨.

 2) Screen Space - Camera : MainCamera와 별도로 UICamera 사용

 - overlay와 비슷하지만 canvas는 특정 카메라 앞, 뒤로 배치 가능.

 - 카메라가 Perspective인 경우 UI 요소에 원근법 적용 -> Canvas가 아닌 2D UI를 회전 시켜 사용가능

 - 3d object보다 UI를 앞에 둘지 결정

 3) World Space - 3D 공간의 객체로 Canvas 사용

 -> 3D 공간 UI 배치, 가상현실에서 사용

 - Canvas를 Scene에서 일반 3D  객체 처럼 인식 ( VR을 위한 canvas )

 - default ( Pos X, Pos Y, Pos Z : 0, 0, 0 scale 모두 0.01 width, height는 3d object를 고려해 적절히 설정된다.)

 

Text를 통한 Text UI

-> Image, Panel을 사용해 다양한 UI 표현

- Text객체의 .text 속성을 사용해 코드로 표현 (using UnityEngine.UI 선언)

 

Info Bubble : 항상 카메라 방향 고려 출력, 거리 고려해서 일정 크기 유지

-> Text를 카메라 보게 회전 : Look At(camera), y축으로 180도 회전

-> 거리 고려해 text 크기 조절 : 거리는 카메라와 object 사이 거리 계산, 거리 비례해서 localScale 재 조정

 

TextMeshPro : 다양한 커스텀 마이징 가능, 적은 메모리 사용 ( VR에서 유용 : 가독성이 좋다 )

- Asset store 사용 asset중 unity 기본 asset

- 기본 UI Text와 Text Mesh 대체

- font asset 생성

->Window -> TextMeshPro->Font Asset Creator메뉴로 font asset 생성

->CharacterSet을 Custom Characters로 설정 -> 필요한 글자 입력 -> Generate Font Alias로 font texture 생성

(중복 캐릭터 자동 제거) -> save로 font asset 저장

- TextMeshPro 사용

-> 3D Object -> Text-TextMeshPro 선택 (Canvas 없이 직접 3D 공간에 text 렌더링)

-> 프로젝트 첫 사용시 TMP import 필요!! -> Font Asset속성을 위에서 정의한 font asset 설정

- Canvas에서 사용시 기본은 TextMeshPro형으로 C#은 TextMeshProUGUI사용

- Canvas에서 Text, Button, Input Field 객체에 별도의 TextMeshPro 객체를 제공함

 

HMD 구현 (Head Up Display) <-카메라 앞에 Canvas객체 위치(카메라에 상속) //가능한 player 근처 배치

- 1인칭 시점 몰입감 표현, 멀미 개선을 위해 고정 이미지 사용 ex) 지도, 레이싱 게임에서의 남은 바퀴 수

- 1인칭 시점에서 가상 정보 출력

- 플레이어 시점에 따라 같이 이동 (머리 돌려도 같이 이동)

Windshield

- 플레이어의 시점에 영향 없이 고정된 위치에 존재 (머리를 돌리면 안보일 수 있다.)

- 카메라와 평행하게 UI 배치

- 플레이어에게 상속되어서 함께 움직이지만 카메라 회전에는 무관

 

VR개발 플랫폼 

- 6축 headset, 6축 컨트롤러 => 위치, 회전 모두 정확하게 인식 가능

 

1. Steam Platform (PC)

- 6축 headset, 6축 컨트롤러

- HTC Vive platfrom을 위한 SteamVR asset 제공

- Base station을 설치해야함

- Steam VR을 설치

2. Windows Mixed Reality Platform

- 6축 headset, 6축 컨트롤러

- Windows Mixed Reality Portal 설치(OS완 통합) <- 설치가 쉬워짐

- 케이블 하나를 이용해 H/W 연결 -> 설치가 용이

- Unity와 Windows에서 공식적 지원

 3. Oculus Rift Platform

- 6축 headset, 6축 컨트롤러

- Stand 형태의 Base station 필요

- Oculus VR platform 설치

- Asset store에서 Oculus integration 제공

- Oculus Utilties, Avatar SDK 제공

4. Oculus Go,Quest

- 6축 headset, 6축 컨트롤러(Quest), 3축 컨트롤러(Go)

- Mobile 버전으로 PC와 연결 X

- Android platform 사용 -> 관련 SDK, Build 필요 -> 많은 컴파일시간, 디버깅 시간 필요(따로 넣어줘야해서 불편)

- Oculus Rift와 동일한 platform 사용

5. Oculus Quest + Link

- Oculus Quest는 USB-C 케이블로 PC와 연결해 Oculus Rift처럼 사용 가능

- Unity에서는 Oculus Rift로 인식

- 복잡한 설치 없이 PC 기반 6축 컨트롤러 사용 가능, VR 개발, 공부에 가장 좋은 플랫폼

6. Google DayDream

- 6축 headset, 3축 컨트롤러

- Mobile 버전 -> PC필요 X

- Android platform 사용 -> 관련 SDK, Build 필요

7. Samsung GearVR

- 6축 headset, 3축 컨트롤러

- Mobile 버전 -> PC필요 X

- Android platform 사용 -> 관련 SDK, Build 필요

- 2019.3 이후 Oculus XR Plugin은 Gear VR을 지원하지 않음.

 

Unity XR 플랫폼 - AR,VR,MR 지원

- 단일화된 플러그인 프레임워크를 통한 직접 통합

- 지원되는 모든 플랫폼에 공통적인 기능을 원할하게 제공하는 API로 구성

- XR 하드웨어, 소프트웨어 제공업체가 자체 Unity 플로그인을 개발하도록 지원

 

VRTK 플랫폼 (VR ToolKit)

- 플랫폼 독립적인 가상현실 개발 환경

- VRTK 플랫폼으로 SteamVR, Oculus, Daydream등 모든 가상현실 platform 사용가능

- CameraRig, Controller event, Teleport, Interaction 등 기능 제공

- 실제 VR 플랫폼이 없어도 키보드, 마우스를 이용한 simulator 제공

-> simulator를 이용해 많이 개발(HMD가 있어도 80%는 이걸로 개발, 나머지를 HMD로 개발)

-> VRTK로는 HMD 없이 개발 가능(마우스, 키보드 사용)

-> Switch SDK 프리팹을 통해 VR platform을 실시간 변경 가능

 

6축 컨트롤러의 주요 버튼

- Grip : 물건 잡기

- Trigger : 물건을 사용 (방아쇠 역할)

- Thumbstick : teleport 할 때 (이동, 클릭)

 

VRTK 플랫폼을 이용한 VR 개발

- 여러 platform을 관리, 컨트롤러 설정을 할 객체 소환(VRTKSDK 객체 : empty object )

-> 객체에 VRTK_SDKManager 컴포넌트 추가

-> Simulator 객체를 생성(VRTK_SDKManager컴포턴트를 가진 객체 자식으로) //empty object생성 -> 이름 변경

-> Simulator 객체 하위 자식으로 VRSimulatorCameraRig Prefab을 자식 객체로 추가

-> Simulator 객체에 VRTK_SDK Setup 컴포넌트 추가(Quick Select에 Simulator추가)

-> VRTK_SDKManager에서 Auto Populate 실행

 

1. VRTKSDK(empty object에서 이름 변경)

- VRTK_SDKManager 컴포넌트 가짐

2. Simulator(empty object에서 이름 변경)

- VRTK/Prefabs에 존재하는 VRSimulatorCameraRig를 하위 객체로 가짐

- VRTK_SDK Setup 컴포넌트 지님

 

이를 간편화 한 Prefab도 존재 : SDKSetups Prefab

- 다양한 SDK를 초기화 시킴

- VRTKSDK 생성

- 자식 객체로 SDKSetups Prefab 추가

- SDK Manager 컴포넌트 추가 (Auto Populate 실행)

 

SDKSetupSwitcher Prefab // SDK를 실시간으로 변경할 수 있는 기능 제공

- VRTKSetup 객체 자식으로 SDKSetupSwitcher 컴포넌트 추가

-> SDK 손쉽게 변경 (실행 시 SDK 변경할 수 있는 UI 제공) //원래는 실행 중 SDK 변경 불가능

 

Simulator를 위한 컨트롤러 model 수정

- 컨트롤러가 작아 제어가 어려우면 scale 수정

- 진행방향 표시를 위해 cube 객체 추가

- 컨트롤러를 사용해 상하 좌우 이동 표시(Guides 사용/UI)

 

사용자 정의 컨트롤러 : 모든 컨트롤러에서 사용 가능한 사용자 정의 컨트롤러 지원

- VRTK 플랫폼에서 하나의 사용자 정의 컨트롤러 정의

- 사용자 정의 모델과 이벤트 재정의 가능

- EmptyObject에 3D모델 및 이벤트 핸들러 작성

- 실행 모드에서 컨트롤러를 실제 HMD 컨트롤러 하위 객체로 이동

-> VRTK_SDKManager 객체 사용 -> 왼쪽, 오른쪽 컨트롤러 개별적 지정

-> Empty object로 부터 계층 구조를 가지고 객체생성(Controller, Left, Right)

-> VRTK_SDKManager에 Left는 Left Controller, Rigth는 Right Controller에 할당된다.

 

이벤트 처리 ( 컨트롤러 이벤트 핸들러 )

- 컨트롤러부터 이벤트를 받기 위해 VRTK_ControllerEvents 컴포넌트 추가 (LEFT, RIGHT or Controller위치에)

- VRTK_ControllerEvents_UnityEvents 컴포넌트를 추가해서 개별 버튼에 대한 이벤트핸들러 작성

-> 이벤트 핸들러 작성을 위해 VRTK 모듈 필요 (using VRTK;)

 

컨트롤러 이벤트 핸들러 : ControllerInteractionEventArgs 세부 정보
left, right 버튼에 대한 index (왼쪽 눌렸는지, 오른쪽 눌렸는지 확인 )
- uint index = VRTK_ControllerReference.GetRealIndex(e.controllerReference); //e는 발생시킨 버튼 세부정보를 줌
- 오른쪽 1, 왼쪽 2
버튼 press 강도 
- e.buttonPressure (강도따라 0~1)  
Touchpad 좌표
- e.touchpadAxis (x,y 좌표값)
Touchpad 각도
- e.touchpadAngle (클릭 했을 때 각도값)

 

물리엔진 모델

- 오브젝트에 물리엔진 연산을 하기 위해서는 Rigidbody 컴포넌트가 필요

- Rigidbody : 외부 객체 충돌 처리, 중력 적용, 외부 힘 반응

-> Constraints : 외부 힘에 의해 고정되야하는 조건(위치, 회전)

- Collider : 물리엔진 적용 영역, 외부에 힘이 가해지면 물리 연산 수행 (원이 가장 연산이 적다.)

-> 3D 오브젝트마다 개별 collider를 가짐

-> 임의 오브젝트는 mesh collider 사용 ( mesh 모양 따라 collider 생성 )

=> 복잡할 수록 오래걸림(정확도 높고, 시간 오래걸림)

- Collider가 있어야 충돌 체크가 이루어진다.

 

충돌 기본

1. Collider는 물리적으로 보이는 영역

2. mesh는 사람이 시각적으로 보는 영역

3. 이동 객체에 rigidbody, collider 추가

4. 고정 객체는 collider만 추가

5. 유니티는 물체 질량보다 collider 크기가 더 중요

 

충돌 이벤트 발생 조건 (이벤트는 충돌한 객체 모두에서 발생) : Collision Event

- 두 객체 모두 collider가 있다.

- 둘 중 하나는 Rigidbody가 있다. <-움직이는 object에 Rigidbody 존재

- Rigidbody가 있는 객체가 움직였다.

-> 충돌 객체 정보는 collision.gameObject를 통해 얻는다.

- ex) OnCollisionEnter(Collision collision)

Trigger event

- 충돌만 감지 (물리적 연산 X)

- 물리적으로 관통을 의미

- 주로 논리적 충돌 체크를 위해 사용

- ex) OnTriggerEnter(Collider collider)

trigger 발동 조건

- 두 객체 모두 collider 존재 //공통

- 둘 중 하나는 Rigidbody가 있다. //공통

- 둘 중 하나는 Is Trigger가 체크 //collision과 trigger 차이

- 어느쪽이 움직여도 이벤트 발생 //collision과 trigger 차이

 

Collider의 Is Trigger의 체크 유무에따라 collsion인지 trigger인지로 나뉘어짐

 

강체 운동 제어

Rigidbody컴포넌트는 외부에서 힘을 가하는 함수 제공

(힘, 속도는 3차원 벡터)

- .AddForce : 힘 가함 (진행방향으로)

- .velocity : 속도 변경

 

반복적 생성(소모품) => prefab으로 처리

 

가상현실에서의 이동 시스템

1) 특정 지점을 옮겨 다니는 경우 (방향을 바꿔가며 볼 수 있다.)

2) Rail Shooting (정해진 길을 따라 이동, player 이동 제어X) - 보통 3축에서 많이 사용

3) 제한된 형태 이동 (특정 지점으로만 자유롭게 이동) ex) 텔레포트

4) 일반 3D게임같은 제한 없는 이동 (자율롭지만 멀미 유발 가능)

5) 다양한 형태 이동 복합적 지원(한게임에 1~4방식 모두 사용) //몰입감, 멀미유발 최적화

 

고정 waypoint 이동

- empty object로 부터 waypoint 객체 생성 -> 하위에 자식 객체 추가(포인트 1~...)

 

목적지 방향으로 이동시 이동과 회전을 고려해야함(상호아에 맞게 상하 회전도 조절해야함)

- 목적지 방향으로 회전량 계산 벡터의 뺄셈을 통해 현재 위치에서 target을 바라보게함

-> 상하 회전은 진행 방향 계산 후 벡터의 y값을 0으로 만든다.

 

효율적인 waypoint 디자인 : wire sphere로 출력 => Gizmos 시스템

void OnDrawGizmos() 함수 사용 -> 게임플레이 영향X 디자인 씬에서만 표현

 

VR연동

- HMD 위치를 직접 제어하기 위해 CameraRig를 이용해야함

- HMD SDK가 개별적으로 CameraRig 객체를 가지고 있다. tag로 CamerRig를 찾아야함

-> Rig를 찾아 태그로 지정해두는걸 추천

 

텔레포트를 위한 포인터(무한대 직선) 생성 (컴포넌트는 컨트롤러 LEFT, RIGHT 각각 구현)

- Touchpad 이벤트 처리를 위해 VRTK_ControllerEvents 컴포넌트 추가

- Pointer 관련 기능을 처리하기 위해서 VRTK_Pointer 컴포넌트 추가

- 직선 포인터를 렌덜이하기 위해서 VRTK_StraightPointerRender 컴포넌트 추가

- VRTK_StraightPointerRender 컴포넌트를 VRTK_Pointer의 PointerRenderer 속성에 할당에 포인터에 사용할 렌더러 연결

- 왼쪽과 오른쪽 컨트롤러 각각 구현

 

PlayArea 생성

- 실제 Player 영역(CameraRig)를 텔레포트를 위해 Empty Object로 PlayArea 객체 생성

- 어떤 방식으로 teleport할지 기능 구현한 VRTK_BasicTeleport 컴포넌트 추가

- 텔레포트는 바로 이동하는 것이 아닌 눈 깜빡이면 이동하는 형태 (Blink Transition Speed와 Blink To Color 사용)

-> 멀미감 개선

 

직선형태 포인터 (StraightPointer)

곡선형태 포인터 (BazierPointer)

 

텔레포트 포인터 모양 설정

1 : Maximum Length 포인터 목적지까지 최대 거리

2 : Tracer Density : 포인터 빔의 밀도

3 : Cursor Radius : 포인터 빔의 크기

 

Custom 포인터 설정 : Tracer

- Custom Tracer를 사용해 segment 변경 가능

- sphere 대신 line을 segment로 사용 (LineSegment)

- 애니메이션 가진 line segment (LineSegmentTexAnim) 지원

- 밀도를 높이기 위해 Rescale Tracer 체크

 

Custom 포인터 설정 : Cursor

- Custom Cursor로 목적기 나타내는 Cursor 변경 가능

- BezierCursor 객체

 

텔레포트는 이동 가능한 영역에대한 정책 설정을 해야한다

- PlayArea 객체에 VRTK_PolicyList 컴포넌트 추가 (설정시 정책에 설정되있는 위치만 텔레포트 가능, 없으면 어디든가능)

- policy 설정하면 기본값 무시, 정책에 나열된 기준만 사용

 

텔레포트 높이 보정

- 텔레포트 높이 조정을 안하면 높은 곳으로 텔레포트하면 객체 안으로 텔레포트 해버림

-> VRTK_HeightAdjustTeleport 사용

 

컨트롤러를 이용한  상호 작용

- 일반 오브젝트와 컨트롤러는 물리엔진 적용X (기본적으로 상호작용에 반응X)

-> 컨트롤러는 주변 객체 관통(터치, 잡기X)

- 컨트롤러와 상호 작용이 가능한 객체가 되기 위해서는?

-> 충돌체크, grab이벤트 감지 기능 필요

1. 컨트롤러

1) InteractTouch 컴포넌트 추가 ( 충돌 체크 ) // VRTK_InteractTouch

2) InteractGrab 컴포넌트 추가 ( grab 액션 처리 ) - grab button 설정 필요 ( default = grip버튼 ) 

-> VRTK_InteractGrab

3) Left, Right 컨트롤러에 각각 추가

2. 객체 (상호 작용을 위해)

1) Rigidbody 객체 추가 // 물리 엔진 적용

2) InteractableObject 객체 추가

3) Is grabbable : true면 grab 가능

4) Hold Button To grab : false면 grip 버튼이 toggle 형태로 동작

5) 컨트롤러가 객체와 충돌 시 touch highlight color 색으로 변경 ( 충돌을 알기 위해 )

-> Outline Highlighter로 외곽선만 강조 ( 전체를 바꾸는 건 문제가 발생할 수 있음)

-> Thickness로 outline 굵기조절 (VRTK_Outline Object Copy Highlighter 컴포넌트 효과 추가해야함)

 

Grab 가능한 객체는 grip 버튼을 press해서 컨트롤러 부착 가능

-> release하면 3D객체는 rigidbody 컴포넌트을 가졌기 때문에 물리엔진 적용

 

Grab Attach Mechanic : grab후 상호작용 가능한 객체와 어떤 관계를 가제는지에따라 다양한 grab 관게 지원

1) Fixed Joint Grab Attach (default)

- Fixed Joint로 컨트롤러와 객체 연결 ( 기본은물체의 중심 )

- Interactable Object가 다른 충돌체와 충동하면 관절이 끊어 질 수 있다.

- Grab Attach Mechanic의 기본값

2) Spring Joint Grab Attach

- 상호 작용 가능한 객체를 스프링 조인트를 통해 컨틀롤러에 연결

- 컨트롤러와 객체 사이를 눈에 보이지 않는 스프링으로 연결 (연결이 돼있지만 직접적x -> 달랑거림)

3) Track Object Grab Attach : 눈에 보이지 않는 연결고리를 가지고 있음.

- 상호 작용 가능한 객체에 컨트롤러 속도를 적용하여 객체의 위치를 추적

- 컨트롤러와 객체 사이 다른 물체를 놓을 수 있다.

- 다른 오브젝트와 충돌해도 grab 상황에서는 추적 계속 유지 

4) Rotator Track Grab Attach ex) 회전판

- 상호 작용 가능한 객체에 회전력 적용

- 객체는 컨트롤러에 부착되지 않고 컨트롤러 회전에 따라 회전력을 가진다.

5) Child of Controller Grab Attach : 가장 많이 쓰인다

- 설정한 객체를 컨트롤러 자식으로 설정

- 사용자가 설정한 위치에 객체 위치에 컨트롤러 부착

- 중심점에 컨트롤러 존재

- 상호 작용 가능한 객체에 컴포넌트 추가(Child of Controller Grab Attach 컴포넌트 추가)

- Right snap Handle, Left snap Handle -> 손으로 잡을 부분 설정

 

상호 작용 가능한 객체의 사용(Use) 이벤트 : InteractUse 컴포넌트 추가(컨트롤러에)

- 일반적으로 trigger버튼으로 사용 (Use Button)

- InteractableObject객체를 상속받아 -> StartUsing, StopUsing 함수 재정의 //따로 사용 가능

- Is Usable : check하면 Use 관련 이벤트 동작

- Hold Button To Use : check하면 trigger 버튼 누르고 있는 동안 발생

Use Only If Grabbed : grab하는 동안 use 이벤트 발생 //자연스럽지 않지만 가끔 필요할 수 있다.

 

Automatic grab : 시작하자마자 자동으로 적용

- 컨트롤러에 ObjectAutoGrab 컴포넌트 부착 -> 자동으로 특정 객체를 부착

- Object To Grab : 상호작용 가능한 객체 지정

- Object is prefab : 상호작용 가능한 prefab 지정

- Clone Grabbed Object : 복제해서 컨트롤러 부착 

 

3D 객체가 rigidbody가 없으면 객체(배경)으로 작용 //고정 객체로 사용(rigidbody 사용X)

3D 객체가 rigidbody컴포넌트가 있으면 외부 힘에 의해서 움직일 수 있다. // 외부 힘 반응(rigidbody 사용)

 

사과나무

- Gravity true : 나무에 매달려 있지 못함 // 중력 적용

- Gravity false : 나무에 매달려 있음 // 중력 없음

- Is Kinematic false : 중력만 X 물리엔진 O => 우주처럼 둥둥 떠다님

- Is Kinematic true : 중력 X 물리엔진 적용 X

 

(사과)-> Gravity false, Is Kinematic true => 사과를 나무에 매달려 있게 한다.(중력X 물리엔진 적용X)

(컨트롤러)release 후 -> 중력 true, Is Kinematic false => 사과가 아래로 떨어짐

(사과나무)OncollisionEnter를 통해 다시 부착 구현 (중력 false, Is Kinematic true)

 

'학교수업' 카테고리의 다른 글

웹개발 기초 9주차  (0) 2021.10.30
웹개발 기초 7주차  (0) 2021.10.30
가상현실프로그래밍 7주차  (0) 2021.10.23
임베디드기초 7주차  (0) 2021.10.23
<시험 정리>정보보호개론  (0) 2021.10.20