Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unity3d 在渲染任何ARCore模型之前拍摄屏幕截图_Unity3d_Augmented Reality_Arcore - Fatal编程技术网

Unity3d 在渲染任何ARCore模型之前拍摄屏幕截图

Unity3d 在渲染任何ARCore模型之前拍摄屏幕截图,unity3d,augmented-reality,arcore,Unity3d,Augmented Reality,Arcore,我用截图代码拍摄了一张屏幕截图,这张截图很好用,但同时也拍摄了arcore模型。有没有办法在渲染模型之前拍摄屏幕截图 我尝试了SetActive(false)然后截图SetActive(true),它确实有效,但有一个明显的区别,即模型消失而不是重新出现 更新:这是一个应用在ScreenShotCamera上的脚本,在删除所有bug后进行更新(感谢@Shingo),请随意使用,它工作正常 使用GoogleARCore; 使用OpenCVForUnitySample; 使用系统集合; 使用Syst

我用截图代码拍摄了一张屏幕截图,这张截图很好用,但同时也拍摄了arcore模型。有没有办法在渲染模型之前拍摄屏幕截图

我尝试了
SetActive(false)
然后截图
SetActive(true)
,它确实有效,但有一个明显的区别,即模型消失而不是重新出现

更新:这是一个应用在ScreenShotCamera上的脚本,在删除所有bug后进行更新(感谢@Shingo),请随意使用,它工作正常
使用GoogleARCore;
使用OpenCVForUnitySample;
使用系统集合;
使用System.Collections.Generic;
使用UnityEngine;
使用UnityEngine.XR;
[所需组件(摄像机类型))]
公共级快照相机:单镜头
{
摄像机;
公共UnityEngine.UI.Text文本;
公共渲染器mRenderTexture;
int resWidth=480;
int resHeight=800;
//在第一帧更新之前调用Start
公共void初始化(ARBackgroundRenderer背景、材质)
{
背景=新的ARBackgroundRenderer();
snapCam=GetComponent();
background.backgroundMaterial=材料;
background.camera=snapCam;
background.mode=ARRenderMode.materialsalbackground;
如果(snapCam.targetTexture==null)
{
snapCam.targetTexture=新渲染器(resWidth,resHeight,24);
}
其他的
{
snapCam.targetTexture.height=resHeight;
snapCam.targetTexture.width=resWidth;
//resHeight=snapCam.targetTexture.height;
//resWidth=snapCam.targetTexture.width;
}
background.camera.cullingMask=LayerMask.NameToLayer(“默认”);
//snapCam.CopyFrom(background.camera);
snapCam.gameObject.SetActive(false);
}
公共快照()
{
snapCam.gameObject.SetActive(true);
}
void LateUpdate()
{
if(snapCam.gameObject.activeInHierarchy)
{
snapCam.cullingMask=LayerMask.NameToLayer(“默认”);
if(ARCoreBackgroundRenderer.screenShot==null)
ARCoreBackgroundRenderer.screenShot=新纹理2D(resWidth、resHeight、TextureFormat.RGB24、false);
snapCam.Render();
RenderTexture.active=snapCam.targetTexture;
ARCoreBackgroundRenderer.screenShot.ReadPixels(新的Rect(0,0,resWidth,resHeight),0,0);
ARCoreBackgroundRenderer.screenShot.Apply();
snapCam.gameObject.SetActive(false);
handposereecognition.captureTexture=false;
//string name=string.Format(“{0}_-Capture{1}{2}.png”,Application.productName,“{0}”,System.DateTime.Now.ToString(“yyyyy-MM-dd_HH-MM-ss”);
//UnityEngine.Debug.Log(“权限结果:+NativeGallery.SaveImageToGallery(ARCoreBackgroundRenderer.screenShot,Application.productName+“捕获”,名称));
}
}
}
也许我有点模棱两可,你在评论中提到的问题已经解决了,多亏了你,但现在的问题是。 我将向您展示这些图像: 这是我的两个摄像头:

这是我的主摄像头(ARCore摄像头)显示的内容

这就是(屏幕截图相机)显示的内容

您可以使用图层,将每个arcore模型放在一个图层中(例如ARLAYER),然后设置相机的剔除遮罩以避免这些模型

伪代码:

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

// Set camera's culling mask
camera.cullingMask = ~(1 << ARLAYER);
camera.Render();
//设置模型层
foreach(arcoreModels中的游戏对象arcoreModel)
arcoreModel.layer=ARLAYER;
//设置相机的消隐遮罩

camera.cullingMask=~(1)请发布您的代码。您可以创建一个专用摄像头来拍摄屏幕截图,查看更新。我不确定您尝试了什么代码,如果您尝试了我答案中的所有代码,它应该可以工作。主摄像头可以看到每一层,而屏幕截图摄像头无法看到模型。请查看示例,并将您的帖子更新为最新的修改版本?我看到第二张图片中只有一个模型,因此如果需要将其从屏幕截图相机中排除,则不会留下任何东西(设备相机中的图像除外)。因此,如果要使用unity拍照,请查看unity文档中的
WebCamTexture
ARBackgroundRenderer
// 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>();