본글은 ARKit 동영상 강의를 기반으로 작성한 글입니다. 출처는 아래에서 확인할 수 있습니다.
오역이나 잘못된 정보에 대한 수정은 언제든지 환영합니다 :)
이전 게시글에서 노드에 물리적 법칙을 적용했지만 평면과 닿았을때 그냥 통과해버림.
해당 게시글에서는 노드가 평면과 충돌했을때 멈추게 할 것.
- pysicsBody 타입이 .dynamic 인
boxNode
노드에categoryBitMask
프로퍼티 적용
boxNode.physicsBody?.categoryBitMask = BodyType.box.rawValue
cf) BodyType
은 custom enum
타입
노드의 physicsBody 는 다음과 같은 프로퍼티를 가지고 있음
categoryBitMask
— 오브젝트의 타입을 정의하는 숫자. 이는 다른 물체와의 충돌을 고려해 지정된 것으로 32가지의 다른 값을 가질 수 있고default value
는0xFFFFFFFF
collisionBitMask
— 해당 노드가 어떤categoryBitMask
를 가진 오브젝트와 충돌할지 정의하는 숫자.default value
는 “모든 것”을 의미하는0xFFFFFFFF
로 모든것에 대해 반응 가능.contactTestBitMask
— 사용자가 감지하길 원하는 충돌을 정의하는 숫자.default value
는 “아무것도 아님”을 의미하는0x00000000
로 사용자는 충돌에 대해 감지하지 못함.contactTestBitMask
를 사용해 무언가를 할 때는 주의해야하는데, 너무 빈번히 사용하면 성능비가 좋지 않기 때문에 오브젝트 사이의 충돌 감지를 통해 어떠한 액션을 취해야 할 경우가 아니라면 자제하는 좋음.
collisionBitMask
나 contactTestBitMask
에서 언급될 모든 노드는 반드시 categoryBitMask
가 있어야 한다.
만약 노드에 collisionBitMask
를 설정하되 contactTestBitMask
는 설정하지 않으면, 서로에 반응하지만 사용자는 이를 감지하진 못함. 반대의 경우(collisionBitMask
미설정 /contactTestBitMask
설정)에는 서로에 반응하지는 않지만 겹칠때 사용자는 이를 감지를 할 수 있음.
2. boxNode
와 충돌할 planeNode
의 physicsBody
및categoryBitMask
적용
setup()
함수 안의planeNode
에physicsBody
및categoryBitMask
적용
planeNode.physicsBody = SCNPhysicsBody(type: .static, shape: SCNPhysicsShape(geometry: self.planeGeometry, options: nil))planeNode.physicsBody?.categoryBitMask = BodyType.plane.rawValue
planeNode
는 충돌시 움직이지 않으므로 type
은 .static
이고 계속해서 모양이 확장해나가기 때문에 shape
의 geometry
를 따로 지정
update()
함수 안의planeNode
에physicsBody
적용
let planeNode = self.childNodes.first!planeNode.physicsBody = SCNPhysicsBody(type: .static, shape: SCNPhysicsShape(geometry: self.planeGeometry, options: nil))
planeGeometry
의 width
와 height
가 계속해서 확장되기 때문에 그에 따라 physicsBody
의 geometry
도 업데이트 시켜줘야하기 때문