미디어 콘텐츠 스터디

04. 오브젝트 확대/축소하기(Object Pinch to Scale/Drag) 본문

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

04. 오브젝트 확대/축소하기(Object Pinch to Scale/Drag)

danmujicat 2023. 8. 12. 19:12

AR 개발을 위한 프로젝트를 준비하기 위해 Window | Package Manangement 메뉴를 선택하여  Package Manangement 창을 열고 AR 장치 플러그인을 설치합니다.

1장의  ARCore 개발을 위한 환경 구축하기 참고하세요

더보기
  •  AR 장치용 XR plugins 설치하기
  • ARCore XR Plugin 설치하기
  • AR Foundation 패키지 설치하기
  • Input System 설치하기
  • Androd 플랫폼의 ARcore 설정하기
  • Player 설정하기

 

1. 기본 AR 장면 만들기

① File | Save As 메뉴를 선택하여  Assets/Scenes/ 폴더에 이름을 BasicARScene으로  저장합니다.

② Hierarchy 창에서 Main Camera를 삭제합니다.

③ GameObject |  XR | AR Session 메뉴를 선택하여 Hierarchy 창에 AR Session을 추가합니다.

④ GameObject |  XR | XR Origin  메뉴를 선택하여 Hierarchy 창에 XR Origin 을 추가합니다.

 

1.1 AR Default Point Cloud 프리팹 설정하기

① Hierarchy 창에서 XR Origin오브젝트를 선택하고 Inspector 창에 Add Component 버튼을 클릭하여 AR Point Cloud Manager 컴포넌트를 추가합니다. 

② Hierarchy 창에서 GameObject | XR | AR Default Point Cloud을 선택하여 오브젝트를 추가합니다.

③ Hierarchy 창에서 Project 창의 Prefabs 폴더로 AR Default Point Cloud 오브젝트를 드래그하여 프리팹으로 만듭니다.

 Hierarchy 창에서  AR Default Point Cloud  오브젝틀르 삭제합니다.

⑤  Hierarchy 창에서 XR Origin 오브젝트를 선택하고 Inspector 창에서 AR Point Cloud Manager의 Point Cloud Prefab에 AR Default Point Cloud 프리팹을 설정합나다.

 

 

1.2  AR Default Plane 프리팹 설정하기

① Hierarchy 창에서 XR Origin 오브젝트를 선택하고 Inspector 창에 Add Component 버튼을 클릭하여 AR  Plane Manager 컴포넌트를 추가합니다.

② Hierarchy 창에서 GameObject | XR | AR Default Plane을 선택하여 오브젝트를 추가합니다.

③ Hierarchy 창에서 Project 창의 Prefabs 폴더로 AR Default Plan 오브젝트를 드래그하여 프리팹으로 만듭니다.

 Hierarchy 창에서  AR Default Plane  오브젝틀르 삭제합니다.

⑤  Hierarchy 창에서 XR Origin 오브젝트를 선택하고 Inspector 창에서 AR  Plane Manager 의 Plane Prefab에 AR Default Plane 프리팹을 설정합나다.

 

 

2.  AR 장면에 오브젝트 출력하기

 2.1 오브젝트 만들기

 Hierarchy 창에서 GameObject | Create Empty메뉴를 선택하여 빈 오브젝트를 생성하고 이름을 AR Placed Cube로 설정합니다. Transform은 초기화합니다.

 Hierarchy 창에서  AR Placed Cube를 선택하고 하위에 3D Object|Cube를 추가합니다.

   -  Cube의Transform : Position(0, 0.025,0), Scale(0.05, 0.05,0.05)

 Create | Material 메뉴를 선택하여 재질을 만들고, 이름을 PlacedCubeMaterial로 지정하고 이를 AR Placed Cube 하위의 Cube 오브젝트로 드래그하여 설정합니다.

④  Hierarchy 창에서 Project 창의 Prefabs 폴더로  AR Placed Cube 오브젝트를 드래그하여 프리팹으로 만듭니다.

  Hierarchy 창에서  AR Placed Cube 오브젝틀르 삭제합니다.

 

2.2  오브젝트 출력하기 

 Hierarchy 창에서 XR Origin 오브젝트를 선택하고 Inspector 창에 Add Component 버튼을 클릭하여 AR Raycast Manager 컴포넌트를 추가합니다.

② Hierarchy 창에서 XR Origin 오브젝트를 선택하고 Inspector 창에 Add Component 버튼을 클릭하여 새로운 PlaceOnPlane.cs 스크립트를 추가하고  다음코드를 작성합니다.

PlaceOnPlane.cs 

using System.Collections.Generic;
using UnityEngine;
using UnityEngine.XR.ARFoundation;
using UnityEngine.XR.ARSubsystems;
    
 public class PlaceOnPlane : MonoBehaviour
{
    public  GameObject m_PlacedPrefab;
    static List<ARRaycastHit> s_Hits = new List<ARRaycastHit>();
    ARRaycastManager m_RaycastManager;    
    GameObject spawnedObject;        

    bool object_spawned;
    Vector2 first_tourch;
    Vector2 second_tourch;
    float distance_current;
    float distance_previous;
    bool first_pinch = true;
    
   void Awake()
    {
        m_RaycastManager = GetComponent<ARRaycastManager>();
        object_spawned = false;
    }

    void Update()
    {
        if (Input.touchCount > 0 && !object_spawned)
        {

            if (m_RaycastManager.Raycast(Input.GetTouch(0).position, s_Hits, TrackableType.PlaneWithinPolygon))
            {
                var hitPose = s_Hits[0].pose;

                
                    spawnedObject = Instantiate(m_PlacedPrefab, hitPose.position, hitPose.rotation);
                    object_spawned = true;
                           
            }
        }
        if (Input.touchCount > 1 && object_spawned)
        {
            first_tourch = Input.GetTouch(0).position;
            second_tourch = Input.GetTouch(1).position;
            distance_current = second_tourch.magnitude - first_tourch.magnitude;
            if (first_pinch)
            {
                distance_previous = distance_current;
                first_pinch = false;

            }
            if (distance_current != distance_previous)
            {
                Vector3 scale_vale = spawnedObject.transform.localScale * (distance_current / distance_previous);
                spawnedObject.transform.localScale = scale_vale;
                distance_previous = distance_current;

            }

        }
        else first_pinch = true;
    }
}

③ Hierarchy 창에서 XR Origin 오브젝트를 선택하고 Inspector 창에 PlaceOnPlane 스크립트의 Place On Plane에 Project창에 Prefabs 폴더로  AR Placed Cube 프리팹을 드래그하여 설정합니다.

 실행하기

스마트폰에서 실행해 봅니다. 실행한후  지면을 클릭해 보고, 오브젝트를 드래그 합니다

 

3.  지면에 재질 입히기

 Project 창의 Prefabs 폴더로 AR Default Plan을 선택하고 Inspector 창에서 Materials의 Element의 재질 속성을 변경합니다.

② Hierarchy 창에서 XR Origin 오브젝트를 선택하고 Inspector 창에 PlaceOnPlane.cs 스크립트를 수정합니다.

...

public class PlaceOnPlane : MonoBehaviour
{
   ...

    ARPlaneManager m_PlaneManager;

    void Awake()
    {
        m_RaycastManager = GetComponent<ARRaycastManager>();
        m_PlaneManager = GetComponent<ARPlaneManager>();
        object_spawned = false;
    }

    void Update()
    {
        if (Input.touchCount > 0 && !object_spawned)
        {

            if (m_RaycastManager.Raycast(Input.GetTouch(0).position, s_Hits, TrackableType.PlaneWithinPolygon))
            {
                var hitPose = s_Hits[0].pose;                
                spawnedObject = Instantiate(m_PlacedPrefab, hitPose.position, hitPose.rotation);
                 object_spawned = true;
                m_RaycastManager.enabled = false;
                m_PlaneManager.enabled = false;
            }
        }
      ...
    }   

}

③ 실행하기

Comments