Можно ли сделать фотографию в Unity с помощью камеры устройства?
Я совершенно не знаком с более сложным набором функций Unity3D, и мне любопытно, есть ли у него возможность сделать снимок, а затем манипулировать им. В частности, мое желание состоит в том, чтобы заставить пользователя взять себя в руки, а затем проследить их вокруг лица, чтобы создать PNG, который затем будет отображаться текстурой на модель.
Я знаю, что сопоставление лица на модели прост, но мне интересно, нужно ли мне писать функцию фото/резки в приложение Chrome, или все это можно сделать из Unity. Мне не нужен учебник о том, как это сделать, просто спрашивая, возможно ли это что-то, что возможно.
Ответы
Ответ 1
Да, это возможно Вы захотите взглянуть на функциональность 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 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);
}
}
Ответ 2
Для тех, кто пытается заставить камеру отображать живой канал, вот как мне удалось это сделать. Во-первых, я отредактировал ответ Барта, чтобы текстура была назначена на Update, а не только на Start:
void Start()
{
webCamTexture = new WebCamTexture();
webCamTexture.Play();
}
void Update()
{
GetComponent<RawImage>().texture = webCamTexture;
}
Затем я привязал script к GameObject с компонентом RawImage. Вы можете легко создать его правой кнопкой мыши → UI → RawImage в иерархии в редакторе Unity (для этого требуется Unity 4.6 и выше). Запуск должен показывать прямой канал камеры на ваш взгляд. На момент написания этой статьи Unity 5 поддерживает использование веб-камер в бесплатной личной версии Unity 5.
Я надеюсь, что это поможет любому, кто ищет хороший способ захватить канал живой камеры в Unity.
Ответ 3
Это возможно. Я настоятельно рекомендую вам ознакомиться с API-интерфейсом WebcamTexture Unity. Он имеет несколько полезных функций:
Ответ 4
Ответ Bart имеет требуемую модификацию. Я использовал его код, и фотография, которую я получал, была черной. Необходимая модификация заключается в том, что мы должны
конвертировать TakePhoto в сопрограмму и добавить
yield return new WaitForEndOfFrame();
в начале Coroutine. (Courtsey @fafase)
Подробнее см.
http://docs.unity3d.com/ScriptReference/WaitForEndOfFrame.html
Вы также можете обратиться к
Съемка с помощью веб-камеры дает черный выход [Unity3D]
Ответ 5
Существует плагин для этого типа функций под названием Camera Capture Kit - https://www.assetstore.unity3d.com/en/#!/content/56673, и при условии, что предоставленная функциональность предназначена для мобильных устройств содержит демонстрацию того, как вы можете использовать WebCamTexture для создания неподвижного изображения.
Ответ 6
Да, ты можешь. Я создал плагин Android Native camera, который может открывать камеру вашего устройства Android, захватывать изображения, записывать видео и сохранять их в нужном месте вашего устройства с помощью всего лишь нескольких строк кода.
Ответ 7
Если вы хотите сделать это без использования стороннего плагина, тогда вам поможет решение @FuntionR. Но если вы хотите сохранить захваченное фото в галерее (Android и iOS), то в рамках единства это невозможно, вам нужно написать собственный код, чтобы перенести фотографию в галерею, а затем вызвать его из единства.
Вот краткий блог, который поможет вам достичь вашей цели.
http://unitydevelopers.blogspot.com/2018/07/pick-image-from-gallery-in-unity3d.html
Изменение: Обратите внимание, что вышеупомянутая тема описывает выбор изображения из галереи, но тот же процесс будет для сохранения изображения в галерее.