ARCore дополненное изображение видео дисплей - PullRequest
0 голосов
/ 09 ноября 2019

Я пытаюсь использовать ARCore для приложения дополненной реальности на Android, хочу показать видео при обнаружении изображения, приложение работает нормально, оно обнаруживает изображение, но не показывает видео, я использовал пример ChromaKeyв качестве руководства, и я не уверен, в чем проблема.

это новый метод моего приложения

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        arFragment = (CustomArFragment) getSupportFragmentManager().findFragmentById(R.id.ux_fragment);
        arFragment.getArSceneView().getScene().addOnUpdateListener(this);
        arFragment.getPlaneDiscoveryController().hide();

        texture = new ExternalTexture();

        mediaPlayer = MediaPlayer.create(this, R.raw.vid);
        mediaPlayer.setSurface(texture.getSurface());
    }

здесь я делаю расширенное распознавание изображений

public void onUpdate(FrameTime frameTime) {
        Frame frame = arFragment.getArSceneView().getArFrame();
        Collection<AugmentedImage> images = frame.getUpdatedTrackables(AugmentedImage.class);

            switch (augmentedImage.getTrackingState()) {
                case TRACKING:
                    switch (augmentedImage.getIndex()){
                        case 0:
                            System.out.println("@@@@@@@@@@@ "+bandera);
                            System.out.println("ODISH");
                            if(mediaPlayer.isPlaying()) {
                                mediaPlayer.pause();
                                mediaPlayer.seekTo(0);
                            }
                            if(bandera){
                                System.out.println("ENTRO ODISH");
                                if(anchorNode != null){
                                    arFragment.getArSceneView().getScene().removeChild(anchorNode);
                                    anchorNode.getAnchor().detach();
                                    anchorNode.setParent(null);
                                    anchorNode = null;
                                    anchor = null;
                                    bandera = false;
                                }
                            }
                            anchor = augmentedImage.createAnchor(augmentedImage.getCenterPose());
                            createModel(anchor,"odish.sfb");
                            break;
                        case 1:
                            System.out.println("******** "+bandera);
                            System.out.println("KUBONE");
                            if(mediaPlayer.isPlaying()) {
                                mediaPlayer.pause();
                                mediaPlayer.seekTo(0);
                            }
                            if(bandera){
                                System.out.println("ENTRO KUBONE");
                                if(anchorNode != null){
                                    arFragment.getArSceneView().getScene().removeChild(anchorNode);
                                    anchorNode.getAnchor().detach();
                                    anchorNode.setParent(null);
                                    anchorNode = null;
                                    anchor = null;
                                    bandera = false;
                                }
                            }
                            anchor = augmentedImage.createAnchor(augmentedImage.getCenterPose());
                            createModel(anchor,"kubone.sfb");
                            break;
                        case 2:
                            System.out.println("//////////"+bandera);
                            System.out.println("VIDEO");
                            if(bandera){
                                System.out.println("ENTRO VIDEO");
                                if(anchorNode != null){
                                    arFragment.getArSceneView().getScene().removeChild(anchorNode);
                                    anchorNode.getAnchor().detach();
                                    anchorNode.setParent(null);
                                    anchorNode = null;
                                    anchor = null;
                                    bandera = false;
                                }
                            }

                            anchor = augmentedImage.createAnchor(augmentedImage.getCenterPose());
                            createVideo(anchor);
                            break;
                        default:
                            arFragment.getArSceneView().getScene().removeChild(anchorNode);
                            anchorNode.getAnchor().detach();
                            anchorNode.setParent(null);
                            anchorNode = null;
                            anchor = null;
                            bandera = false;
                            mediaPlayer.stop();
                            break;
                    }
                    break;
            }
        }
    }

И наконец, это метод, который я использую, чтобы показать видео

private void createVideo(Anchor anchor) {
        ModelRenderable.builder()
                .setSource(this, R.raw.chroma_key_video)
                .build()
                .thenAccept(
                        renderable -> {
                            videoRenderable = renderable;
                            renderable.getMaterial().setExternalTexture("videoTexture", texture);
                            renderable.getMaterial().setFloat4("keyColor", CHROMA_KEY_COLOR);
                        })
                .exceptionally(
                        throwable -> {
                            Toast toast =
                                    Toast.makeText(this, "Unable to load video renderable", Toast.LENGTH_LONG);
                            toast.setGravity(Gravity.CENTER, 0, 0);
                            toast.show();
                            return null;
                        });

        anchorNode = new AnchorNode(anchor);
        anchorNode.setParent(arFragment.getArSceneView().getScene());

        videoNode = new Node();
        videoNode.setParent(anchorNode);

        System.out.println("\nVideo Height: "+mediaPlayer.getVideoHeight());
        System.out.println("\nVideo Width: "+mediaPlayer.getVideoWidth());

        float videoWidth = mediaPlayer.getVideoWidth();
        float videoHeight = mediaPlayer.getVideoHeight();
        videoNode.setLocalPosition(new Vector3());
        videoNode.setLocalScale(
                new Vector3(
                        VIDEO_HEIGHT_METERS * (videoWidth / videoHeight), VIDEO_HEIGHT_METERS, 1.0f));

        if (!mediaPlayer.isPlaying()) {
            mediaPlayer.start();
            texture
                    .getSurfaceTexture()
                    .setOnFrameAvailableListener(
                            (SurfaceTexture surfaceTexture) -> {
                                videoNode.setRenderable(videoRenderable);
                                texture.getSurfaceTexture().setOnFrameAvailableListener(null);
                            });
        }else{
            videoNode.setRenderable(videoRenderable);
        }
    }
...