Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Can I take a photo in Unity using the device's camera?

Tags:

I'm entirely unfamiliar with Unity3D's more complex feature set and am curious if it has the capability to take a picture and then manipulate it. Specifically my desire is to have the user take a selfie and then have them trace around their face to create a PNG that would then be texture mapped onto a model.

I know that the face mapping onto a model is simple, but I'm wondering if I need to write the photo/carving functionality into the encompassing Chrome app, or if it can all be done from within Unity. I don't need a tutorial on how to do it, just asking if it's something that is possible.

like image 932
Yevgeny Simkin Avatar asked Jun 30 '14 18:06

Yevgeny Simkin


People also ask

How do I switch to a different camera in Unity?

We first start by deciding on the condition we use to change the camera. For now we'll use Input buttons 1, 2 and 3 to switch between cameras. We go into Project Settings -> Input Manager and add three new items to the list, which we'll label Switch1, Switch2, and Switch3. Each correspond to the button on the keyboard.


1 Answers

Yes, this is possible. You will want to look at the WebCamTexture functionality.

You create a WebCamTexture and call its Play() function which starts the camera. WebCamTexture, as any Texture, allows you to get the pixels via a GetPixels() call. This allows you to take a snapshot in when you like, and you can save this in a Texture2D. A call to EncodeToPNG() and subsequent write to file should get you there.

Do note that the code below is a quick write-up based on the documentation. I have not tested it. You might have to select a correct device if there are more than one available.

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);     } } 
like image 164
Bart Avatar answered Feb 12 '23 17:02

Bart