ARKit — 4. 노드에 터치제스처 적용하기

naljin
4 min readOct 23, 2018

--

본글은 ARKit 동영상 강의를 기반으로 작성한 글입니다. 출처는 아래에서 확인할 수 있습니다.

오역이나 잘못된 정보에 대한 수정은 언제든지 환영합니다 :)

  1. 우선 이전의 예제와 같이 직육면체 모양의 노드를 만들고 색깔 적용

ARKit 을 이용해 직육면체 박스 만들기” 보러가기

2. sceneViewTapGestureRecognizer 적용

let tapGestureRecognizer = UITapGestureRecognizer(target : self, action : #selector(tapped))self.sceneView.addGestureRecognizer(tapGestureRecognizer)

3. tapped 함수 설정

  • tapGestureRecognizer을 받은 뷰가 SceneKitView 라고 캐스팅
let sceneView = recognizer.view as! SCNView
  • 해당 뷰(sceneView)에서 정확히 어디를 터치했는지 판단
let touchLocation : CGPoint = recognizer.location(in: sceneView)
  • 해당 부분의 터치와 맞닿은 virtual object들을 반환
let hitResults : [SCNHitTestResult] = sceneView.hitTest(touchLocation, options: [:])

.hitTest 는 특정 포인트(CGPoint)를 첫번째 parameter로 받아, 해당 부분의 터치와 맞닿은 virtual object들을 반환하는 함수.

두번째 parameter인 options는 search 에 영향을 끼치는데 SCNHitTestOption으로는 backFaceCulling, boundingBoxOnly, categoryBitMask, clipToZRange 등 다양함

  • 만약 터치 결과가 비어있지 않다면, 무언가를 터치했다는 말이므로 아래와 같이 node 를 꺼냄
let node = hitResults[0].node
  • 터치할때마다 색깔이 바뀌게 하기 위해서 해당 노드에 색깔을 지정한 SCNMaterial 객체에 접근
let material : SCNMaterial? = node.geometry?.material(named : “Color”)

하지만 위와 같이 “Color”라는 이름을 가진 SCNMaterial 객체는 존재하지 않기 때문에, 위에서 material.name = “Color”와 같이 이름을 지정해줌

  • 가져온 Material 의 속성에 접근 후 색 변경
material?.diffuse.contents = UIColor.random()

.random() 은 임의의 Color을 반환하도록 미리 작성해놓은 함수

전체코드

실제 구동 화면

이전 글 👈🏻

다음 글 👉🏻

출처

--

--

No responses yet