Сделайте снимок экрана до того, как будет показана любая модель ARCore - PullRequest
1 голос
/ 05 мая 2019

Я использую код Снимка экрана, чтобы сделать снимок экрана, который работает нормально, но он также использует и модели дуги.Есть ли способ сделать скриншот до того, как модели будут отображены?

Я попытался SetActive(false), затем сделать снимок экрана, затем SetActive(true), он работает, но есть заметная разница, т.е. модель исчезает, а не появляется снова.

Обновление: это сценарий, примененный к ScreenShotCameraи он обновляется после удаления всех ошибок (благодаря @Shingo), не стесняйтесь использовать его, он работает правильно

using GoogleARCore;
using OpenCVForUnitySample;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.XR;

[RequireComponent(typeof(Camera))]
public class SnapshotCamera : MonoBehaviour
{
    Camera snapCam;
    public UnityEngine.UI.Text text;
    public RenderTexture mRenderTexture;
    int resWidth=480;
    int resHeight=800;

    // Start is called before the first frame update
    public void initialize(ARBackgroundRenderer background, Material material)
    {
        background = new ARBackgroundRenderer();
        snapCam = GetComponent<Camera>();
        background.backgroundMaterial = material;
        background.camera = snapCam;
        background.mode = ARRenderMode.MaterialAsBackground;
        if (snapCam.targetTexture == null)
        {
            snapCam.targetTexture = new RenderTexture(resWidth, resHeight, 24);
        }
        else
        {
            snapCam.targetTexture.height = resHeight;
            snapCam.targetTexture.width = resWidth;
            //resHeight = snapCam.targetTexture.height;
            //resWidth = snapCam.targetTexture.width;
        }
        background.camera.cullingMask = LayerMask.NameToLayer("Default");
        //snapCam.CopyFrom(background.camera);

        snapCam.gameObject.SetActive(false);
    }

    public void TakeSnapShot()
    {
        snapCam.gameObject.SetActive(true);
    }

    void LateUpdate()
    {
        if (snapCam.gameObject.activeInHierarchy)
        {
            snapCam.cullingMask = LayerMask.NameToLayer("Default");
            if (ARCoreBackgroundRenderer.screenShot == null)
                ARCoreBackgroundRenderer.screenShot = new Texture2D(resWidth, resHeight, TextureFormat.RGB24, false);
            snapCam.Render();
            RenderTexture.active = snapCam.targetTexture;
            ARCoreBackgroundRenderer.screenShot.ReadPixels(new Rect(0, 0, resWidth, resHeight), 0, 0);
            ARCoreBackgroundRenderer.screenShot.Apply();

            snapCam.gameObject.SetActive(false);
            HandPoseRecognition.captureTexture = false;

            //string name = string.Format("{0}_Capture{1}_{2}.png", Application.productName, "{0}", System.DateTime.Now.ToString("yyyy-MM-dd_HH-mm-ss"));
            //UnityEngine.Debug.Log("Permission result: " + NativeGallery.SaveImageToGallery(ARCoreBackgroundRenderer.screenShot, Application.productName + " Captures", name));
        }
    }
}

Возможно, я был немного двусмысленным, то, что вы упомянули в комментарии, уже решеноспасибо тебе но проблема сейчас есть.Я покажу вам изображения: Это две камеры, которые у меня есть: enter image description here

Это то, что показывает моя главная (камера ARCore)

enter image description here

И это то, что (ScreenShot Camera) показывает enter image description here

1 Ответ

1 голос
/ 05 мая 2019

Вы можете использовать слой, поместить все модели дуг в один слой (например, ARLAYER), а затем установить маску отбраковки камеры, чтобы избежать этих моделей.

Псевдокод:

// Set models' layer
foreach (GameObject arcoreModel in arcoreModels)
     arcoreModel.layer = ARLAYER;

// Set camera's culling mask
camera.cullingMask = ~(1 << ARLAYER);
camera.Render();

Создание снимка экрана камеры с другой камеры

var go = new GameObject("screenshotcamera");
// Copy transform
go.transform.position = mainCamera.transform.position.
...
// Copy camera
var screenshotcamera= go.AddComopnent<Camera>();
screenshotcamera.CopyFrom(mainCamera);

Обновление с помощью сценария

snapCam = GetComponent<Camera>();

screenshot

...