Java 如何在Achor上一次只显示一个AR对象?

Java 如何在Achor上一次只显示一个AR对象?,java,android,arcore,Java,Android,Arcore,我想在achor上一次只显示一个对象。目前,我正在运行时从服务器获取AR模型,并显示我的模型。当我每次点击锚销点时,我得到了新的AR模型,所以我必须在一些点击后点击多个模型(等于点击的数量)。我想立刻限制模型。每次用户点击屏幕时,ar模型总是一次只显示一个对象 public class ARObjectActivity extends AppCompatActivity { private ArFragment arFragment; private String Asset_3D = "

我想在achor上一次只显示一个对象。目前,我正在运行时从服务器获取AR模型,并显示我的模型。当我每次点击锚销点时,我得到了新的AR模型,所以我必须在一些点击后点击多个模型(等于点击的数量)。我想立刻限制模型。每次用户点击屏幕时,ar模型总是一次只显示一个对象

public class ARObjectActivity extends AppCompatActivity {



private ArFragment arFragment;
private String Asset_3D = "";
String imageUri;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_a_r_object);

    arFragment=(ArFragment) getSupportFragmentManager().findFragmentById(R.id.arFragment);

    Intent intent = getIntent();
    imageUri = intent.getStringExtra("arImageUri");


    arFragment.setOnTapArPlaneListener((hitResult, plane, motionEvent) ->
            placeModel(hitResult.createAnchor()));


}

private void placeModel(Anchor anchor) {

            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {

                        ModelRenderable.builder()
                                .setSource(ARObjectActivity.this, RenderableSource.builder()
                                        .setSource(ARObjectActivity.this, Uri.parse(imageUri),
                                                RenderableSource.SourceType.GLTF2)
                                        .setScale(0.5f)
                                        .setRecenterMode(RenderableSource.RecenterMode.ROOT)
                                        .build()
                                )
                                .setRegistryId(Asset_3D)
                                .build()
                                .thenAccept(modelRenderable -> addNoteToScene(modelRenderable,anchor))
                                .exceptionally(throwable -> {
                                    AlertDialog.Builder builder = new AlertDialog.Builder(ARObjectActivity.this);
                                    builder.setMessage(throwable.getMessage()).show();
                                    return null;

                                });



            }


}

private void addNoteToScene(ModelRenderable modelRenderable, Anchor anchor) {

    AnchorNode 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.
    TransformableNode node = new TransformableNode(arFragment.getTransformationSystem());

    //set rotation in direction (x,y,z) in degrees 90
    node.setLocalRotation(Quaternion.axisAngle(new Vector3(1f, 1f, 1f), 90f));

    node.setParent(anchorNode);
    node.setRenderable(modelRenderable);
    node.select();



}
}
添加此新方法

private void clearAllModel() {
    List<Node> children = new ArrayList<Node>(arFragment.getArSceneView().getScene().getChildren());
    for (Node node : children) {
        if (node instanceof AnchorNode) {
            AnchorNode tmp = (AnchorNode) node;
            if (tmp.getAnchor() != null) {
                tmp.getAnchor().detach();
            }
        }
    }
}

说明:

如您所见,每次点击并调用
placeModel
进入
addnotetosene
时,都会出现这一行代码

anchorNode.setParent(arFragment.getArSceneView().getScene());
您的所有现有模型(位于anchorNode上)都作为子对象位于此
arFragment.getArSceneView().getScene()

根据我的方法建议,第一次有0个子项(null)。因此,它将继续前进,只需执行
placeModel
,然后它就有了一个子项。
第二次,它删除该1个子项,然后再次调用
placeModel
,并使其再次成为1个子项。等等因此,将只有一个子对象(模型)

谢谢,伙计,我有一个问题,那就是当用户单击时,我的模型会重新渲染,而我的对象会覆盖另一个对象?谢谢,伙计,它工作得很好:*你节省了我很多时间,:)我真的不确定是否要重新渲染。但对于对象,我认为它不会覆盖
detach()
方法再次将其从会话@AhsanSyedthanks中删除。你不仅解决了我的问题,还解释了它
anchorNode.setParent(arFragment.getArSceneView().getScene());