-
Notifications
You must be signed in to change notification settings - Fork 1
Geospatial API
최철웅 edited this page Jun 14, 2023
·
3 revisions
본 페이지에서는 GeoSpatial API에 대한 소개와 활용을 기술한다.
ARCore Geospatial API란?
Google의 ARCore 플랫폼에서 제공되는 API.
ARCore은 증강 현실(AR) 애플리케이션 개발을 위한 소프트웨어 개발 킷(SDK)이며, 더 다양하고 정확한 AR 경험을 제공하기 위해 디바이스의 카메라, 센서, 모션 추적 등을 활용한다.
ARCore Geospatial API는 AR 환경에서 지리적 정보와 관련된 작업을 수행하기 위한 기능을 제공함. 이 API를 사용하면 디바이스의 위치와 방향을 기준으로 가상 객체를 실제 세계의 지리적 위치에 배치하고, 지리적 데이터와 상호작용할 수 있음
ARCore Geospatial API의 주요 기능은 다음과 같다.
- 위치 정확도 개선: GPS 및 다른 센서 데이터를 활용하여 디바이스의 위치 정확도를 향상시킨다.
- 실시간 위치 추적: 디바이스의 움직임을 추적하여 실시간으로 위치를 감지하고 업데이트한다.
- 높이 정확도 개선: 높이 정보를 기반으로 디바이스의 상대적인 높이를 정확하게 계산한다.
- 지리적 표면 감지: 실제 세계의 지형과 표면을 감지하고 가상 객체를 이에 맞게 배치한다.
- 지리적 쿼리: 지리적 데이터베이스를 활용하여 지리적 정보를 쿼리하고, 가상 객체와 실제 세계의 위치를 연결한다.
ARCore Geospatial API는 지리적 AR 애플리케이션을 개발하는 개발자들에게 유용한 기능을 제공하여 실제 세계와 가상 세계를 통합한 현실적이고 인터랙티브한 경험을 제공할 수 있도록 도움을 준다.
Pic-AR은 보다 정확하고 다양한 사용자의 AR경험을 위해서 Geospatial API를 적극적으로 활용한다.
아래는 해당 API를 활용한 핵심 코드이며, 로직에 대해서 간단하게 설명하겠다.
Geospatial/ArNav - AR 네비게이션에 관한 기능들을 담당하는 클래스
SetAnchor
private void handleSetAnchorButton() {
Earth earth = session.getEarth();
if (earth == null || earth.getTrackingState() != TrackingState.TRACKING) {
return;
}
FirebaseUser user = auth.getCurrentUser();
DocumentReference coordsRef = db.collection("users").document(user.getUid()).collection("nav").document(user.getUid());
CollectionReference likesCoordsRef = db.collection("photoZone").document(photoZoneName).collection("userLikes");
coordsRef.get().addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() {
@Override
public void onComplete(@NonNull Task<DocumentSnapshot> task) {
if(task.isSuccessful()) {
DocumentSnapshot ds = task.getResult();
if(ds.exists()) {
List<Double> latitudes = (List<Double>) ds.get("latitudes");
List<Double> longitudes = (List<Double>) ds.get("longitudes");
for(int i=0; i<latitudes.size(); i++) {
createAnchor(earth, latitudes.get(i), longitudes.get(i), 56, 100);
storeAnchorParameters(latitudes.get(i), longitudes.get(i), 56, 100);
}
distinguisher = latitudes.size();
CONCURRENT_PREVENT_FLAG = true;
// 안내 객체 추가 완료,
// 좋아요 객체 추가 시작
likesCoordsRef.get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
@Override
public void onComplete(@NonNull Task<QuerySnapshot> task) {
if(task.isSuccessful()) {
for (QueryDocumentSnapshot results : task.getResult()) {
createAnchor(earth, (Double)results.get("latitude"), (Double)results.get("longitude"),
56, 100);
}
}
}
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
Log.e(TAG, "onFailure: " + e );
}
});
}
}
}
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
Log.e(TAG, "onFailure: " + e);
}
});
runOnUiThread(() -> clearAnchorsButton.setVisibility(View.VISIBLE));
if (clearedAnchorsAmount != null) {
clearedAnchorsAmount = null;
}
}앵커 설정에서는 데이터베이스에서 먼저 안내 지점의 좌표를 가져온 뒤, 해당 좌표에 앵커를 생성함.