본문 바로가기
RealityKit & ARKit

RealityKit - 기본 Interaction과 외부 모델

by ARpple 2023. 7. 29.

ARView에서 탭 인식하기

실제 아이폰 스크린을 통해 탭 한 위치에 존재하는 RealityKit 가상 공간의 영역의 위치로 인식하는 방법

간단하게 ARView에 존재하는 Entity 탭하기

1. UIKit을 메서드를 통한 ARView에서 탭한 좌표 받기

let tapLocation: CGPoint = recognizer.location(in: view)

⇒ UIKit에서 탭을 한 곳의 좌표를 받아오는 함수

2. ARView에서 탭한 좌표에 entity를 받아오기

 

entity(at:) | Apple Developer Documentation

Finds the entity in the AR scene closest to the specified point.

developer.apple.com

let entity = view.entity(at: tapLocation)

⇒ 탭 좌표에서 가장 가까운 entity를 가져오는 ARView 메서드

⇒ Entity 타입으로 반환해서 필요에 따라 downcasting이 필요하다.

3. 이후 필요한 동작 시키기

entity.position = simd_make_float3(1, 0, 0) // x, y, z 좌표

💡 이 방법은 정확한 가상 객체의 조작은 할 수 없다… (탭한 위치가 2D로는 중복되는 객체를 탭하면?) ⇒ 근본적인 2D Input만을 가지는 게임 및 그래픽스 영역의 고질적인 문제였다. ⇒ 이를 해결하기 위해 RayCast란 기법을 이용한다.

RayCast를 이용한 현실 평면 탭 인식 후 가상 객체 추가하기

1. RayCast 발사하기

탭한 위치에서 raycast를 발사해 그 감지된 평면 등을 반환한다.

let results:[ARRaycastResult] = arView.raycast(from: tapLocation,
                            allowing: .estimatedPlane, alignment: .horizontal)
  • alignment → 어떤 현실 평면을 인식할 것인가?
    • .horizontal .vertical .any
  • allowing → 얼마나 엄격하게 인식할 것인가?
    • .estimatedPlane 레이캐스트 타깃은 비평면 표면 또는 ARKit이 추정만 할 수 있는 평면을 지정
    • .existingPlaneGeometry 평면이 확실한 크기와 모양을 가져야 하는 레이캐스트 타깃입니다.
    • .existingPlaneInfinit 크기와 모양에 관계없이 감지된 평면을 지정하는 레이캐스트 타깃입니다.

2. 감지된 결과를 이용한 Anchor 만들기

let anchorEntity = AnchorEntity(raycastResult: result)

😀 이미 생성자가 만들어져 있음..!

3. Model을 만들고 위에서 만든 Anchor에 추가하기

Model에 3D 기본 동작 적용하기

 

가상 객체에 이동, 크기, 돌리기(Rotation)의 변화를 허용하기

1. Model에 충돌감지 설정하기

modelEntity.generateCollisionShapes(recursive: false)

💡 recursive는 이 모델 Entity의 하위 계층 구조의 모든 Entity에 충돌 감지 모형을 만들겠다는 의미이다. 예를들어, 자동차 가상 객체를 만들면 외형 뿐만 아니라 내부의 엔진, 좌석 등등에 감지 모형을 만든다.

2. ARView가 해당 Model의 기본 3D 동작 중 어떤 것을 허용할지 설정

arView.installGestures(.scale, for: modelEntity)

  • EntityGestures 타입 → enum
  • translation rotation scale all

외부에서 만든 Model 부르기

💡 realitykit은 애플에서 밀어주는 usdz와 reality라는 확장자 파일을 이용하는 것이 좋다.

1. try? ModelEntity.loadModel(named: "shoe")

2. ModelEntity.loadModelAsync(named: "파일이름명") → 비동기 처리

⇒ Combine 형태로 <ModelEntity,Completion>을 반환

애플 공식문서에서 deprecated 예정이라한다. Entity.loadModel(...)이 async/await이 가능해졌다는 이유이다.
그런데 내 xcode는 안되는것 같아 그냥 Combine을 사용했다.

 

댓글