web-dev-qa-db-ja.com

デバイスのカメラを使用してUnityで写真を撮ることはできますか?

私はUnity3Dのより複雑な機能セットに完全には不慣れであり、写真を撮影して操作する機能があるかどうかに興味があります。具体的には、ユーザーに自分撮りをしてもらい、顔の周りをトレースして、モデルにテクスチャマッピングされるPNGを作成してもらいたいと思っています。

モデルへの顔のマッピングが簡単であることは知っていますが、写真/カービング機能を包囲するChromeアプリに書き込む必要があるのか​​、それともすべてを行うことができるのかUnity内でそれを行う方法についてのチュートリアルは必要なく、可能かどうかを尋ねるだけです。

19
Genia S.

はい、これは可能です。 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);
    }
}
21
Bart

カメラでライブフィードをレンダリングしようとする人のために、どうやってそれをやってのけるのかを説明します。最初に、Bartの回答を編集して、テクスチャが開始時ではなく更新時に割り当てられるようにしました。

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

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

次に、RawImageコンポーネントでGameObjectにスクリプトを添付しました。 Unity Editorの階層で右クリック-> UI-> RawImageを使用して簡単に作成できます(Unity 4.6以降が必要です)。これを実行すると、ビューにカメラのライブフィードが表示されます。この記事の執筆時点では、Unity 5は、Unity 5の無料のパーソナルエディションでのWebカメラの使用をサポートしています。

これが、Unityでライブカメラフィードをキャプチャする良い方法を探している人に役立つことを願っています。

7
dammahom59

可能です。 WebcamTexture Unity API をご覧になることを強くお勧めします。便利な機能がいくつかあります。

  1. GetPixel() -座標(x、y)のピクセルの色を返します。
  2. GetPixels() -ピクセル色のブロックを取得します。
  3. GetPixels32() -ピクセルデータを未加工形式で返します。
  4. MarkNonReadable() -WebCamTextureを読み取り不可としてマークします
  5. Pause() -カメラを一時停止します。
  6. Play() -カメラを起動します。
  7. Stop() -カメラを停止します。
5
FunctionR

バートの答えには修正が必要です。私は彼のコードを使用し、私が得ていた写真は黒でした。必要な変更は、TakePhotoをコルーチンに変換して追加する必要があることです

yield return new WaitForEndOfFrame(); 

コルーチンの開始時。 (Courtsey @fafase)詳細については、 http://docs.unity3d.com/ScriptReference/WaitForEndOfFrame.html を参照してください。

参照することもできます

ウェブカメラを使用して写真を撮ると黒い出力が得られます[Unity3D]

4
Keymaker

はい、できます。 Android Native camera Androidデバイスカメラを開き、画像をキャプチャし、ビデオを録画し、それを数行でデバイスの目的の場所に保存できるプラグインコードの。

0

サードパーティのプラグインを使用せずにこれを実行したい場合は、@ FuntionRソリューションが役立ちます。ただし、キャプチャした写真をギャラリー(AndroidおよびiOS)に保存したい場合、Unity内でそれを行うことはできません。写真をギャラリーに転送し、Unityから呼び出すためのネイティブコードを記述する必要があります。

目標を達成するためのガイドとなる要約ブログがあります。 http://unitydevelopers.blogspot.com/2018/07/pick-image-from-gallery-in-unity3d.html

編集:上記のスレッドはギャラリーからの画像の選択について説明していますが、同じプロセスが画像をギャラリーに保存するためのものであることに注意してください。

0
TechnoLover

このタイプの機能には、Camera Capture Kitと呼ばれるプラグインがあります- https://www.assetstore.unity3d.com/en/#!/content/5667 そして提供される機能は、モバイルには、WebCamTextureを使用して静止画像を撮影する方法のデモが含まれています。

0
Chris