当前位置: 首页 > 知识库问答 >
问题:

如何使用持久锚与场景?

何博涛
2023-03-14

我在云上保存了一个持久的锚(365天)。现在,我想找回它。我可以很好地使用谷歌在其示例项目之一中提供的代码。然而,我想使用场景形式,因为我想在之后做一些操作(绘制3D形状),这在场景形式中更容易做到。然而,我似乎无法解决持续的云锚。我在网上找到的所有例子,都不处理持久的云锚,它们只处理正常的24小时云锚。

@RequiresApi(api = VERSION_CODES.N)
    protected void onUpdateFrame(FrameTime frameTime) {
        Frame frame = arFragment.getArSceneView().getArFrame();

        // If there is no frame, just return.
        if (frame == null) {
            return;
        }

        if (session == null) {
            Log.d(TAG, "setup a session once");
            session = arFragment.getArSceneView().getSession();
            cloudAnchorManager = new CloudAnchorManager(session);
        }
        if (resolveListener == null && session != null) {
            Log.d(TAG, "setup a resolveListener once");
            resolveListener = new MemexViewingActivity.ResolveListener();
            // Encourage the user to look at a previously mapped area.
            if (cloudAnchorId != null && !gotGoodAnchor && cloudAnchorManager != null) {
                Log.d(TAG, "put resolveListener on cloud manager once");
                userMessageText.setText(R.string.resolving_processing);
                cloudAnchorManager.resolveCloudAnchor(cloudAnchorId, resolveListener);
            }
        }
        if (cloudAnchorManager != null && session != null) {
            try {
                Frame dummy = session.update();
                cloudAnchorManager.onUpdate();
            } catch (CameraNotAvailableException e) {
                e.printStackTrace();
            }
        }
    }

我写的上面的更新函数有什么错误吗?CloudAnchorManager类与Google在其持久化云锚示例中使用的类相同。在这里,我将把它的代码也放在这里:

package com.memex.eu.helpers;

import android.util.Log;

import com.google.ar.core.Anchor;
import com.google.ar.core.Anchor.CloudAnchorState;
import com.google.ar.core.Session;
import com.google.common.base.Preconditions;

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

/**
 * A helper class to handle all the Cloud Anchors logic, and add a callback-like mechanism on top of
 * the existing ARCore API.
 */
public class CloudAnchorManager {

  /** Listener for the results of a host operation. */
  public interface CloudAnchorListener {

    /** This method is invoked when the results of a Cloud Anchor operation are available. */
    void onComplete(Anchor anchor);
  }

  private final Session session;
  private final Map<Anchor, CloudAnchorListener> pendingAnchors = new HashMap<>();

  public CloudAnchorManager(Session session) {
    this.session = Preconditions.checkNotNull(session);
  }

  /** Hosts an anchor. The {@code listener} will be invoked when the results are available. */
  public synchronized void hostCloudAnchor(Anchor anchor, CloudAnchorListener listener) {
    Preconditions.checkNotNull(listener, "The listener cannot be null.");
    // This is configurable up to 365 days.
    Anchor newAnchor = session.hostCloudAnchorWithTtl(anchor, /* ttlDays= */ 365);
    pendingAnchors.put(newAnchor, listener);
  }

  /** Resolves an anchor. The {@code listener} will be invoked when the results are available. */
  public synchronized void resolveCloudAnchor(String anchorId, CloudAnchorListener listener) {
    Preconditions.checkNotNull(listener, "The listener cannot be null.");
    Anchor newAnchor = session.resolveCloudAnchor(anchorId);
    pendingAnchors.put(newAnchor, listener);
  }

  /** Should be called after a {@link Session#update()} call. */
  public synchronized void onUpdate() {
    Preconditions.checkNotNull(session, "The session cannot be null.");
    for (Iterator<Map.Entry<Anchor, CloudAnchorListener>> it = pendingAnchors.entrySet().iterator();
         it.hasNext(); ) {
      Map.Entry<Anchor, CloudAnchorListener> entry = it.next();
      Anchor anchor = entry.getKey();
      if (isReturnableState(anchor.getCloudAnchorState())) {
        CloudAnchorListener listener = entry.getValue();
        listener.onComplete(anchor);
        it.remove();
      }
    }
  }

  /** Clears any currently registered listeners, so they won't be called again. */
  synchronized void clearListeners() {
    pendingAnchors.clear();
  }

  private static boolean isReturnableState(CloudAnchorState cloudState) {
    switch (cloudState) {
      case NONE:
      case TASK_IN_PROGRESS:
        return false;
      default:
        return true;
    }
  }
}

另外,这里是我正在使用的另一个类(这也是来自Google示例项目):

/* Listens for a resolved anchor. */
    private final class ResolveListener implements CloudAnchorManager.CloudAnchorListener {

        @Override
        public void onComplete(Anchor resolvedAnchor) {
            runOnUiThread(
                    () -> {
                        Anchor.CloudAnchorState state = resolvedAnchor.getCloudAnchorState();
                        if (state.isError()) {
                            Log.e(TAG, "Error resolving a cloud anchor, state " + state);
                            userMessageText.setText(getString(R.string.resolving_error, state));
                            return;
                        }
                        Log.e(TAG, "cloud anchor successfully resolved, state " + state);
                        anchor = resolvedAnchor;
                        userMessageText.setText(getString(R.string.resolving_success));
                        gotGoodAnchor = true;
                    });
        }
    }

当我运行我的应用程序时,我将手机的摄像头指向我之前放置对象的物理空间,但锚从未解析。我想问题可能出在更新功能上,但我似乎不知道是什么。

共有1个答案

马魁
2023-03-14

我想我没有正确地看着这个物体。现在,它起作用了。此代码是正确的。

 类似资料:
  • 问题内容: 您好,我对hibernate世界非常陌生,似乎遇到了障碍。我需要存储的对象中有一个哈希映射。 事情是,我永远不需要使用此映射进行搜索,排序或做任何事情,我只需要将其与对象一起保存并在加载对象时加载它,因此我希望hibernate可以通过某种方式对其进行序列化然后将其存储在CLOB或BLOB字段中,但是我似乎找不到任何方法。 所以我接下来试图让hibernate保存这样 但这在运行时给了

  • 问题内容: 我想知道如何禁用Redis的持久性。这里提到了这样做的可能性:http : //redis.io/topics/persistence。我的意思是和那里描述的完全一样。任何帮助将不胜感激! 问题答案: 要禁用Redis中的 所有 数据持久性,请执行以下操作: 通过将配置指令设置为(默认值)来禁用AOF 通过禁用(注释掉)所有配置指令来禁用RDB快照(默认情况下定义了3个) 这些配置指令

  • 我在想如何禁用Redis的耐药性。这里提到了这样做的可能性:http://redis.io/topics/persistence。我的意思和那里描述的完全一样。任何帮助都将非常感谢!

  • 在我的测试应用程序中,我使用Apache HttpClient向同一主机执行连续的HttpGet请求,但在每个下一个请求时,都会发现之前的HttpConnection被关闭并创建新的HttpConnection。 我使用同一个HttpClient实例,不关闭响应。我从每个实体获取InputStream,用扫描仪读取,然后关闭扫描仪。我测试了KeepAlivestStrategy,结果是真的。请求之

  • 我已经开始使用推荐的,并不再使用。其中一件我无法粘合的事情是使用持久的cookie存储。我只想在我的连接上附加一个定制的cookie处理程序/管理器来存储cookie。Android文档并没有太大帮助,因为它将有关cookie的主题概括为两行。 我之前一直在使用LoopJ的PersistentCookieStore,效果很好。 关于如何在Android中设置一个持久的cookie存储,我可以附加到

  • 问题内容: 到目前为止,我的偏好是始终使用EntityManager 来处理插入和更新。但是我还注意到,合并会在更新/插入之前执行其他选择查询,以确保数据库中不存在记录。 现在,我正在一个需要对数据库进行大量(批量)插入的项目。从性能的角度来看,在我绝对知道我一直在创建要持久化的对象的新实例的情况下,使用持久化而不是合并有意义吗? 问题答案: 它不是用一个好主意时,就足够了- 做了很多更多的工作。