ARKit에서 위치 정보를 공유하기 위한 모델을 Codable에서 생성

8669 단어 SwiftARKitCodable
어제의 ARKit에서 공간 공유하고 단말간 통신하는 방법 22선 에서 단말간에 데이터를 송수신하는데 사용하는 것은 Codable이 베스트라고 썼습니다.

오늘은 구체적으로 그 Codable의 사용법을 소개하고 싶습니다.

Codable이란?



Swift4에서 사용할 수 있는 JSON의 인코딩과 디코딩을 쉽게 할 수 있는 Swift 표준 라이브러리입니다. 매우 쉽게 사용할 수 있습니다.

다음은 JSON 파서의 성능 비교 표입니다. Decodable의 JSON을 디코딩하는 데 걸리는 시간은 비교적 짧다는 것을 알 수 있습니다. 이것으로 표준이니까 사용하지 않는 손은 없네요. (Codable 형식은 Decodable & Encodable)


1
  • 참고: Swift4 Codable이 너무 놀랐습니다.

  • 기본Entity



    그러면 ARKit의 위치 공유에서 사용하기 위한 기본 데이터를 Codable에 준거시켜 어떻게 만들어 가는지 소개합니다.

    Vector3Entity



    위치 좌표 x, y, z나 오일러 앵글은 SCNVector3로 나타내므로 거기에 대응하는 Entity를 만듭니다.
    struct Vector3Entity: Codable {
        let x: Float
        let y: Float
        let z: Float
    }
    

    Vector4Entity



    4*4 행렬의 요소나 rotation의 SCNVector4에 대응하기 위해서, 대응하는 Entity를 만듭니다.
    struct Vector4Entity: Codable {
        let x: Float
        let y: Float
        let z: Float
        let w: Float
    }
    

    실용적인 Entity



    PlayerEntity



    예를 들어, 디바이스간에 각자의 디바이스 위치를 공유하고 싶을 때, 다음과 같은 PlayerEntity를 만들어 좌표(position)와 방향(eulerAngles)을 공유합니다.
    struct PlayerEntity: Codable {
        let position: Vector3Entity
        let eulerAngles: Vector3Entity
    }
    

    TransformEntity



    4*4 행렬을 송수신하기 위한 Entity를 만듭니다. 이 변환은 장치간에 좌표를 맞출 때 필요한 경우가 많습니다. (참고: ARKit에서 공간 공유하고 단말간 통신하는 방법 22선 )
    struct TransformEntity: Codable {
        let column0: Vector4Entity
        let column1: Vector4Entity
        let column2: Vector4Entity
        let column3: Vector4Entity
    }
    

    ARKit의 위치 정보 공유 예



    보내는 쪽



    예를 들어 ARSCNViewDelegate의 renderer(:updateAtTime는 매 프레임마다 호출되므로 여기에서 카메라의 위치를 ​​가져오고 각 프레임마다 상대방에게 보낼 수 있습니다. (매 프레임마다 보내야할지는 놓아두고)
    // MARK: - <#ARSCNViewDelegate#>
    extension CameraViewController: ARSCNViewDelegate {
        func renderer(_ renderer: SCNSceneRenderer, updateAtTime time: TimeInterval) {
            guard let camera = sceneView.pointOfView else {
                return
            }
            // TODO: PlayerEntityのイニシャライザ作っとく
            let entity = PlayerEntity(position: camera.position,
                                      eulerAngles: camera.eulerAngles)
            let data: Data = try! JSONEncoder().encode(entity)
    
            // TODO: dataを送る
    
        }
    
    

    받는 쪽



    repository라고 하는 클래스에 상대로부터 데이터를 받았을 때에 발화하는 onEvent라고 하는 클래스를 준비했다고 해, 이하와 같이 그 object를 parse 할 수가 있습니다.
    repository.onEvent { object in
        guard let data = object as? Data else {
            return
        }
    
        do {
            let decoder: JSONDecoder = JSONDecoder()
            let entity: PlayerEntity = try decoder.decode(PlayerEntity.self, from: data)
            // これを使って相手のデバイスを空間上で再現する
            let position = entity.position
            let eulerAngles = entity.eulerAngles
        } catch {
    
        }
    }
    

    요약



    이상과 같은 패턴으로 기기간에 위치 정보를 공유할 수 있습니다. 위치 정보 앱을 만들고 싶은 분의 참고가 되시면 감사하겠습니다.



    htps : // 기주 b. 코 m / b 우우 테이 y / J 소쇼 오토 t 

    좋은 웹페이지 즐겨찾기