- 목차
포스트에서 사용한 Extensions 버전 : 1.40
프로젝트 준비
프로젝트 설정
-
해당 포스트를 참조하여 프로젝트를 설정한다. : https://likefeb16220.blogspot.com/2024/03/unity-arfoundation-setting.html
-
(샘플코드 가져오기) Package Manager에서 ARCore Extensions를 선택하면 우측하단에 “Samples” 항목에 "Persistent Cloud Anchor Sample"이 보이게 된다. “Import” 버튼을 클릭하면, “PersistentCloudAnchors” 라는 이름의 하나의 Scene에 대해서 예제 코드가 Assets 폴더 내부에 추가된다.
Keystore 생성
하단에 oauth에 사용할 용도
Google Cloud
API Key 받기
- API 활성화 및 키 제한 : ARCore API (ARCore Cloud Anchor API는 Legacy 처리됨)
OAuth Client ID 생성
- 생성…
프로젝트에 적용
(연구 필요…)
- 샘플 프로젝트의 경우 API Key만 적용해서 실행됨을 확인
- 내 프로젝트에도 같은 방법으로 시도 ← 안됨
- OAuth Client ID 생성하고, Keyless로 바꾸고 시도 ← 안됨 (Build Progressbar가 무한 지연 상태)
- 다시 API Key로 적용해서 실행 ← 동작.
- 즉, OAuth Client ID를 생성하고 API Key를 적용하여 시도하니까 동작함.
- 근데 이 방법은 1일 짜리 Anchor만 생성 가능할 듯???
용어
- Host : 앵커 등록, 앵커 업로드
- Resolve : 앵커 조회, 앵커 다운로드
| Anchor type | 앱 인스턴스간 공유 | 앵커 배치 위치 |
|---|---|---|
| Local | X | 실제 |
| Cloud | O | 실제 |
| Geospatial (지리정보) | O | 원격 |
Anchor 작업 과정
- [Master] Local Anchor 생성
- [Master] Maping quality 측정
- [Master] Hosting → Cloud Anchor 생성
- [Client] Resolving
Class 분석
ARCloudAnchor.cs
ARAnchorManager.ResolveCloudAnchorAsync(string cloudAnchorId) 함수에서 리턴되는 ResolveCloudAnchorPromise 클래스에서 (이하 promise) promise.Result.Anchor 순으로 가져오면 된다.
ARCloudAnchor 클래스 내부의 Update 함수에서 Position과 Rotation을 계속 업데이트하기 때문에 증강시킬 3D 모델이 있다면, ARCloudAnchor 하위 자식으로 설정하면 된다.
//가져오는 코드 예시
{
...
// 여기서 cancellationToken은 알아서 설정
ResolveCloudAnchorPromise promise = AnchorManager.ResolveCloudAnchorAsync(cloudId);
try
{
//샘플 코드에서는 ResolveCloudAnchorAsync 함수를 호출하자마자 PromiseState 상태를 체크한다.
//이 때, PromiseState.Done인 경우 실패 처리를 해버린다. 어짜피 비동기 작업이기 때문에 약간에 딜레이를 주는 것이 좋다.
await UniTask.Delay(TimeSpan.FromSeconds(3));
await UniTask.WaitUntil(() => promise.State != PromiseState.Pending,
cancellationToken: _cancellationToken.Token)
.Timeout(TimeSpan.FromSeconds(이거는 원하는 대로), taskCancellationTokenSource: _cancellationToken);
}
catch (OperationCanceledException c)
{
if (c.CancellationToken == _cancellationToken.Token)
{
Debug.Log(cloudId + " [Timeout] Resolve.. Cloud anchor : ");
}
}
var resolveResult = promise.Result;
if (resolveResult.CloudAnchorState == CloudAnchorState.Success)
{
//성공 동작
//3D 모델은 이 녀석의 transform을 활용하면 된다.
ARCloudAnchor cloudAnchor = resolveResult.Anchor;
}
else{
//실패 동작
}
...
}
Sample code
ARViewManager.cs
HostingCloudAnchor
기타
- Plane 가져오기
ARPlaneManager.GetAllPlanes 사라진 것으로 보임. 대신에 아래 코드로 Plane을 가져오면됨.
var planeManager = GetComponent<ARPlaneManager>();
foreach (ARPlane plane in planeManager.trackables)
{
// Do something with the ARPlane
plane.gameobject.SetActive(???????????????);
}
-
Plane 및 Point Cloud Visibility 관리
ARPlaneManager, ARPointCloudManager 컴포넌트의 enable 설정만 해주면 된다. Parametaer(Plane Prefab, Point Cloud Prefab 부분)로 받는 Prefab이 없다면 더욱 좋다.
다만 기본값으로 제공하는 Prefab(AR Default Plane, AR Default Point Cloud)을 사용하는 경우. 내부에 있는 Component 또한 disable을 설정해줘야한다. (MeshRenderer, LineRenderer 등) -
(Local) Anchor 생성 : Doc of AR Foundation 4.2
- 방법 (1) 기본적인 방법 : Raycast에서 검출된 평면 위에 생성. Anchor는 부착된 평면에 의해서만 Position이 변화.
- 방법 (2) 컴포넌트 생성 : GameObject에 ARAnchor 컴포넌트를 추가.
- 검증 필요 : 해당 방법으로 ARAnchor를 생성한 다음 postion을 변경, Host, Resolve를해서 CloudAnchor를 생성했을 때, 해당 CloudAnchor의 좌표가 ARAnchor 생성 시점으로 적용되는 것으로 봤을 때 (변경된 좌표가 반영되지 않음.), “ARAnchor” 컴포넌트 생성시 GameObject의 Transform 정보를 받아 고정되는 것으로 예상됨. 그래서 GameObject의 좌표를 미리 변경한 후, ARAnchor 컴포넌트를 추가하는 것이 좋음.
Error
RESOURCE_EXHAUSTED
Resolve 요청을 짧은 시간에 여러번 했을 경우 발생. 몇 분이 지난후 재시도하면 된다.
아니면 Resloving 작업 중에는 Resolving을 재요청하지 않도록 예외처리 해둔다.
ERROR_NOT_AUTHORIZED
PERMISSION_DENIED: The request is missing a valid API key.
(1) api 키 상태를 다시 확인 해볼것. 참고
???
Error calling GetAnchor RPC:
ewh: DATA_LOSS: The visual mapping data associated with this anchor has failed to process.

댓글
댓글 쓰기