본글은 ARKit 동영상 강의를 기반으로 작성한 글입니다. 출처는 아래에서 확인할 수 있습니다.
오역이나 잘못된 정보에 대한 수정은 언제든지 환영합니다 :)
- 우선 이전의 예제와 같이 직육면체 모양의 노드를 만들고 색깔 적용
“ARKit 을 이용해 직육면체 박스 만들기” 보러가기
2. sceneView
에 TapGestureRecognizer
적용
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을 반환하도록 미리 작성해놓은 함수