앵커는 실제 세계의 고정된 위치와 방향을 설명합니다. 앵커에 객체를 연결하면 객체가 실제 세계에 사실적으로 배치된 것처럼 보일 수 있습니다.
Jetpack XR용 ARCore 세션 만들기
Jetpack XR용 ARCore 세션을 통해 앵커를 만듭니다. Session
를 가져오려면 세션 수명 주기 이해하기를 참고하세요.
세션 구성
앵커를 만들고 로드할 때는 세션을 구성할 필요가 없습니다. 그러나 XR 세션에서는 기본적으로 앵커 지속성이 사용 설정되지 않습니다. 앵커를 유지하고 로드하려면 세션을 구성합니다.
val newConfig = session.config.copy( anchorPersistence = Config.AnchorPersistenceMode.Enabled, ) when (val result = session.configure(newConfig)) { is SessionConfigureConfigurationNotSupported -> TODO(/* Some combinations of configurations are not valid. Handle this failure case. */) is SessionConfigurePermissionsNotGranted -> TODO(/* The required permissions in result.permissions have not been granted. */) is SessionConfigureSuccess -> TODO(/* Success! */) }
공간의 고정된 위치에 콘텐츠 고정
앵커는 Pose
를 사용하여 생성되며, 이는 기존 Trackable
를 기준으로 해석될 수도 있고 그렇지 않을 수도 있습니다.
추적 가능한 항목을 기준으로 앵커 만들기
Plane
과 같은 Trackable
를 기준으로 앵커가 생성되면 앵커가 공간을 이동할 때 연결된 Trackable
를 따라 이동합니다.
when (val result = trackable.createAnchor(pose)) { is AnchorCreateSuccess -> { /* anchor stored in `result.anchor`. */ } else -> { /* handle failure */ } }
추적 가능한 항목 없이 앵커 만들기
Trackable
에 연결되지 않은 앵커를 만들려면 다음 단계를 따르세요.
when (val result = Anchor.create(session, pose)) { is AnchorCreateSuccess -> { /* anchor stored in `result.anchor`. */ } else -> { /* handle failure */ } }
앵커에 항목 연결
이 위치에서 모델을 렌더링하려면 [GltfModel
를 만들고][5] 상위를 AnchorEntity
로 설정합니다.
AnchorEntity.create(session, anchor).apply { setParent(session.activitySpace) addChild(entity) }
TrackingState 이해
각 Trackable
에는 사용하기 전에 확인해야 하는 TrackingState
가 있습니다.
TrackableState
이 Tracking
인 Trackable
의 경우 시스템에서 Pose
를 적극적으로 업데이트합니다. Paused
인 Trackable
는 향후 Tracking
이 될 수 있지만 Stopped
인 Trackable
는 Tracking
이 될 수 없습니다.
세션 전반에서 앵커 유지
유지되지 않는 앵커는 세션이 소멸된 후 사라집니다. 앵커를 유지하면 앱은 비공개 앱 데이터에서 앵커의 위치를 기억합니다. 이 앵커는 후속 세션에서 검색할 수 있으며 지구상의 동일한 위치에 고정됩니다.
앵커를 유지하려면 다음과 같이 anchor.persist()
를 사용합니다.
val uuid = anchor.persist()
앱은 향후 세션에서 UUID
를 사용하여 앵커를 검색할 수 있습니다.
when (val result = Anchor.load(session, uuid)) { is AnchorCreateSuccess -> { // Loading was successful. The anchor is stored in result.anchor. } else -> { // handle failure } }
더 이상 앵커가 필요하지 않으면 unpersist()
를 호출합니다. 이렇게 하면 앱의 저장소에서 앵커가 삭제되고 Anchor.load()
호출 시 지정된 UUID를 검색할 수 없게 됩니다.
Anchor.unpersist(session, uuid)
앱은 여전히 앱의 저장소에 있는 모든 지속된 앵커의 목록을 요청할 수도 있습니다.
val uuids = Anchor.getPersistedAnchorUuids(session)