ARKit에서 오클루전

5661 단어 SceneKitiOSSwiftARKit

오클루전이란?



오클루전이란 앞에 있는 물체가 뒤에 있는 물체를 숨겨 보이지 않게 하는 상태입니다.

현실 세계에서는 뒤에 있는 물체가 앞에 있는 물체에 숨기는 것은 당연합니다만, AR의 세계에서는 물체의 표시를 잘 컨트롤하지 않으면 전후 관계를 잘 표현할 수 없습니다.

다음은 오클루전의 예입니다.

나이언틱의 예



우선은 나이언틱 동영상입니다. 가상의 피카츄가 현실의 사람의 그림자에 숨어 있습니다.


htps: //같다. 베 / 7ZrmPTPgY3

테크 테크 테크 테크의 예



이 전 내가 테크 테크 테크 테크 을 외원전에서 사용했을 때 찍은 이하의 이미지도 오클루전 하고 있습니다.



ARKit에서 오클루전



ARKit에서도 평면에 관해서라면 렌더링을 고안하면 할 수 있습니다.



결정은 renderingOrder입니다.

renderingOrder





SCNNode의 매개 변수 renderingOrder를 만지면 오클루전이 가능합니다.

평면 검출에 대해서는, [iOS 11][ARKit] 평면 감지 정보 #WWDC2017 당의 기사를 읽어 주신 다음에, 다음과 같은 정해진 패턴의 planeAnchor 의 취득으로부터 평면의 Node를 두는 코드를 봐 갑시다.
extension ViewController: ARSCNViewDelegate {
    func renderer(_ renderer: SCNSceneRenderer, didAdd node: SCNNode, for anchor: ARAnchor) {
        guard let planeAnchor = anchor as? ARPlaneAnchor else {
            return
        }
        let extent = planeAnchor.extent
        let plane = SCNPlane(width: CGFloat(extent.x), height: CGFloat(extent.z))
        let planeNode = SCNNode(geometry: plane)
        planeNode.name = "arPlane"
        planeNode.renderingOrder = -1
        planeNode.eulerAngles.x = -.pi/2
        node.addChildNode(planeNode)
    }
}

주목해야 할 것은
planeNode.renderingOrder = -1

이렇게 하면 planeNode를 그리는 순서가 가장 먼저 됩니다. 왜냐하면 SCNNode의 renderingOrder의 기본값은 0이기 때문입니다.

0보다 -1 쪽이 작기 때문에 반드시 먼저 평면이 그려져, 그 결과, 이하의 빨간색 BoxNode는 평면과 겹칠 때에 숨겨집니다.



따로 -1이 아니어도 좋지만, -1을 사용하면 다른 Node에는 0이 들어 있으므로 빠르네요.

이 renderingOrder를 제어하면 예를 들어 SceneKit의 SCNNode 렌더링 순서로 어디서나 문을 표현합니다.과 같은 것도 가능합니다.

요약


  • 평면에 Node를 붙일 수 있으면, 그 뒤에 물체를 숨겨 오클루전을 할 수 있다
  • Node마저 표면에 잘 붙일 수 있으면 책상 이외에도 오클루전 할 수 있을지도?
  • 좋은 웹페이지 즐겨찾기