앵커는 실제 세계의 고정된 위치와 방향을 설명합니다. 객체를 앵커에 연결하면 객체가 현실 세계에 사실적으로 배치된 것처럼 표시됩니다.
Jetpack XR용 ARCore 세션 만들기
Jetpack XR 세션용 ARCore를 통해 앵커를 만듭니다. Session
를 가져오려면 세션의 수명 주기 이해하기를 참고하세요.
세션 구성
앵커를 만들고 로드하는 데는 세션을 구성하지 않아도 됩니다.
하지만 앵커 지속성은 XR 세션에서 기본적으로 사용 설정되지 않습니다. 로컬 스토리지에서 앵커를 유지하고 로드하려면 세션을 구성하고 AnchorPersistenceMode.LOCAL
모드를 설정하세요.
val newConfig = session.config.copy( anchorPersistence = Config.AnchorPersistenceMode.LOCAL, ) when (val result = session.configure(newConfig)) { is SessionConfigureConfigurationNotSupported -> TODO(/* Some combinations of configurations are not valid. Handle this failure case. */) is SessionConfigureSuccess -> TODO(/* Success! */) else -> TODO(/* A different unhandled exception was thrown. */) }
콘텐츠를 공간의 고정된 위치에 고정
앵커는 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
을 만들고 상위를 AnchorEntity
로 설정합니다.
AnchorEntity.create(session, anchor).apply { parent = session.scene.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)