如何删除放置在 AR 屏幕上的 3d 对象
How to Remove 3d objects which are placed on AR Screen
我有一个 AR 屏幕,我在其中放置了一些 3d 对象。我正在使用 google AR Core 和 android SDK。
我需要通过单击清除按钮从场景中删除这些对象。
我能够移除最后放置的对象。但是其他对象没有移除。
这是我正在使用的代码。
if (newAnchor != null) {
arFragment.getArSceneView().getScene().removeChild(newAnchor);
newAnchor.getAnchor().detach();
如果您需要清理场景,可以执行以下操作:
arSceneView.getScene().callOnHierarchy(node -> {
node.setParent(null);
if (node instanceof AnchorNode) {
((AnchorNode) node).getAnchor().detach();
}
}
您可以像这样检测用户是否点击了特定节点 - 在此示例中,检查是查看点击节点是否是 'Andy' 可渲染的,即默认示例可使用 Sceneform 渲染:
private void handleOnTouch(HitTestResult hitTestResult, MotionEvent motionEvent) {
Log.d(TAG,"handleOnTouch");
// First call ArFragment's listener to handle TransformableNodes.
arFragment.onPeekTouch(hitTestResult, motionEvent);
// 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) {
//DO whatever you need to here...
}
return;
你可以像这样删除一个节点:
private void removeAnchorNode(AnchorNode nodeToremove) {
//Remove an anchor node
if (nodeToremove != null) {
arFragment.getArSceneView().getScene().removeChild(nodeToremove);
anchorNodeList.remove(nodeToremove);
nodeToremove.getAnchor().detach();
nodeToremove.setParent(null);
nodeToremove = null;
} else {
//Handle error case here
}
}
此处提供完整代码:https://github.com/mickod/LineView - 以上是经过编辑的摘录。
您可以使用下面的代码
从场景表单中分离 android 模型
List<Node> children = new ArrayList<>(arFragment.getArSceneView().getScene().getChildren());
for (Node node : children) {
if (node instanceof AnchorNode) {
if (((AnchorNode) node).getAnchor() != null) {
((AnchorNode) node).getAnchor().detach();
}
}
if (!(node instanceof Camera) && !(node instanceof Sun)) {
node.setParent(null);
}
}
我有一个 AR 屏幕,我在其中放置了一些 3d 对象。我正在使用 google AR Core 和 android SDK。
我需要通过单击清除按钮从场景中删除这些对象。
我能够移除最后放置的对象。但是其他对象没有移除。
这是我正在使用的代码。
if (newAnchor != null) {
arFragment.getArSceneView().getScene().removeChild(newAnchor);
newAnchor.getAnchor().detach();
如果您需要清理场景,可以执行以下操作:
arSceneView.getScene().callOnHierarchy(node -> {
node.setParent(null);
if (node instanceof AnchorNode) {
((AnchorNode) node).getAnchor().detach();
}
}
您可以像这样检测用户是否点击了特定节点 - 在此示例中,检查是查看点击节点是否是 'Andy' 可渲染的,即默认示例可使用 Sceneform 渲染:
private void handleOnTouch(HitTestResult hitTestResult, MotionEvent motionEvent) {
Log.d(TAG,"handleOnTouch");
// First call ArFragment's listener to handle TransformableNodes.
arFragment.onPeekTouch(hitTestResult, motionEvent);
// 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) {
//DO whatever you need to here...
}
return;
你可以像这样删除一个节点:
private void removeAnchorNode(AnchorNode nodeToremove) {
//Remove an anchor node
if (nodeToremove != null) {
arFragment.getArSceneView().getScene().removeChild(nodeToremove);
anchorNodeList.remove(nodeToremove);
nodeToremove.getAnchor().detach();
nodeToremove.setParent(null);
nodeToremove = null;
} else {
//Handle error case here
}
}
此处提供完整代码:https://github.com/mickod/LineView - 以上是经过编辑的摘录。
您可以使用下面的代码
从场景表单中分离 android 模型 List<Node> children = new ArrayList<>(arFragment.getArSceneView().getScene().getChildren());
for (Node node : children) {
if (node instanceof AnchorNode) {
if (((AnchorNode) node).getAnchor() != null) {
((AnchorNode) node).getAnchor().detach();
}
}
if (!(node instanceof Camera) && !(node instanceof Sun)) {
node.setParent(null);
}
}