I'm creating an app on augmented reality by using ARCore sceneform where i have multiple objects in a list coming from server and placing those models on a plane (achieved). Now i want to delete a specific model placed on plane. when i every i try to delete a model i always delete last placed model instead to selected model.
how to get selected specific node of a model and delete that model.
how to restrict the duplication of the models so it spawns only once regardless of number of taps
arFragment.setOnTapArPlaneListener((hitResult,plane, motionEvent) -> { placeModel(hitResult.createAnchor()); });
//placing AR model
private void placeModel(Anchor anchor) {
ModelRenderable.builder()
.setSource(ARScreenActivity.this, RenderableSource.builder()
.setSource(ARScreenActivity.this,
Uri.parse(ar_preview_model.trim()),
RenderableSource.SourceType.GLB)
.setScale(0.05f)
.setRecenterMode(RenderableSource.RecenterMode.ROOT)
.build()
)
.setRegistryId(ar_preview_model.trim())
.build()
.thenAccept(modelRenderable -> addNoteToScene(modelRenderable, anchor))
.exceptionally(throwable -> {
AlertDialog.Builder builder = new AlertDialog.Builder(ARScreenActivity.this);
builder.setMessage(throwable.getMessage()).show();
return null;
});
}
private void addNoteToScene(ModelRenderable modelRenderable, Anchor anchor) {
anchorNode = new AnchorNode(anchor);
//anchorNode.setRenderable(modelRenderable);
anchorNode.setParent(arFragment.getArSceneView().getScene());
// arFragment.getArSceneView().getScene().addChild(anchorNode);
// Create the transformable andy and add it to the anchor.
node = new TransformableNode(arFragment.getTransformationSystem());
// Node node = new Node();
// getCardPosition(node);
//set rotation in direction (x,y,z) in degrees 90
node.setLocalRotation(Quaternion.axisAngle(new Vector3(0f, 90f, 0f), 0f));
node.setLocalScale(new Vector3(x_axis, y_axis, z_axis));
node.setParent(anchorNode);
node.setRenderable(modelRenderable);
}
// deleting form the list
private void deleteSpecificProduct() {
JSONObject params = new JSONObject();
try {
params.put("Product", modelId);
} catch (JSONException e) {
e.getMessage();
}
WebServiceFactory.getInstance().removePreview(params.toString()).enqueue(new Callback<RemovePreview>() {
@Override
public void onResponse(Call<RemovePreview> call, Response<RemovePreview> response) {
if (response.body().getStatus() == 1) {
arObjectImageAdapter.notifyItemRemoved(positionForDeletion);
arObjectImageAdapter.notifyDataSetChanged();
removeARObject(anchorNode);
} else {
finish();
productImageRecyclercview.setVisibility(View.GONE);
}
}
@Override
public void onFailure(Call<RemovePreview> call, Throwable t) {
}
});
}
////delete Specific model but delete always last placed model
private void removeARObject(Node nodeRemove) {
if(nodeRemove instanceof AnchorNode){
if(((AnchorNode)nodeRemove).getAnchor() != null) {
((AnchorNode) nodeRemove).getAnchor().detach();
}
}
if (!(nodeRemove instanceof Camera) && !(nodeRemove instanceof Sun)) {
nodeRemove.setParent(null);
}
//Remove an anchor node
/*if (anchorNode != null) {
arFragment.getArSceneView().getScene().removeChild(anchorNode);
anchorNode.getAnchor().detach();
anchorNode.setParent(null);
anchorNode = null;
getPreviewData();
}
*/
/*
transformableNode.setParent(anchorNode );
transformableNode.setRenderable(anchorNode.getRenderable());
transformableNode.select();
transformableNode.setOnTapListener((HitTestResult hitTestResult, MotionEvent Event) ->
{
Node nodeToRemove = hitTestResult.getNode();
anchorNode.removeChild(nodeToRemove );
});
*/
}
// multi-AR models i have to restrict each of these models should be display at once only and want to get node of these models
