ARKit에서 "비"직사각형 평면을 감지

iOS 11.3(소위 ARKit 1.5)부터 임의의 2차원 형상의 지오메트리로 평면을 검출할 수 있게 되었습니다. 예를 들어 다음 gif와 같이 원형 테이블의 평면을 원형(가까이 있는) 형상으로 감지할 수 있습니다.



덧붙여 지금부터 해설하는 API를 보면 알 수 있습니다만, 수평면 뿐만이 아니라, ARKit 1.5로 검출 가능하게 된 수직 평면에도 본 기능은 유효합니다.

ARSCNPlaneGeometry



이 기능에 있어서 열쇠가 되는 것은 ARSCNPlaneGeometry 라고 하는 iOS 11.3(ARKit 1.5)의 새로운 클래스입니다.
  • htps : //에서 ゔぇぺぺr. 아 ぇ. 코 m / 도쿠 멘 타치 온 / 아 r t / 아 rsc p 네게 오메 트리
  • SCNGeometry 를 계승하고 있어, ARKit가 검출한 평면의 2차원 형상을 나타내기 위한 클래스입니다.

    이 클래스의 이니셜 라이저는 하나뿐입니다.
    init?(device: MTLDevice)
    

    이와 같이, MTLDevice 오브젝트를 건네주게 되어 있습니다. 즉, Metal 지원 필수입니다.



    ARSCNPlaneGeometry is available only in SceneKit views or renderers that use Metal. This class is not supported for OpenGL-based SceneKit rendering.

    ARKit 1.5부터 사용할 수 있게 된 「비」직사각형의 지오메트리로서 평면 검출할 수 있는 녀석, Metal 베이스로 렌더링 하고 있을 때만 사용할 수 있다. OpenGL 베이스로 렌더링 하고 있는 경우는 사용할 수 없다. 조금씩 Metal만 지원되는 기능이 늘어났다./ARSCNPlaneGeometry htps // t. 코 / 구 C4 6K3 — Shuichi Tsutsumi (@shu223) 2018년 4월 7일


    개인적으로는, 이런 API로 명시적으로 Metal의 클래스(MTLDevice는 프로토콜입니다만)가 필요하게 된다는 것도 드문 것이라고 생각했습니다. 예를 들어 Core ML은 내부적으로 Metal을 이용하고 있어도 일체 Core ML 프레임워크의 API에는 나오지 않고, SceneKit나 Core Image도 명시적으로 Metal을 이용하는 부분 이외에서는 나오지 않습니다.



    ARPlaneAnchor의 geometry 속성



    iOS 11.3에서 ARPlaneAnchorgeometry라는 속성이 추가되었습니다. 형식은 ARPlaneGeometry입니다.



    ARPlaneGeometry 는 ARKit이 감지한 평면 모양의 메쉬 정보를 보유하는 클래스입니다. 속성에서 정점 좌표 및 정점 인덱스에 액세스할 수 있습니다.



    @property(nonatomic, readonly) const vector_float3 *vertices;
    


    @property(nonatomic, readonly) const int16_t *triangleIndices;
    


    또한, 이 부모 클래스는 NSObject 이며 SCNGeometry 가 아닙니다. 즉, 이것은 SceneKit의 노드에 지오메트리로 그대로 할당되는 것은 아닙니다. ARAnchorSCNNode 가 아니라는 것처럼 생각하면 좋을 것입니다.



    이 객체를 ARSCNPlaneGeometryupdate(from:) 메서드에 전달하여 형상을 업데이트할 수 있습니다.



    func update(from: ARPlaneGeometry)
    


    구현 방법



    ARSCNPlaneGeometry 초기화



    MTLDevice 객체를 만들고 ARSCNPlaneGeometry를 초기화합니다.



    let device = MTLCreateSystemDefaultDevice()!
    planeGeometry = ARSCNPlaneGeometry(device: device)!
    


    MTLDevice 와 그 디폴트 디바이스에 대해서는 「 Metal 입문 」로 해설하고 있습니다.



    평면 검출시/갱신시에 ARSCNPlaneGeometry 를 갱신한다



    평면 검출시/갱신시에 ARPlaneAnchor 오브젝트의 geometry 프로퍼티로부터 취득한 ARPlaneGeometry 오브젝트를 건네주어 ARSCNPlaneGeometry 오브젝트를 갱신합니다.



    func renderer(_ renderer: SCNSceneRenderer, didAdd node: SCNNode, for anchor: ARAnchor) {
        guard let planeAnchor = anchor as? ARPlaneAnchor else {fatalError()}
        planeGeometry.update(from: planeAnchor.geometry)
        ...
    }
    
    func renderer(_ renderer: SCNSceneRenderer, didUpdate node: SCNNode, for anchor: ARAnchor) {
        guard let planeAnchor = anchor as? ARPlaneAnchor else {fatalError()}
        planeGeometry.update(from: planeAnchor.geometry)
    }
    


    ARKit-Sampler에 샘플 코드가 들어 있습니다.





    이상.


    좋은 웹페이지 즐겨찾기