2014-06-30 537 views
14

我完全不熟悉Unity3D的更復雜的功能集,並且很好奇它是否具備拍照然後操作它的功能。具體而言,我的願望是讓用戶拍攝自拍照,然後讓他們追蹤自己的臉部以創建PNG,然後將其紋理映射到模型上。我可以使用設備的相機在Unity中拍照嗎?

我知道模型上的臉部映射很簡單,但我想知道是否需要將照片/雕刻功能寫入包含Chrome的應用程序,或者是否可以在Unity中完成。我不需要關於如何去做的教程,只是問是否有可能。

+0

對於2016年這裏是如何做到這一點的全面解釋... http://answers.unity3d.com/questions/909967/getting-a-web-cam-to-play-on-ui-texture-image .html#answer-910020 *** CRITICAL *** ...按照鏈接獲取「魔術」代碼,以便在iOS/Android上正確旋轉,反轉,旋轉***圖像。 – Fattie

回答

16

是的,這是可能的。您需要查看WebCamTexture功能。

您創建WebCamTexture並調用啓動攝像頭的Play()函數。 WebCamTexture與任何Texture一樣,允許您通過GetPixels()調用獲取像素。這允許您隨時拍攝快照,並且可以將其保存在Texture2D中。致電EncodeToPNG()並隨後寫入文件應該可以讓你在那裏。

請注意,以下代碼是基於文檔的快速書寫。我沒有測試過它。如果有多個可用設備,則可能必須選擇正確的設備。

using UnityEngine; 
using System.Collections; 
using System.IO; 

public class WebCamPhotoCamera : MonoBehaviour 
{ 
    WebCamTexture webCamTexture; 

    void Start() 
    { 
     webCamTexture = new WebCamTexture(); 
     renderer.material.mainTexture = webCamTexture; 
     webCamTexture.Play(); 
    } 

    void TakePhoto() 
    { 

    // 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); 
    } 
} 
+0

現在如何處理相機旋轉說一個Android設備時這樣做? – Codejoy

+0

究竟是在這裏處理@Codejoy?你想要發生什麼? – Bart

+0

回覆太晚了?我已經將代碼分類,並將其附加到帶有spriteRenderer的gameObject中。它啓動相機,如果按下按鈕但拍攝照片,但不顯示實時視圖....任何想法做錯了? (在2D UI環境中工作) – Matt

6

對於那些試圖讓相機渲染活動飼料,這裏是我如何設法把它關閉。首先,我編輯Bart的答案,讓紋理將在更新分配,而不是僅僅在開始:

void Start() 
{ 
    webCamTexture = new WebCamTexture(); 
    webCamTexture.Play(); 
} 

void Update() 
{ 
    GetComponent<RawImage>().texture = webCamTexture; 
} 

然後接上腳本與RawImage分量的遊戲對象。你可以在Unity Editor的Hierarchy中通過右鍵單擊 - > UI - > RawImage輕鬆創建一個(這需要Unity 4.6及更高版本)。運行它應該在您的視圖中顯示相機的實時饋送。在撰寫本文時,Unity 5支持在Unity 5的免費個人版中使用網絡攝像頭。

我希望這有助於任何想要在Unity中捕捉實時攝像頭feed的人。

相關問題