ARKit — 11. 충돌 감지하기

naljin
5 min readNov 25, 2018

--

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

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

이전 게시글에서 노드에 물리적 법칙을 적용했지만 평면과 닿았을때 그냥 통과해버림.

물리법칙 적용하기 보러가기

해당 게시글에서는 노드가 평면과 충돌했을때 멈추게 할 것.

  1. pysicsBody 타입이 .dynamic 인 boxNode노드에 categoryBitMask 프로퍼티 적용
boxNode.physicsBody?.categoryBitMask = BodyType.box.rawValue

cf) BodyTypecustom enum 타입

노드의 physicsBody 는 다음과 같은 프로퍼티를 가지고 있음

  • categoryBitMask — 오브젝트의 타입을 정의하는 숫자. 이는 다른 물체와의 충돌을 고려해 지정된 것으로 32가지의 다른 값을 가질 수 있고 default value0xFFFFFFFF
  • collisionBitMask — 해당 노드가 어떤 categoryBitMask 를 가진 오브젝트와 충돌할지 정의하는 숫자. default value는 “모든 것”을 의미하는 0xFFFFFFFF 로 모든것에 대해 반응 가능.
  • contactTestBitMask — 사용자가 감지하길 원하는 충돌을 정의하는 숫자. default value는 “아무것도 아님”을 의미하는 0x00000000 로 사용자는 충돌에 대해 감지하지 못함. contactTestBitMask 를 사용해 무언가를 할 때는 주의해야하는데, 너무 빈번히 사용하면 성능비가 좋지 않기 때문에 오브젝트 사이의 충돌 감지를 통해 어떠한 액션을 취해야 할 경우가 아니라면 자제하는 좋음.

collisionBitMaskcontactTestBitMask 에서 언급될 모든 노드는 반드시 categoryBitMask 가 있어야 한다.

만약 노드에 collisionBitMask 를 설정하되 contactTestBitMask 는 설정하지 않으면, 서로에 반응하지만 사용자는 이를 감지하진 못함. 반대의 경우(collisionBitMask 미설정 /contactTestBitMask 설정)에는 서로에 반응하지는 않지만 겹칠때 사용자는 이를 감지를 할 수 있음.

2. boxNode와 충돌할 planeNodephysicsBodycategoryBitMask 적용

  • setup() 함수 안의 planeNodephysicsBodycategoryBitMask 적용
planeNode.physicsBody = SCNPhysicsBody(type: .static, shape: SCNPhysicsShape(geometry: self.planeGeometry, options: nil))planeNode.physicsBody?.categoryBitMask = BodyType.plane.rawValue

planeNode 는 충돌시 움직이지 않으므로 type.static이고 계속해서 모양이 확장해나가기 때문에 shapegeometry 를 따로 지정

  • update() 함수 안의 planeNodephysicsBody 적용
let planeNode = self.childNodes.first!planeNode.physicsBody = SCNPhysicsBody(type: .static, shape: SCNPhysicsShape(geometry: self.planeGeometry, options: nil))

planeGeometrywidthheight 가 계속해서 확장되기 때문에 그에 따라 physicsBodygeometry도 업데이트 시켜줘야하기 때문

실제 구동 화면

출처

이전 글 👈🏻

다음 글 👉🏻

--

--

No responses yet