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

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

景明诚
2023-03-14

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

java prettyprint-override">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);
          }
      });

是否有任何方法可以实现此功能?

共有2个答案

鲜于意
2023-03-14

我知道我迟到了,但这可能对某人有帮助。

  1. 要删除的节点,首先必须通过单击或触摸该节点来选择该可转移节点

以下是可用于选择和删除节点的代码。

    transformableNode.setParent(anchorNode );
    transformableNode.setRenderable(model_nodeRenderable);
    transformableNode.select();
    transformableNode.setOnTapListener((HitTestResult hitTestResult, MotionEvent Event) ->
    {

       Node nodeToRemove = hitTestResult.getNode();
       anchorNode.removeChild(nodeToRemove );

    });
陶刚豪
2023-03-14

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

如果你想用一个单独的按钮来删除一个选定的节点,你可以添加一个常规按钮和侦听器,只需使用“touch”事件来选择你想要删除的节点。

js prettyprint-override">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;
             }
        }

}

以上内容摘自虚拟现实测试应用程序的各个部分,并在此处进行了组合,以获得一个简明的示例-此处提供了完整的工作应用程序源代码:https://github.com/mickod/LineView

更新-静态编程语言版本(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
    }
 类似资料:
  • 我想渲染一个。但是,当我尝试使用Apache时,它将页面呈现为文本而不是html。 在vhost配置中,如果我尝试呈现索引。php,它可以正确执行。但是当我将DirectoryIndex更改为index时。phtml并尝试呈现索引。phtml存在于公共目录中,它只是呈现文本。 vhost配置为:ServerName parminder。com DocumentRoot“C:/workspace/p

  • Note 本节暂未进行完全的重写,错误可能会很多。如果可能的话,请对照原文进行阅读。如果有报告本节的错误,将会延迟至重写之后进行处理。 本教程中将通过增加生命值系统、获胜条件和渲染文本形式的反馈来对游戏做最后的完善。本教程很大程度上是建立在之前的教程文本渲染基础之上,因此如果没有看过的话,强烈建议您先一步一步学习之前的教程。 在Breakout中,所有的文本渲染代码都封装在一个名为TextRend

  • 当你在图形计算领域冒险到了一定阶段以后你可能会想使用OpenGL来绘制文本。然而,可能与你想象的并不一样,使用像OpenGL这样的底层库来把文本渲染到屏幕上并不是一件简单的事情。如果你只需要绘制128种不同的字符(Character),那么事情可能会简单一些。但是如果你要绘制的字符有着不同的宽、高和边距,事情马上就复杂了。根据你使用语言的不同,你可能会需要多于128个字符。再者,如果你要绘制音乐符

  • 我试着让玩家点击保持然后拖拽然后放开,这将完成从你点击的地方到你放开的地方画一条线。然而,我似乎不知道如何保持渲染的线条。每次单击拖动并放开时,它都会正确地绘制线,如果您尝试绘制另一条线,它就会消失。这是我为输入侦听器编写的代码,它获取位置

  • 问题内容: 我建立了一个复合组件,看起来像这样: 组件正确显示当前标签。 现在,当执行该动作时,什么也不会发生。但是,当我将Postfix添加到组件中的ID时,它可以正常工作(请参见下文)。 并使用后缀在render中定义ID: 有人可以向我解释为什么仅当我在ID中添加后缀时才起作用吗? 问题答案: 这个问题实际上有两个方面。 第一个问题是,实际上指定复合部件的ID 本身 的。默认情况下,HTML

  • 使用ARCore/SceneFormAPI,我需要访问一个可呈现的特定子网格,但找不到实现的方法。 我想知道这个功能是不是通过RenderableDefinition实现的,但是文档对这个主题是非常清楚的。 谢谢你抽出时间。