증강현실(Augmented Reality)/Vuforia 사용하기

04. 증강현실 태양계 시스템 만들기

danmujicat 2021. 9. 30. 00:25

AR을 통하여 태양계 시스템을 탐험하고 행성들을 볼 수 있는 교육용 AR 시스템을 만들어 봅니다.

• 자전 혹은 공전하는 행성 및 위성들이 구조적으로 구성된 태양계 시스템을 만들고,

• 각 행성의 실제적인 모습을 모델링하기 위하여 텍스처를 사용하고,

• 광원을 추가하여 각 행성의 밤과 낮을 표현하고,

• C# 스크립트를 짜서 행성의 움직임을 표현하고,

• 마커를 이용하여 증강 장면에서 가시화될 객체를 제어하고,

• 마커를 사용하지 않는 공간 매핑에 기반한 프로젝트 개발에 대한 설명 등이다.

 

[AR 시스템 구현 환경]  Vuforia SDK 9.8 

만약 Vuforia SDK 10.2로 업그레이드 하였다면 다음 내용을 참고하시기 바랍니다. 

더보기

생성된 프로젝트내의 Pakages->manifest.json에  "com.ptc.vuforia.engine": "10.X" 행은 삭제하고

다음 코드를 추가하여 Vuforia SDK 버전을 낮추어 AR시스템을 만듭니다.

{
  "scopedRegistries": [
        {
            "name": "Vuforia",
            "url": "https://registry.packages.developer.vuforia.com/",
            "scopes": [
                "com.ptc.vuforia"
            ]
        }
    ],
    
    "dependencies": {  
        "com.ptc.vuforia.engine": "9.5.4",
        ...
    }

1. 프로젝트 셋업하기

자세한 내용은 '02. Vuforia로 첫번째 AR 애플리케이션 구축의 3. Vuforia 환경 설정하기' 설명을 참조합니다.

 

1.1 Vuforia 환경 설정하기

 Unity를 열어 새로운 3D 프로젝트를 생성학고 프로젝트명은 SolarSystem으로 입력합니다. 
 Vuforia Engine 패키지를 Import합니다.  Unity 메인 메뉴에서 Window/Asset Store메뉴를 선택하여 에셋 스토어에

   접 속하여 Vuforia Engine을 찾아 다운로드하고, Import Unity Package 창이 나타나면 import 버튼을 클릭하여

   유니티내에 임포트합니다.
 Vuforia 개발을 위한 라이센스를 생성한 프로젝트에 추가해야 합니다.

    Unity의 Project 창에서 Assets/Resources 폴더에 있는 VuforiaConguration 를 선택하고  inspector 창에서

    [Add Licence]버튼을 클릭하면 Vuforia engine developer potal 웹 페이지로 이동하여 License Manager

    웹 페이지에서 생성한 앱 이름 Vuforia를 클릭하면 Vuforia 라이센스 키가 나타납니다. 
 이 라이센스 키를 복사한 후 Unity로 돌아와서 VuforiaConfiguration의 Inspector 패널에서 App License Key의

   입력창에 복사한 라이센스 키를 붙여넣기 합니다. 

⑤ VuforiaConfiguration의 Inspector 패널에서 PlayMode Type속성이 Webcam으로 선택되어 있는지 확인합니다

 

 

1.2 장면(Scene)에 AR Camera 추가하기

자세한 내용은 '02. Vuforia로 첫번째 AR 애플리케이션 구축의 3. 첫번째 AR 애플리케이션 만들기' 설명을 참조합니다.

① Hierarchy 패널에서, Main Camera를 삭제힙니다(선택한 후, Delete 키를 누르거나 우클릭 후 Delete를 선택). 
② GameObject/VuforiaEngine/AR Camera를 선택합니다.

③ Hierachy 패널에서 씬 하위에 AR Camera가 추가됩니다.

 메인 메뉴에서 File | Save As 를 선택하고 SolarSystem 이름을 입력한 후, Assets 폴더에 저장합니다.  

⑤ File | Save Project를 통해 프로젝트 또 한번 저장합니다.

 

1.3 Android 플랫폼으로 실행 환경 설정하기

 메인 메뉴에서 File | Build Settings를 선택하여 Build Settings 창의  Scenes In Build 항목에서  Add Open Scenes

   버튼을 클릭하여 현재 장면을 등록합니다.
 Android를 선택하고 Switch Platform을 눌러서 Android가 타깃 플랫폼으로 변경합니다.  
 Player Settings로 가서 (Build Settings 내의 Player Settings, 또는 메인 메뉴의 Edit | Project Settings | Player)

   오른쪽의 안드로이드를 위한 설정을 찾습니다.  
Other Settings 하위에 있는 Package Name은 유일한 식별자여야 하며, com.Company.ProductName의 형태로

   설정합니다. 
⑤ Minimum API Level로는 Android 4.4 Lollipop (API Level 19 또는 Vuforia에서 현 재 가장 최소인 버전)을

   선택합니다. 
메인 메뉴에서 File | Save Scenes로 장면(Scene)을 저장하고 File | Save Project로 프로젝트를 저장합니다.

 

1.4 장면과 관련된 폴더 설정하기

 Project 창에서 가장 상위의 Assets/폴더를 선택합니다.
Assets/에서 SolarSystem로 새 폴더를 생성합니다.
 Assets/SolarSystem/ 폴더내에 세 개의 폴더 Textures, Scripts, Materials 를 생성합니다.

1.3 마커 사용하기

자세한 내용은 '03. 증강현실 명함만들기' 설명을 참조합니다.

 

PlanetMarkerCards.pdf라는 파일을 다운받아서 이를 프린트하고 첫 번째 문양을 잘라냅니다.

SOLAR SYSTEM라고 이름의 마커를 사용합니다.

 

PlanetMarkerCards.pdf
0.38MB

1.3.1 ImageTarget 추가하기

03. 증강현실 명함 만들기을 참고하세요

더보기

 GameObject/VuforiaEngine/Image Target을 선택합니다.
 Hierachy 패널에서 Image Target을 선택하고 Inspector 패널을 본다. Image Target Behavior 컴포넌트 아래의

    Type을 From Database로 선택합니다.
 Inspector의 Image Target Behavior 컴포넌트에서 Image Target 속성에서 Add Target 버튼을 클릭하여 

    Vuforia engine developer portal 웹 페이지로 이동합니다. 

 Vuforia engine developer portal 웹 페이지에 Target Manager 항목이 선택되어 보입니다.

1.3.2 타깃 데이터베이스 생성하기

- 데이베이스 명 :  Vuforia

- 타깃이미지 : SolarSystem

03. 증강현실 명함 만들기을 참고하세요

더보기

 

 Add Database를 눌러 데이터베이스 이름을 Vuforia로 입력하고 이미지를 앱과 함께 장치에 저장할 것이기

   때문에 데이터베이스를 Device 타입으로 정의하고 Create 버튼을 클릭합니다. 


 Target Manager 항목에서 Vuforia에서 비어있는 타깃들의 목록을 확인할 수 있습니다.

    그리고 Vuforia를 선택합니다.


 이미지 타깃을 추가하기 위해 Add Target을 클립합니다.


 나타나는 Add Target 창에서 Type항목은 Single Image 타입을 선택하고, File항목은 Browse 버튼을 클릭해 업로드할

    이미지 파일을 선택합니다.  Width항목은 이미지의 실세계에서의 너비를 미터법으로 이미지 크기가 3.5인치인 경우

    0.09미터로 입력합니다. 

참고) Vuforia에서 요구하는 이미지는 .jpg나 .png 파일이어야 하며, 24비트(RGB)나 8비트(흑백)이어야 합니다.

.png 파일은 RGBA이고 알파 채널을 가지고 있으며 이런 파일 은 업로드하려고 하면 거부당할 것입니다.

.jpg 파일에는 알파 채널이 없으며, RGB 혹은 흑백이어야 합니다.

Vuforia에서 이미지 파일의 최대 크기는 2.25 MB이다.


 Add 버튼을 클릭하면 타깃 이미지가 업로드된 것을 확인할 수 있습니다.

1.3.3. 데이터베이스 다운로드받기

03. 증강현실 명함 만들기을 참고하세요

더보기

 Target Manager 탭바에 데이터베이스이름 Vuforia 선택하여  Download Database를 누릅니다. 


 Unity Editor를 선택하고 Download를 누릅니다.

 

참고) 다운로드 파일의 저장 위치: 내PC/다운로드/BusinessCard.unitypackage

 

1.3.4 데이터베이스를 Unity로 Import하기

03. 증강현실 명함 만들기을 참고하세요

더보기

 메인 메뉴에서 Assets | Import Package | Custom Package…로 이동합니다. 
 방금 다운받은 데이터베이스 파일을 선택합니다. 
 Import를 클릭합니다.


1.3.5 활성화하기

03. 증강현실 명함 만들기을 참고하세요

더보기

 

 Project 탭바에 Resources/VuforiaConfiguration 파일을 선택합니다. 
  Inspector의 Datbase에서 BusinessCard(또는 데이터베이스에 정한 이름)이 로드됩니다.

 Extended tracking을 활성화하기 위해서는, VuforiaConfigration의 Inspector에서 Device Tracker의 컴포넌트의

   Track Device Pose를 선택합니다. 이렇게 하면 사용자가 환경 내에서 움직이고 돌아다니더라도 tracking이 멈추지

   않습니다. 


④ ImageTarget의 Inspector에서 Static으로 해두어야 합니다. Inspector의 오른쪽 위 에 있는 Static 체크박스에

   체크합니다.

 

1.4 SolarSystem Container 생성하기

 Hierarchy에서 VuMark를 선택하고 Create Empty를 마우스 우클릭을 한 후 이를 SolarSystem으로 변경합니다.
 SolarSystem을 선택하고 3D Object 메뉴에서 Sphere를 마우스 우클릭을 하여 SolarSystem의 하위 객체로서 Sphere를 추가합니다. Sphere의 Transform이 리셋되어 있음을 확인합니다(Transform | gear icon | Reset).

 Hierarchy에서 SolarSystem 객체를 다시 선택하고 이를 목표물 객체(마커) 위에 위치시 킨다(0, 0.75, 0)
 장면(Scene)을 저장하고 (File | Save Scene As) 프로젝트 또한 저장한다(File | Save Project).
⑤ Play를 누르고 Web 카메라를 목표물(곧, 마커)을 향하게 한다. 구(Sphere)가 떠있는 것이 보일 것이다.

2. 지구만들기

2.1 지구 객체 생성하기
 Hierarchy에서 SolarSystem을 우클릭한 뒤 3D Object | Sphere를 클릭하여 Earth로 이름을 변경합니다.
 이 객체의 Collider를 제거합니다(Sphere Collider | gear icon | Remove Component).

 프로젝트 Assets/SolarSystem/Textures/ 폴더로 earth.png를 Import합니다(해당 파일을 Unity Project window로 File explorer에서 그냥 드래그하여 갖고 오면 된다).

                                                   실습) earth.png 파일

earth.png
2.03MB


 Assets/SolarSystem/Textures/로부터 Earth object(Scene, Hierarchy, 혹은 Inspector window로부터)에 Earth texture를 드래그하여 놓습니다. 프로젝트 Assets/SolarSystem/Materials 폴더로 가서 보면, 이미 Unity에서 자동으로 같은 이름의 새로운 텍스처 기반(Albedo로 세팅) Material(재질) 객체를 생성해 놓았음을 확인할 수 있습니다.
⑤ Earth의 Inspector 혹은 Asset에서 직접 해당 olarSystem/Materials을 Open합니다.
⑥ Specular Highlights를 uncheck 하고 Reflections도 check를 해제합니다.

 

 

2.2 지구 객체 자전(회전)시키기

Hierarchy에서 Earth를 선택하고, 그 다음 Inspector에서 (아래로 스크롤이 필요할 수도 있음) Add Component, New     Script (C-Sharp)를 누른다. 해당 스크립트를 Spin이라 입력하고 Create and Add를 누릅니다.
   Spin 스크립트가 earth’s Inspector에 하나의 component로 나타나게 됩니다.


 Spin 스크립트를 더블클릭하여 editor에서 오픈하여 다음 코드를 작성합니다.

Spin.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Spin : MonoBehaviour
{
    public float gametimeOerDay = 24.0f;
    // Start is called before the first frame update
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        float deltaAngle = (360.0f / gametimeOerDay) * Time.deltaTime;
        transform.Rotate(0f, deltaAngle, 0f);
    }
}

편집이 끝나면 이를 파일로 저장합니다.
 Unity 창으로 돌아가 Play 버튼을 누르고 카메라를 마커를 향하게 하여 지구가 도는 것을 확인합니다.
⑤ Project 창에서 Assets/Spin.cs 스프립트 파일을 드래그하여 Assets/SolarSystem/Scripts 폴더로 이동합니다.
⑥ 장면과 프로젝트를 저장합니다

 

2.3 음향 효과 추가하기

Project 창에서 Assets/Audio라는 폴더를 만들고 sound. mp3 파일을 드래그하여 넣습니다.

                                  실습) sound.mp3 파일

sound.mp3
3.22MB

Hierarchy에 empty object를 root에 생성하고 BackgroundMusic이라고 변경하고 필요하면 Transform을 초기화합니      다(reset).
BackgroundMusic를 선택하고 메인메뉴의 Component | Audio | Audio Source를 클릭합니다.
sound.mp3 파일을 Project 창으로부터 Audio Source의 AudioClip 슬롯으로 드래그하여 놓는다.
⑤ Play on Awake 및 Loop 옵션을 선택하여 애플리케이션이 실행이 될 때 음악이 재생되고, 재생이 완료되면 다시

   반복 제생되도록 합니다.

3. 조명 효과 넣기

3.1 Point 광원으로 변경하기

 Hierarchy에서 Directional Light를 삭제합니다.
 메인메뉴의  Window | Rendering | Lighting Settings을 클릭하여 Inspector 패널 옆의 탭으로 Ligthing 창을

    드래그하여 가져다 놓습니다.
 Lighting 패널의 Scene 버튼을 선택하고 Environment 컴포턴트에서 Source를 Color로 설정하고 Ambient Color를

    검은색으로 (000) 설정합니다.
④ 또한 Environmental Reflections에서 Intensity Multiplier를 0으로 설정합니다.

3.2 태양광 추가하기

 Hierarchy 패널에서 메인메뉴의 GameObject | Light | Point Light를 선택하여 Point 광원을 만들고 이를 Sunlight으로 이름을 변경합니다.
  생성한 광원을 SolarSystem의 하위 자식 객체가 되도록 그 밑으로 이동시키고, 이의 Transform을 (-5, 0, 0)으로 설정하여 장면 중심으로부터 이동시킵니다.
광원의 구간을(Range) 매우 크게, 예를 들면 10,000으로 설정합니다.
④ 광원의 모드(Mode)를 Realtime으로 설정합니다.
⑤ 광원의 세기(Intensity)를 1.3 정도로 설정합니다.
⑥ 그림자(Shadow) 타입을 Soft Shadows로 설정합니다.

3.3 나이트(어두운 행성의 밤을 위한) 텍스처 표현하기

 earth_night.png를 Project창에 Assets/SolarSystem/Textures 폴더로 Import합니다.

                                   실습) earth_night.png

earth_night.png
1.13MB

Earth의 material를 선택합니다. Hierarchy에서 Earth를 선택하고 Inspector에서 Earth의 material을 엽니다

    (혹은 Assets/SolarSystem/Materials/earth으로 이동).
 Emission 체크박트를 체크합니다.
④ earth_night.png를 Emission 속성의 Color에 네모난 chip에 드래그합니다.
⑤ Emission Tilling을 0.5 정도로 설정하여 택스쳐를 돌립니다.
⑥ 장면과 프로젝트를 저장하고 Play를 해봅니다.

 

4. 지구-달(행성-위성) 시스템 만들기

 

4.1 Container 객체 생성하기

Hierarchy 창에서 SolarSystem 밑에 새로운 empty object를  Earth-Moon이란 이름으로 생성합니다

   (Transform을 또한 초기화한다).
 Earth를 Earth-Moon 객체의 하위 객체로 이동시킵니다.
 각 객체의 위치를  SolarSystem (0, 0.75, 0), Earth-Moon (0, 0, 0), Earth (0, 0, 0) 로 설정합니다.

4.2 달 객체 생성하기

 Hierarchy 창에서 Earth를 선택하고 Inspector 왼쪽 상단의 enable checkbox를 uncheck하여 잠시 Earth를 보이지 않게 숨김니다.
 Earth-Moon 밑에 3D Object | Sphere를 생성하고 Moon 이름으로 변경합니다. 
 Hierarchy 창에서 Moon을 선택하고 Inspector 패널에서 Sphere Collider 컴포너트를 제거합니다

   (Sphere Collider | gear icon | RemoveComponent).
④ Assets/SolarSystem/Textures 폴더로 moon.png를 Import합니다.

                                          실습) moon.png 파일

moon.png
0.22MB

⑤ moon.jpg를 Hierarchy의 Moon 객체에 드래그하여 놓습니다.

⑥ Moon의 Inspector나 Assets/SolarSystem/Materials 폴더에서 moon material을 열고 Specular Highlights와 Reflections를 uncheck합니다.  
⑦ Hierarchy에서 Moon을 선택하고 Inspector에서 Transform Scale을 (0.27, 0.27,0.27)로 변경합니다.

 => Moon구체는 현재 지구와 마찬가지로 (1,1,1)로 스케일링(크기 조정)되어 있으나 지구보다 비율적으로 작게 조정되어야 합니다.  NASA 자료에 따르면, 달은 지구의 27% 밖에 되지 않습니다.

 

 

4.3 달 위치 선정하기

 Scene 창에서 오른쪽 위 view gizmo를 사용하여 y축을 선택함으로써 위에서 바라다 보게(top view) 합니다
 그리고 view gizmo box의 가운데를 클릭하여 orthographic(평행 뷰)을 선택합니다.

 Moon의 Transform 컴포넌트의 Position을 (15.0, 0, 0)으로 설정합니다.
④ 다시 Earth를 Enable합니다(Hierarchy에서 선택하여 Inspector에서 enable box를 체크한다).
⑤ 두 객체가 보일 수 있도록 Zoom out(장면 축소)합니다.

 

5. 달 객체의 공전 애니메이션

5.1 달 객체의 궤도 추가하기

Hierarchy 창에서 Moon을 선택하고, Add Component-> New Script (C-Sharp) -> 스크립트명을 Orbit로 하고

    Create and Add를 누릅니다.
 스크립트를 더블클릭하여 Editor를 열어 다음 코드를 작성합니다.

 Orbit.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Orbit : MonoBehaviour
{
    public Transform aroudBody;
    public float orbitalPeriod = 27.3f;
    public float gametimePerDay = 24f;


    // Start is called before the first frame update
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        float deltaAngle = (360.0f / (gametimePerDay * orbitalPeriod)) * Time.deltaTime;
        transform.RotateAround(aroudBody.position, Vector3.up, deltaAngle);
    }
}

Hierarchy 패널에서 Moon을 선택하고  Inspector 패널에서 Around Body에 Earth를 드래그하여 놓습니다. .

④ Project 창에서 Orbit 스크립트를 Assets/로 부터 Assets/SolarSystem/Scripts 폴더로 옮겨 놓습니다.
⑤ 장면 및 프로젝트를 저장합니다.

 

5.2 전체 장면(태양계 시스템)에 대한 (전역적) 시간 관리하기

 Hierarchy에서 empty object를 생성하고 이를 GameController라고 합니다.
Add Component->New Script (C#)를 클릭하고, 스크립트를 MasterControls로 설정한 뒤, Create and Add를 클릭합니다.

MasterControls.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class MasterControls : MonoBehaviour
{
    public float gametimePerDay = 0.05f;
}

Spin.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Spin : MonoBehaviour
{
    public float rotationRate = 1f; // in earth days
    private MasterControls controls;

    // Start is called before the first frame update
    void Start()
    {
        GameObject controller = GameObject.Find("GameController");
        controls = controller.GetComponent<MasterControls>();
    }

    // Update is called once per frame
    void Update()
    {
        float deltaAngle = (360.0f / (rotationRate *controls.gametimePerDay)) * Time.deltaTime;
        transform.Rotate(0f, deltaAngle, 0f);
    }
}

Orbit.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Orbit : MonoBehaviour
{
    public Transform aroundBody;
    public float orbitalPeriod = 27.3f;
    private MasterControls controls;


    void Start()
    {
        GameObject controller = GameObject.Find("GameController");
        controls = controller.GetComponent<MasterControls>();
    }
    void Update()
    {
        float deltaAngle = (360.0f / (orbitalPeriod * controls.gametimePerDay)) * Time.deltaTime;
        transform.RotateAround(aroundBody.position, Vector3.up, deltaAngle);
    }
}

6. 태양의 주위 공전 만들기

6.1 태양을 중심으로 태양계 만들기

 Scene 창에서 오른쪽 위 구석의 gizmo view를 사용하여 top view가 보이도록 합니다(y-axis 화살표를 클릭하여 누름).
 gizmo의 중심에 있는 box를 클릭합니다.
 Hierarchy 패널에서 Earth-Moon을 선택하고 위치(Position)를 (5, 0, 0)으로 설정합니다.
④  Hierarchy 패널에서 Sunlight를 선택하고 이의 위치를 (Position) (0, 0, 0)으로 설정합니다.

 

6.2 태양 생성하기

 sun.png를 Assets/SolarSystem/Texture로 Import합니다.

                                                실습) sun.png

sun.png
0.49MB

Sphere 객체를 생성하여 이름을 Sun이라고 하고 이를 SolarSystem의 하위 객체가 되도록 이동합니다.
Sun 객체를 선택하고 Inspector 패널에서 생성한 Sun 객체의 Sphere Collider를 삭제합니다.
④ Sun 객체를 선택하고 sun.png 텍스쳐를 드래그하여 Sun 객체에 가져다 놓습니다.
⑤ Sun 객체의 재질(material)에서 Specular Highlights와 Reflections를 uncheck합니다.
⑥ Sun 객체의 재질(material)에서 Emission을 체크합니다.
⑦ sun.png 텍스쳐를 Emission Color chip에 드래그하여 놓습니다.
⑧ Sunlight를 Sun 객체의 하위 객체로 이동시킵니다.

6.3 태양 주위를 공전하는 지구

①  Hierarchy 패널에서 Earth-Moon 객체를 선택합니다.
② 메인메뉴의 Component | Scripts | Orbit를 선택합니다.
③ Earth-Moon 객체를 선택한 상태에서  Sun 객체를 Hierarchy로부터 드래그하여

    Inspector 패널의 Around Body slot에 가져다 놓습니다.
④ Earth-Moon 객체의 Inspector 패널에서 Orbital Period를 365.25로 설정합니다(1년).
⑤ 장면 및 프로젝트를 저장하고 Play를 누릅니다.

6.3 지구의 축을 기울게 만들기

① Hierarchy 패널에서 Earth를 선택하고 Inspector 패널의 Transform Rotation을 (0, 0, 23.4)로 변경합니다.
② Earth 객체의 Transform Position이 (0,0,0)임을 확인합니다.
③ 장면과 프로젝트를 저장합니다.

 

 

7. 다른 행성 추가하기

 

7.1 행성들의 모습을 Texture로 모델링하기

① Hierarchy에서 SolarSystem을 선택하고, 마우스 오른쪽 버튼을 클릭하여 3D Object | Sphere을 선택합니다.
② 해당 행성을 적절한 이름(여기서는 Saturn로 함) 으로 설정하고 Transform을 초기화하고, Sphere Collider를 삭제합니다.
③ 해당 행성을 아래 표에 따라 적절히 그 크기를 조정합니다(여기서는 Saturn의 scale (9.45, 9.45,9.45)로 설정함).
④ X축에서의 태양으로부터의 위치를 이웃 행성으로부터 대략 일정하게 설정합니다(여기서는 Saturn의 position(35,0,0)로 설정함).
⑤  해당 행성의 Texture를 Import하여 Assets/SolarSystem/Textures에 가져다 놓습니다(여기서는 Saturn.png로 함).

                                             실습) 타 행성의 그림파일

solarsystem-textures.zip
2.50MB


⑥ 해당 Texture를 해당 행성 (구)에 가져다 놓습니다.
⑦ 재질 패널로 가서 Specular Highlights와 Reflections를 비활성화합니다.

⑧ Spin component를 추가하여 rotation rate를 (자전 주기) 표에 나온 대로 설정합니다(여기서는 0.45로 설정함).
⑨ Orbit component를 추가하고 마찬가지로 orbital period를 (공전 주기) 표에 나온 대로 설정합다(여기서는 1095로 설정함.
⑩ Sun을 Around Body slot으로 드래그합니다.

나머지 행성에 대해 ①~⑩까지 반복 수행합니다.

7.2 토성의 고리 추가하기

① Hierarchy에서 Saturn 선택하고 오른쪽 마우스를 클릭하고 3D Object | Plane을 클릭하고 이름을 SaturnRings라고 설정합니다.
② SaturnRings을 선택하고 Transform Reset을 누르고 해당 객체의 크기(Scale)를 (0.235, 0.235, 0.235)로 조정합니다..
③ saturn_rings.png을 SolarSystem/Textures로 드래그하여 Import 하고, saturn_rings.png를 SaturnRings 객체로 드래그하여 가져다 놓습니다.
④ 재질(Material)을 오픈하여 Specular Highlights 및 Reflections를 uncheck하고 비활성화합니다.
⑤  Rendering Mode를 Cutout으로 변경합니다.
⑥ Alpha Cutoff 값을 0.3 정도로 조정합니다.

⑦ SaturnRings를 오른쪽 마우스를 클릭하고 Duplicate을 선택합니다(혹은 Control-D).
⑧ 복사된 SaturnRings(1) 객체의 Transform Rotation을 X = 180으로 설정합니다.

8. 시점 전환 만들기

① GameController에서 Component | New Script를 추가하고 이를 PlanetView라고 합니다. 스크립트를 오픈하고

   아래와 같이 작성합니다.

PlanetView.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlanetView : MonoBehaviour
{
    public Transform solarSystem;
    public Transform planet;
    // Start is called before the first frame update
    void Start()
    {
        
    }
    
    void Update()
    {
        Vector3 position = solarSystem.localPosition;
        if (planet != null)
        {
            // move solar system so planet is in the center
            position.x = -planet.localPosition.x *
           solarSystem.localScale.x;
            position.z = -planet.localPosition.z *
           solarSystem.localScale.x;
        }
        else
        {
            // center solar system on the sun
            position.x = 0f;
            position.z = 0f;
        }
        solarSystem.localPosition = position;
    }
}

② SolarSystem 객체를 GameController의 SolarSystem slot으로 드래그하여 가져다 놓습니다.
③ Earth-Moon 객체를 드래그하여 GameController의 Planet slot에 드래그하여 가져다 놓습니다.
④ Play 버튼을 눌러 확인합니다.  태양이 지구 중심을 돌고 있는 것처럼 보일 것입니다.


⑤ 에디터에서 앱을 실행하고 있는 동안 이를 동적으로 바꿀 수 있습니다. Play 모드에서 Sun 객체를 드래그하여 Planet      slot에 가져다 놓아, Earth-Moon을 대체합니다. 다시 태양이 중심에 와 있게 되고 지구가 이를 중심으로 돌고 있을       것 입니다.

그림에서는 Scene 창을 통해 지구가 ImageTarget의 원점에 있고, 다른 행성들은 그 위치와상대적으로 놓여 있음을 알 수 있습니.

⑥ Project 창에서 스크립트를 Assets/에서 Assets/SolarSystem/Scripts 폴더로 옮겨 놓습니다.

 

9. VuMark(Vuforia 마커) 사용하기

마커

 

9.1 행성들과 마커들을 연동하기

① Hierarchy 패널에서 GameController를 선택하고 Inpsector 패널에서 Add Component | New Script를 선택한 후 스크립트 PlanetMarkerHandler를 추가합니다.

PlanetMarkerHandler.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Vuforia;

public class PlanetMarkerHandler : MonoBehaviour
{
    public List<Transform> bodies = new List<Transform>();
    private VuMarkManager mVuMarkManager;
    private PlanetView planetView;


    void Start()
    {
        mVuMarkManager = TrackerManager.Instance.GetStateManager().GetVuMarkManager();
        mVuMarkManager.RegisterVuMarkDetectedCallback(OnVuMarkDetected);
    }
        public void OnVuMarkDetected(VuMarkTarget target)
    {
        int id = markIdToInt(target.InstanceId.StringValue);
        Debug.Log("Changing view: " + bodies[id].name);
        planetView.planet = bodies[id];
    }
    private int markIdToInt(string str)
    {
        return int.Parse(str.Substring(6, 2));
    }
}

② 스크립트를 저장하고 Play 버튼을 눌러 확인합니다. 카메라를 여러 다른 (프린트 되어 있는) 마커에 비추어서 콘솔을     통하여 잘 인식되고 각각의 이름들이 잘 프린트되는지 확인합니다.

③ PlanetMarkerHandler 컴포넌트에서 크기를 10으로 설정하면  행성들의 리스트가 보이게 됩니다.
④ Hierarchy 패널에서 각 객체들을 해당 slot으로 드래그합니다. 예를 들어, 태양(Sun)은 0, 수성(Mercury)은 1, 그리고       명왕성은 9까지 설정하고, 지구는 Earth-Moon객체를 사용합니다.

10. 행성 움직임 속도 조정 인터페이스 만들기

 

10.1 사용자 인터페이스(UI) 캔버스 및 버튼 생성하기

① Hierarchy 패널에서 +버튼(Create)클릭하여  UI | Canvas 메뉴를 선택합니다.
② Canvas를 선택하고, UI Scale Mode를 Constant Physical Size로 설정합니다.
③  Canvas가 선택된 상태에서, 오른쪽 마우스 버튼을 클릭하여 UI | Button을 선택합니다.
   Game 창에서 버튼은 미리 확인이 가능합니다.
④ Anchor Presets Icon을 누르고 presets dialog box를 엽니다.
⑤ 키보드에서 Alt-Shift를 하고 right-bottom을 클릭합니다. 

   Game 창에서 오른쪽 아래에 위치합니다.  


⑥ Hierarchy 패널에서 Button의 하위에 있는 Text를 선택합니다. 문자 내용을 Slow로 바꿉니다.

10.2 Game 이벤트 처리 코드

사용자가 마우스를 클릭할 때의 동작하는 코드를 작성합니다. 

MasterControls.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class MasterControls : MonoBehaviour
{

    public float gametimePerDay = 0.05f;
    public void SlowTime()
    {
        gametimePerDay = 24f;
    }
    public void ResetTime()
    {
        gametimePerDay = 0.05f;
    }
}

10.3 입력 이벤트 발동

① Hierarchy 패널에서 Button을 선택하고 메인메뉴에서 Component | Event | Event Trigger로 선택합니다.
② Event Trigger에서 Add New Event Type | PointerDown를 클릭합니다.
③ 나타나는 Pointer Down 항목에서 + icon을 클릭하고 Hierarchy 패널로부터 GameController를 드래그하여

    Object slot에 가져다 놓습니다.
④ function list에서 (현재는 No Function으로 되어 있음) MasterControls | SlowTime()를 선택합니다.
⑤ Event Trigger에서 Add New Event Type | PointerUp을 클릭합니다.
⑥  +icon을 누르고 GameController를 Object slot로 드래그하여 가져다 놓습니다.
⑦ function list에서 MasterControls | ResetTime()를 선택합니다.

 

11. 빌드 및 실행하기