ARKit에서 위치 정보를 공유하기 위한 모델을 Codable에서 생성
오늘은 구체적으로 그 Codable의 사용법을 소개하고 싶습니다.
Codable이란?
Swift4에서 사용할 수 있는 JSON의 인코딩과 디코딩을 쉽게 할 수 있는 Swift 표준 라이브러리입니다. 매우 쉽게 사용할 수 있습니다.
다음은 JSON 파서의 성능 비교 표입니다. Decodable의 JSON을 디코딩하는 데 걸리는 시간은 비교적 짧다는 것을 알 수 있습니다. 이것으로 표준이니까 사용하지 않는 손은 없네요. (Codable 형식은 Decodable & Encodable
)
1
기본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 ↩
Reference
이 문제에 관하여(ARKit에서 위치 정보를 공유하기 위한 모델을 Codable에서 생성), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/kboy/items/b8d648a40e7e2e28b515
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
struct Vector3Entity: Codable {
let x: Float
let y: Float
let z: Float
}
struct Vector4Entity: Codable {
let x: Float
let y: Float
let z: Float
let w: Float
}
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 ↩
Reference
이 문제에 관하여(ARKit에서 위치 정보를 공유하기 위한 모델을 Codable에서 생성), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/kboy/items/b8d648a40e7e2e28b515
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
// 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 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 ↩
Reference
이 문제에 관하여(ARKit에서 위치 정보를 공유하기 위한 모델을 Codable에서 생성), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/kboy/items/b8d648a40e7e2e28b515텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)