ARCORE:通过单击此可渲染对象来删除特定的可渲染对象

2024-02-10

我正在开发一个使用 ARCore 的 Sceneform 的项目。我基于ARCore提供的HelloSceneform示例进行开发。 我想要做的是通过点击添加一个可渲染对象,然后当我单击屏幕上的特定可渲染对象时将其删除。 我已经尝试了方法 AnchorNode.setOnTapListener 如下,但它不起作用(没有响应):

anchorNode.setOnTapListener(new Node.OnTapListener() {
                      @Override
                      public void onTap(HitTestResult hitTestResult, MotionEvent motionEvent) {
                          if(anchorNode.getAnchor()!=null){
                              arFragment.getArSceneView().getScene().removeChild(anchorNode);
                              anchorNode.getAnchor().detach();
                              anchorNode.setParent(null);
                          }
                      }
                  });

我还尝试了以下方法,导致意外关闭:

      Scene scene = arFragment.getArSceneView().getScene();
      scene.addOnPeekTouchListener(new Scene.OnPeekTouchListener() {
          @Override
          public void onPeekTouch(HitTestResult hitTestResult, MotionEvent motionEvent) {
              Node node = hitTestResult.getNode();
              node.setParent(null);
          }
      });

有什么方法可以实现这个功能吗?


下面的代码应该检测触摸并删除节点。

如果您想要一个单独的按钮来删除选定的节点,您可以添加一个常规按钮和侦听器,然后仅使用“触摸”事件来选择要删除的节点。

private void handleOnTouch(HitTestResult hitTestResult, MotionEvent motionEvent) {
        Log.d(TAG,"handleOnTouch");
        // First call ArFragment's listener to handle TransformableNodes.
        arFragment.onPeekTouch(hitTestResult, motionEvent);

        //We are only interested in the ACTION_UP events - anything else just return
        if (motionEvent.getAction() != MotionEvent.ACTION_UP) {
            return;
        }

        // Check for touching a Sceneform node
        if (hitTestResult.getNode() != null) {
            Log.d(TAG,"handleOnTouch hitTestResult.getNode() != null");
            Node hitNode = hitTestResult.getNode();

            if (hitNode.getRenderable() == andyRenderable) {
                Toast.makeText(LineViewMainActivity.this, "We've hit Andy!!", Toast.LENGTH_SHORT).show();
                arFragment.getArSceneView().getScene().removeChild(hitNode);
                AnchorNode hitNodeAnchor = (AnchorNode) hitNode;
                if (hitNodeAnchor != null) {
                     hitNode.getAnchor().detach();
                }
                hitNode.setParent(null);
                hitNode = null;
             }
        }

}

上面的内容是从 VR 测试应用程序的各个部分中提取的,并在此合并为一个简洁的示例 - 完整的工作应用程序源代码可在此处找到:https://github.com/mickod/LineView https://github.com/mickod/LineView

更新 - Kotlin 版本(2020 年 4 月测试):

    private fun removeAnchorNode(nodeToRemove: AnchorNode) {
        //Remove an Anchor node
        arFragment.getArSceneView().getScene().removeChild(nodeToRemove);
        nodeToRemove.getAnchor()?.detach();
        nodeToRemove.setParent(null);
        nodeToRemove.renderable = null
    }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ARCORE:通过单击此可渲染对象来删除特定的可渲染对象 的相关文章

随机推荐

  • 设计WCF数据契约和操作

    我开始设计一个 wcf 服务总线 它现在很小 但会随着我们业务的增长而增长 所以我担心一些日益严重的问题 并尽量不要 YAGNI 太多 这是一个电子商务平台 问题是我对把东西放在哪里犹豫了太多 我将给出一个场景来展示我所有的问题 我们有一个
  • Android:如何使用下载管理器类?

    我想从 url 下载二进制文件 是否可以使用我在这里找到的 Android 下载管理器类下载管理器类 http developer android com reference android app DownloadManager html
  • 在 Clojure 命名空间中排除 java.lang.*

    是否有可能从 Clojure 命名空间中的 java lang 中排除类名 我需要使用像 Byte 和 String 这样的变量 这里 java lang 类名就出现了 也许类似 ns my ns exclude java lang 如果您
  • 何时使用重新编译

    请耐心等待 我无法包含我的 1 000 多行程序 并且描述中有几个问题 所以我正在寻找几种类型的模式 literally just a regular word re search Word arg Varying complex patt
  • 如何重命名大量文件

    我有一个包含这样的文件的目录 a JPG b JPG c JPG 我想做这样的事情 git mv a JPG a jpg 我尝试使用 xargs 和其他工具 但似乎没有任何效果 该解决方案的核心是使用一种工具 方法来自动执行批量重命名 您可
  • 将knockout.js 与django 表单一起使用?

    我希望向我的客户端代码添加一些结构 并且一直在阅读knockout js 我一直在阅读文档并有一个简单的问题要问 因为淘汰赛要求用户添加data bindhtml 元素的属性 它的最佳使用方式是什么django表格 因为目前我正在使用 fo
  • jmeter http请求的每个线程的唯一ID

    我的 jmeter 测试发出一个包含唯一 ID 的 http 请求 http myserver com uniqueId 我想为每个线程设置基数 比如 35000 和增量 例如我的 id 是 35001 35002 35003 http m
  • 类的指针与非指针成员

    我的问题是 假设我们有两个类 A 和 B 我想在 A 类中有一个 B 的对象 我应该使用 class A public A A B b or class A public A A B b 据我所知 在第一种情况下 我可以初始化对象 b us
  • C# - 带种子的随机数

    我有这个代码 var rand new Random 0 for int i 0 i lt 100 i Console WriteLine rand Next 0 100 程序应该给我相同数字的 100 倍 因为种子是相同的 但它给出了不同
  • 如何仅打印 hexdump 中的十六进制值而不显示行号或 ASCII 表? [复制]

    这个问题在这里已经有答案了 下列的在 UNIX shell 脚本中将十进制转换为十六进制 https stackoverflow com questions 378829 convert decimal to hexadecimal in
  • 串口通信初始化

    目前我们正在尝试创建一个串行通信接口 以便能够与微处理器进行通信 事实上 一切都很好 几乎 为了能够与我们的控制器通信 我们需要与其同步 为此 我们编写一个字符串 0 SY 13 然后控制器应该回复 0 SY F5 接受同步请求 为此 我们
  • 名称或类型具有某种语言链接意味着什么?

    根据 c ANSI ISO IEC 14882 2003 第 127 页 联动规格嵌套 当链接规范嵌套时 最里面的规范决定语言 链接规范不建立范围 链接规范仅应出现在名称空间范围内 3 3 在链接规范中 指定的语言链接适用于声明引入的所有函
  • 从 bash 执行 MySQL 查询时如何获取受影响的行数?

    我知道如何从 bash 执行 MySQL 查询 命令 mysql u user p pass e mysql commands or mysql u user p pass lt lt QUERY INPUT mysql commands
  • Prolog 中的自定义数据结构语法

    在序言中 H T 是开头的列表H以及剩余元素在列表中的位置T 内部表示为 H 是否可以以类似的方式定义新语法 例如 是否可以定义 T H 是以以下结尾的列表H以及剩余元素在列表中的位置T 然后像这样自由地使用它 H T 在谓词的头部和主体中
  • 如何在 jQuery UI Datepicker 中将 minDate 设置为当前日期?

    这是我的代码 它无法正常工作 我想设置minDate到当前日期 我该怎么做 input DateFrom datepicker changeMonth true changeYear true dateFormat yy mm dd max
  • Python:根据字典中的内容从列表中获取字典

    我需要能够在 a 中找到一个项目list 本例中的一个项目是dict 基于其中的某个值dict 的结构list我需要处理如下 title some value value 123 4 id an id title another title
  • MSTest 测试方法依赖注入

    我正在使用 DI 容器 并且想要使用从容器解析的实例进行 MSTest VS 2010 单元测试 我想将这些实例注入到我的 TestMethod 或至少是我的 TestClass 中 这可能吗 现在我的 TestMethods 直接调用co
  • 根据项目的特殊属性从列表中删除项目[重复]

    这个问题在这里已经有答案了 我有一个由我定义的项目组成的列表 每个项目都有一个属性 name t item1 item2 我想根据其属性从 t 列表中删除项目 name 如remove 或pop 方法 也许我可以做类似的事情 t remov
  • C# 从文件序列化数据契约

    我有一个 Xml 消息列表 特别是我记录到文件中的 DataContract 消息 我正在尝试将它们从文件中一一反序列化 我不想立即将整个文件读入内存 因为我预计它会很大 我有这个序列化的实现并且有效 我通过使用 FileStream 进行
  • ARCORE:通过单击此可渲染对象来删除特定的可渲染对象

    我正在开发一个使用 ARCore 的 Sceneform 的项目 我基于ARCore提供的HelloSceneform示例进行开发 我想要做的是通过点击添加一个可渲染对象 然后当我单击屏幕上的特定可渲染对象时将其删除 我已经尝试了方法 An