我正在使用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);
}
});
有什么方法可以实现此功能?
答案 0 :(得分:0)
下面的代码应该可以检测到触摸并删除节点。
如果您希望有一个单独的按钮来删除所选节点,则可以添加常规按钮和侦听器,只需使用'touch'事件选择要删除的节点即可。
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);
hitNode.getAnchor().detach();
hitNode.setParent(null);
hitNode = null;
}
}
}
答案 1 :(得分:0)
我知道我迟到了,但这可能对某人有帮助。
这是可用于选择和删除节点的代码。
transformableNode.setParent(anchorNode );
transformableNode.setRenderable(model_nodeRenderable);
transformableNode.select();
transformableNode.setOnTapListener((HitTestResult hitTestResult, MotionEvent Event) ->
{
Node nodeToRemove = hitTestResult.getNode();
anchorNode.removeChild(nodeToRemove );
});