How to get node of selected model placed on a plane and restrict model duplication in sceneform ARcore

Viewed 406

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.

  1. how to get selected specific node of a model and delete that model.

  2. 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 enter image description here

0 Answers
Related