【问题标题】:How to show only one AR object at a time on Achor?如何在 Anchor 上一次只显示一个 AR 对象?
【发布时间】:2020-04-14 09:39:07
【问题描述】:

我想在一个锚点上一次只显示一个对象。目前我正在运行时从服务器获取我的 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();



}
}

【问题讨论】:

    标签: java android arcore


    【解决方案1】:

    添加这个新方法

    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();
                }
            }
        }
    }
    

    然后调用它

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


    说明:

    如您所见,每次点击并调用placeModeladdNoteToScene 时,都会出现这行代码

    anchorNode.setParent(arFragment.getArSceneView().getScene());
    

    您现有的所有模型(位于 anchorNode 上)都在这个 arFragment.getArSceneView().getScene() 下作为孩子

    按照我的方法建议,第一次有0个孩子(null)。所以它会继续前进,只做placeModel,然后它就有1个孩子。 第二次删除该 1 个孩子,并再次调用 placeModel,并再次使其成为 1 个孩子。依此类推……所以,只有 1 个孩子(模型)

    【讨论】:

    • 谢谢哥们,我有一个问题是当用户单击时我的模型重新渲染并且我的对象覆盖了另一个对象?
    • 谢谢哥们,它的作品完美:*你节省了我很多时间,:)
    • 我不太确定是否重新渲染。但对于我认为它不会覆盖的对象。 detach() 方法将其从会话中删除 ARCore Anchor Public Methods @AhsanSyed
    • 再次感谢好友。你不仅解决了我的问题还解释了它
    猜你喜欢
    • 2022-08-10
    • 1970-01-01
    • 2022-08-14
    • 2022-04-30
    • 1970-01-01
    • 2012-03-07
    • 2023-04-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多