我完全不熟悉Unity3D更复杂的功能集,如果它有能力拍照然后操作它,我很好奇。具体来说,我的愿望是让用户自拍,然后让他们在他们的脸上追踪以创建一个PNG,然后将纹理映射到模型上。
我知道将面部映射到模型上很简单,但我想知道是否需要将照片/雕刻功能写入包含在内的Chrome应用程序中,或者是否可以在Unity内完成。我不需要有关如何操作的教程,只是询问它是否可能。
答案 0 :(得分:21)
是的,这是可能的。您需要查看WebCamTexture功能。
您创建一个WebCamTexture并调用其启动摄像头的Play()功能。 WebCamTexture与任何纹理一样,允许您通过GetPixels()调用获取像素。这允许您在需要时拍摄快照,并且可以将其保存在Texture2D中。调用EncodeToPNG()并随后写入文件应该可以帮助您。
请注意,以下代码是基于文档的快速编写。我没有测试过。如果有多个可用设备,则可能必须选择正确的设备。
using UnityEngine;
using System.Collections;
using System.IO;
public class WebCamPhotoCamera : MonoBehaviour
{
WebCamTexture webCamTexture;
void Start()
{
webCamTexture = new WebCamTexture();
GetComponent<Renderer>().material.mainTexture = webCamTexture; //Add Mesh Renderer to the GameObject to which this script is attached to
webCamTexture.Play();
}
IEnumerator TakePhoto() // Start this Coroutine on some button click
{
// NOTE - you almost certainly have to do this here:
yield return new WaitForEndOfFrame();
// it's a rare case where the Unity doco is pretty clear,
// http://docs.unity3d.com/ScriptReference/WaitForEndOfFrame.html
// be sure to scroll down to the SECOND long example on that doco page
Texture2D photo = new Texture2D(webCamTexture.width, webCamTexture.height);
photo.SetPixels(webCamTexture.GetPixels());
photo.Apply();
//Encode to a PNG
byte[] bytes = photo.EncodeToPNG();
//Write out the PNG. Of course you have to substitute your_path for something sensible
File.WriteAllBytes(your_path + "photo.png", bytes);
}
}
答案 1 :(得分:7)
对于那些试图让相机渲染实时反馈的人来说,这就是我设法将其拉下来的方式。首先,我编辑了Bart的答案,因此纹理将在Update上分配,而不仅仅是在Start:
void Start()
{
webCamTexture = new WebCamTexture();
webCamTexture.Play();
}
void Update()
{
GetComponent<RawImage>().texture = webCamTexture;
}
然后我将脚本附加到带有RawImage组件的GameObject。您可以通过右键单击轻松创建一个 - &gt; UI - &gt; Unity Editor中层次结构中的RawImage(这需要Unity 4.6及更高版本)。运行它应该在您的视图中显示相机的实时馈送。在撰写本文时,Unity 5支持在Unity 5的免费个人版中使用网络摄像头。
我希望这有助于任何寻找在Unity中捕获实时相机Feed的好方法的人。
答案 2 :(得分:5)
有可能。我强烈建议您查看WebcamTexture Unity API。它有一些有用的功能:
答案 3 :(得分:4)
巴特的回答有必要的修改。我用他的代码和我得到的图片是黑色的。必要的修改是我们必须的 将TakePhoto转换为协程并添加
yield return new WaitForEndOfFrame();
在Coroutine开始时。 (Courtsey @fafase)
有关详细信息,请参阅
http://docs.unity3d.com/ScriptReference/WaitForEndOfFrame.html
您也可以参考
答案 4 :(得分:0)
此类功能可以使用一个名为Camera Capture Kit的插件 - https://www.assetstore.unity3d.com/en/#!/content/56673,虽然提供的功能适用于移动设备,但它包含了如何使用WebCamTexture拍摄静止图像的演示。< / p>
答案 5 :(得分:0)
是的,可以。我创建了Android Native camera插件,可以打开Android设备的摄像头,捕获图像,录制视频并将其保存到设备的所需位置,只需几行代码。
答案 6 :(得分:0)
如果您不想使用第三方插件就可以这样做,那么@FuntionR解决方案将为您提供帮助。但是,如果要将捕获的照片保存到图库(Android和iOS)中,则不可能统一使用,必须编写本机代码才能将照片传输到图库,然后从统一位置调用它。
这是一个摘要博客,它将指导您实现目标。 http://unitydevelopers.blogspot.com/2018/07/pick-image-from-gallery-in-unity3d.html
编辑:请注意,以上线程描述了从图库中拾取图像,但是将图像保存到图库的过程相同。