首页 > 解决方案 > 使用场景形式在图像上渲染视频

问题描述

当它检测到图像时,我能够成功地在图像上渲染视频。问题是当我从那个地方删除图像时,视频仍然继续显示在那个地方,而图像在那个地方不再存在。下面是我以前创建时的代码ARScene

  private fun createArScene() {
    // Create an ExternalTexture for displaying the contents of the video.
    externalTexture = ExternalTexture().also {
        mediaPlayer.setSurface(it.surface)
    }

    // Create a renderable with a material that has a parameter of type 'samplerExternal' so that
    // it can display an ExternalTexture.
    ModelRenderable.builder()
        .setSource(requireContext(), R.raw.augmented_video_model)
        .build()
        .thenAccept { renderable ->
            videoRenderable = renderable
            renderable.isShadowCaster = false
            renderable.isShadowReceiver = false
            renderable.material.setExternalTexture("videoTexture", externalTexture)
        }
        .exceptionally { throwable ->
            Log.e(TAG, "Could not create ModelRenderable", throwable)
            return@exceptionally null
        }

    videoAnchorNode = VideoAnchorNode().apply {
        setParent(arSceneView.scene)
    }
  }

更新监听器

    override fun onUpdate(frameTime: FrameTime) {


    val frame = arSceneView.arFrame


    if (frame == null || frame.camera.trackingState != TrackingState.TRACKING) {
        return
    }

    val updatedAugmentedImages = frame.getUpdatedTrackables(AugmentedImage::class.java)
    for (augmentedImage in updatedAugmentedImages) {
        if (activeAugmentedImage != augmentedImage && augmentedImage.trackingState == TrackingState.TRACKING) {
            try {
                dismissArVideo()
                playbackArVideo(augmentedImage)
                break
            } catch (e: Exception) {
                Log.e(TAG, "Could not play video [${augmentedImage.name}]", e)
            }
        }
    }


}

所以我认为我需要继续检查 externalTexture 对象,但问题是我的系统如何知道我不再关注图像。这样我就可以杀了它

标签: androidopengl-esarcoresceneform

解决方案


在更新侦听器上,您可以像下面这样跟踪图像,

Frame frame = arFragment.getArSceneView().getArFrame();
    Collection<AugmentedImage> augmentedImages = 
frame.getUpdatedTrackables((AugmentedImage.class));
    for (AugmentedImage image: augmentedImages){
        if(image.getTrackingState() == TrackingState.TRACKING){
            if(image.getName().equals("image")){

                isImageDetected = true;

                playVideo(image.createAnchor(image.getCenterPose()), 
image.getExtentX(), image.getExtentZ());
                break;
            }
        }
    }

您可以查看 STOPPED、PAUSED 和 TACKING 等跟踪状态


推荐阅读