ARCORE:通过单击此可渲染对象移除特定可渲染对象
ARCORE: remove a specific renderable by clicking on this renderable
我正在使用 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);
}
});
有什么方法可以实现这个功能吗?
下面的代码应该检测触摸并删除节点。
如果您想要一个单独的按钮来删除 selected 节点,您可以添加一个常规按钮和侦听器,只需将 'touch' 事件用于 select 您要删除的节点想删除。
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
更新 - 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
}
我知道我迟到了,但这可能对某人有帮助。
- 您要删除的节点,首先您必须 select 通过单击或触摸该 可转移节点 该节点。
- TransfarableNode.setOnTapListener 这个内置方法为我们服务。
- 之后从 HitTestResult 获取节点然后分离节点。
这是您可以用于 select 创建和删除节点的代码。
transformableNode.setParent(anchorNode );
transformableNode.setRenderable(model_nodeRenderable);
transformableNode.select();
transformableNode.setOnTapListener((HitTestResult hitTestResult, MotionEvent Event) ->
{
Node nodeToRemove = hitTestResult.getNode();
anchorNode.removeChild(nodeToRemove );
});
我正在使用 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);
}
});
有什么方法可以实现这个功能吗?
下面的代码应该检测触摸并删除节点。
如果您想要一个单独的按钮来删除 selected 节点,您可以添加一个常规按钮和侦听器,只需将 'touch' 事件用于 select 您要删除的节点想删除。
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
更新 - 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
}
我知道我迟到了,但这可能对某人有帮助。
- 您要删除的节点,首先您必须 select 通过单击或触摸该 可转移节点 该节点。
- TransfarableNode.setOnTapListener 这个内置方法为我们服务。
- 之后从 HitTestResult 获取节点然后分离节点。
这是您可以用于 select 创建和删除节点的代码。
transformableNode.setParent(anchorNode );
transformableNode.setRenderable(model_nodeRenderable);
transformableNode.select();
transformableNode.setOnTapListener((HitTestResult hitTestResult, MotionEvent Event) ->
{
Node nodeToRemove = hitTestResult.getNode();
anchorNode.removeChild(nodeToRemove );
});