Как изменить 3d модель на сцене с помощью arcore и sceneform - PullRequest
0 голосов
/ 05 февраля 2020

У меня есть приложение, которое при обнаружении изображения помещает 3d-модель, но когда я изменяю изображение, чтобы обнаружить его, не меняю отображаемую модель, я не работаю над ним, но не могу найти ответ.

Это классы java, которые я использую в своем приложении android.

MainActivity

public class MainActivity extends AppCompatActivity {

    private final Map<AugmentedImage, AugmentedImageNode> augmentedImageMap = new HashMap<>();
    private ArFragment arFragment;
    private AugmentedImageNode node;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        arFragment = (ArFragment) getSupportFragmentManager().findFragmentById(R.id.ux_fragment);
        arFragment.getArSceneView().getScene().addOnUpdateListener(this::onUpdateFrame);
    }

    private void onUpdateFrame(FrameTime frameTime) {

        Frame frame = arFragment.getArSceneView().getArFrame();

        // If there is no frame, just return.
        if (frame == null) {
            return;
        }

        Collection<AugmentedImage> updatedAugmentedImages =
                frame.getUpdatedTrackables(AugmentedImage.class);

        for (AugmentedImage augmentedImage : updatedAugmentedImages) {
            switch (augmentedImage.getTrackingState()) {
                case PAUSED:
                    Toast toast = Toast.makeText(this,
                            "Imagen detectada: " + augmentedImage.getName(), Toast.LENGTH_SHORT);
                    toast.show();
                    break;

                case TRACKING:
                    switch (augmentedImage.getIndex()) {

                        case 0://MODELO 3D
                            node = new AugmentedImageNode(this);
                            node.setImage(augmentedImage, "kubone.sfb");
                            augmentedImageMap.put(augmentedImage, node);
                            arFragment.getArSceneView().getScene().addChild(node);
                            break;

                        case 1://MODELO 3D
                            if (node != null)
                                node = new AugmentedImageNode(this);
                            node.setImage(augmentedImage, "mew.sfb");
                            augmentedImageMap.put(augmentedImage, node);
                            arFragment.getArSceneView().getScene().addChild(node);
                            break;

                    }
                    break;

                case STOPPED:
                    System.out.println("!!!STOPPED!!!");
                    augmentedImageMap.remove(augmentedImage);
                    break;
            }
        }

    }
}

AugmentedImageNode

@SuppressWarnings({"AndroidApiChecker"})
public class AugmentedImageNode extends AnchorNode {

    private static CompletableFuture<ModelRenderable> kubone;
    private static CompletableFuture<ModelRenderable> mew;
    private AugmentedImage image;

    public AugmentedImageNode(Context context) {
        kubone = ModelRenderable.builder().setSource(context, Uri.parse("kubone.sfb")).build();
        mew = ModelRenderable.builder().setSource(context, Uri.parse("mew.sfb")).build();

    }

    @SuppressWarnings({"AndroidApiChecker", "FutureReturnValueIgnored"})
    public void setImage(AugmentedImage image, String modelo) {
        this.image = image;
        if (!kubone.isDone() || !mew.isDone()) {
            CompletableFuture.allOf(kubone, mew).thenAccept((Void aVoid) -> setImage(image,
                    modelo)).exceptionally(throwable -> {
                Log.e("ERROR", "Error al cargar ", throwable);
                return null;
            });
        }
        if (modelo.equalsIgnoreCase("kubone.sfb")) {
            setAnchor(image.createAnchor(image.getCenterPose()));
            Node nodo = new Node();
            nodo.setParent(this);
            nodo.setRenderable(kubone.getNow(null));

        }
        if (modelo.equalsIgnoreCase("mew.sfb")) {
            setAnchor(image.createAnchor(image.getCenterPose()));
            Node nodo = new Node();
            nodo.setParent(this);
            nodo.setRenderable(mew.getNow(null));
        }
    }

    public AugmentedImage getImage() {
        return image;
    }
}
...