Установите изображение на плоскость в примере Sceneform Chromakey / Augmented image - PullRequest
0 голосов
/ 26 февраля 2019

Я скомбинировал пример Chromakey и дополненного изображения из Sceneform, чтобы обнаружить изображения и заменить их видео.Это работает довольно хорошо.Теперь я хотел бы сделать то же самое с изображением вместо видео.Как мне это сделать?

Код для замены:

 private void handleVideo(AugmentedImage image, ARData data) {
    Vector3 localPosition = new Vector3();
    setAnchor(image.createAnchor(image.getCenterPose()));

    localPosition.set(image.getExtentX(), 0.0f, image.getExtentZ());

    ExternalTexture texture = new ExternalTexture();

    // #1
    mediaPlayer = MediaPlayer.create(myContext, fileUrl );
    mediaPlayer.setSurface(texture.getSurface());
    mediaPlayer.setLooping(true);
    //#2

    ModelRenderable.builder()
            .setSource(myContext, R.raw.my_chroma_key_video)
            .build()
            .thenAccept(
                    renderable -> {
                        videoRenderable = renderable;
                        renderable.getMaterial().setExternalTexture("videoTexture", texture);
                        renderable.getMaterial().setFloat4("keyColor", CHROMA_KEY_COLOR);
                        renderable.getMaterial().setBoolean("disableChromaKey", false);

                    })
            .exceptionally(
                    throwable -> {
                        Toast toast = Toast.makeText(myContext, "Unable to load video renderable", Toast.LENGTH_LONG);
                        toast.setGravity(Gravity.CENTER, 0, 0);
                        toast.show();
                        return null;
                    });

    Anchor anchor = image.createAnchor(image.getCenterPose());
    AnchorNode anchorNode = new AnchorNode(anchor);
    anchorNode.setParent(arFragment.getArSceneView().getScene());

    Node videoNode = new Node();
    videoNode.setParent(anchorNode);
    float videoWidth = mediaPlayer.getVideoWidth();
    float videoHeight = mediaPlayer.getVideoHeight();
    float myWidth = Float.valueOf(String.valueOf(data.width));
    float VIDEO_HEIGHT_METERS = (videoHeight/videoWidth)* myWidth;

    localPosition.x = 0;
    localPosition.y = 0;//VIDEO_HEIGHT_METERS /2;
    localPosition.z = VIDEO_HEIGHT_METERS/2;
    videoNode.setLocalPosition(localPosition);
    videoNode.setLocalScale(
            new Vector3(VIDEO_HEIGHT_METERS * (videoWidth / videoHeight), VIDEO_HEIGHT_METERS, 1.0f)
    );

    Quaternion localRotation = videoNode.getLocalRotation();
    localRotation.x -= Math.PI / 4;
    videoNode.setLocalRotation(localRotation);


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

Если мое мышление верное, мне нужно будет заменить код между "# 1" и "# 2" на что-топодходит для изображений, но я не могу ничего найти.

1 Ответ

0 голосов
/ 26 июля 2019

(извините за публикацию таких подробностей в ответе, а не в разделе комментариев, но у меня недостаточно репутации, чтобы оставлять комментарии), позвольте мне рассказать вам, что я понял из вашего описания.«1. Вы хотите обнаружить изображения (маркер)» «2. Когда изображение обнаружено, вы хотите показать изображение поверх обнаруженного изображения маркера».

Если я правильно понял, то выможно добиться этого с помощью ViewRenderable.

Bitmap image; // load bitmap, from resources or URL
/* ... 
   ...{whatever}
   ...
*/

private void createModel(Anchor anchor) {
        LayoutInflater inflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE);
        View view = inflater.inflate(R.layout.image_view, null);
        ImageView imageView = view.findViewById(R.id.imageView);
        imageView.setImageBitmap(image);
        ViewRenderable.builder()
                .setView(this, view).build()
                .thenAccept(modelRenderable -> {
                    placeModel(anchor, modelRenderable);
                });
    }

    private void placeModel(Anchor anchor, ViewRenderable modelRenderable) {
        AnchorNode anchorNode = new AnchorNode(anchor);
        anchorNode.setRenderable(modelRenderable);
        anchorNode.setParent(arFragment.getArSceneView().getScene());
        arFragment.getArSceneView().getScene().addChild(anchorNode);
    }

и назвать это createModel(anchor) после Anchor anchor = image.createAnchor(image.getCenterPose());

...