Unity의 위치를 찾을 수 있는 카메라Locatable camera in Unity

사진 비디오 카메라 기능 사용Enabling the capability for Photo Video Camera

카메라를 사용 하려면 앱에 대해 "웹캠" 기능을 선언 해야 합니다.The "WebCam" capability must be declared for an app to use the camera.

  1. Unity 편집기에서 "> 프로젝트 설정 > 플레이어 편집" 페이지로 이동 하 여 플레이어 설정으로 이동 합니다.In the Unity Editor, go to the player settings by navigating to the "Edit > Project Settings > Player" page
  2. "Windows 스토어" 탭을 선택 합니다.Select the "Windows Store" tab
  3. "게시 설정 > 기능" 섹션에서 웹캠마이크 기능을 확인 합니다.In the "Publishing Settings > Capabilities" section, check the WebCam and Microphone capabilities

카메라에서는 한 번에 하나의 작업만 수행할 수 있습니다.Only a single operation can occur with the camera at a time. 카메라의 현재 사용 중인 모드가 UnityEngine. XR을 사용 하 여 확인할 수 있습니다.You can check with mode the camera is currently in with UnityEngine.XR.WSA.WebCam.Mode. 사용 가능한 모드는 사진, 동영상 또는 없음입니다.Available modes are photo, video, or none.

사진 캡처Photo Capture

네임 스페이스: unityengine. XRNamespace: UnityEngine.XR.WSA.WebCam
형식: 사진 캡처Type: PhotoCapture

사진 캡처 유형을 사용 하면 사진 비디오 카메라와 사진을 계속 사용할 수 있습니다.The PhotoCapture type allows you to take still photographs with the Photo Video Camera. 사진 캡처 를 사용 하 여 사진을 촬영 하는 일반적인 패턴은 다음과 같습니다.The general pattern for using PhotoCapture to take a photo is as follows:

  1. 사진 캡처 개체 만들기Create a PhotoCapture object
  2. 원하는 설정을 사용 하 여 CameraParameters 개체를 만듭니다.Create a CameraParameters object with the settings you want
  3. Startphoto Modeasync 를 통해 사진 모드 시작Start Photo Mode via StartPhotoModeAsync
  4. 원하는 사진 가져오기Take the photo you want
    • 필드 해당 사진과 상호 작용(optional) Interact with that picture
  5. 사진 모드 중지 및 리소스 정리Stop Photo Mode and clean up resources

사진 캡처에 대 한 일반적인 설정Common Set Up for PhotoCapture

세 가지 용도 모두에서 위의 세 단계를 시작 합니다.For all three uses, start with the same first three steps above

사진 캡처 개체를 만들어 시작Start by creating a PhotoCapture object

PhotoCapture photoCaptureObject = null;
   void Start()
   {
       PhotoCapture.CreateAsync(false, OnPhotoCaptureCreated);
   }

그런 다음 개체를 저장 하 고, 매개 변수를 설정 하 고, 사진 모드를 시작 합니다.Next, store your object, set your parameters, and start Photo Mode

void OnPhotoCaptureCreated(PhotoCapture captureObject)
   {
       photoCaptureObject = captureObject;

       Resolution cameraResolution = PhotoCapture.SupportedResolutions.OrderByDescending((res) => res.width * res.height).First();

       CameraParameters c = new CameraParameters();
       c.hologramOpacity = 0.0f;
       c.cameraResolutionWidth = cameraResolution.width;
       c.cameraResolutionHeight = cameraResolution.height;
       c.pixelFormat = CapturePixelFormat.BGRA32;

       captureObject.StartPhotoModeAsync(c, false, OnPhotoModeStarted);
   }

끝으로 여기에 제공 된 동일한 정리 코드를 사용 합니다.In the end, you'll also use the same clean-up code presented here

void OnStoppedPhotoMode(PhotoCapture.PhotoCaptureResult result)
   {
       photoCaptureObject.Dispose();
       photoCaptureObject = null;
   }

이러한 단계를 수행 하 고 나면 캡처할 사진 유형을 선택할 수 있습니다.After these steps, you can choose which type of photo to capture.

파일에 사진 캡처Capture a Photo to a File

가장 간단한 작업은 파일에 직접 사진을 캡처하는 것입니다.The simplest operation is to capture a photo directly to a file. 사진은 JPG 또는 PNG로 저장할 수 있습니다.The photo can be saved as a JPG or a PNG.

사진 모드를 성공적으로 시작 하는 경우 사진을 촬영 하 고 디스크에 저장 합니다.If you successfully started photo mode, take a photo and store it on disk

private void OnPhotoModeStarted(PhotoCapture.PhotoCaptureResult result)
   {
       if (result.success)
       {
           string filename = string.Format(@"CapturedImage{0}_n.jpg", Time.time);
           string filePath = System.IO.Path.Combine(Application.persistentDataPath, filename);

           photoCaptureObject.TakePhotoAsync(filePath, PhotoCaptureFileOutputFormat.JPG, OnCapturedPhotoToDisk);
       }
       else
       {
           Debug.LogError("Unable to start photo mode!");
       }
   }

사진을 디스크로 캡처한 후 사진 모드를 종료 하 고 개체를 정리 합니다.After capturing the photo to disk, exit photo mode and then clean up your objects

void OnCapturedPhotoToDisk(PhotoCapture.PhotoCaptureResult result)
   {
       if (result.success)
       {
           Debug.Log("Saved Photo to disk!");
           photoCaptureObject.StopPhotoModeAsync(OnStoppedPhotoMode);
       }
       else
       {
           Debug.Log("Failed to save Photo to disk");
       }
   }

Texture2D에 사진 캡처Capture a Photo to a Texture2D

Texture2D에 데이터를 캡처할 때 프로세스는 디스크에 캡처하는 것과 비슷합니다.When capturing data to a Texture2D, the process is similar to capturing to disk.

위의 설치 프로세스를 따르세요.Follow the setup process above.

Onsale Modestarted 에서 프레임을 메모리로 캡처합니다.In OnPhotoModeStarted, capture a frame to memory.

private void OnPhotoModeStarted(PhotoCapture.PhotoCaptureResult result)
   {
       if (result.success)
       {
           photoCaptureObject.TakePhotoAsync(OnCapturedPhotoToMemory);
       }
       else
       {
           Debug.LogError("Unable to start photo mode!");
       }
   }

그런 다음 결과를 질감에 적용 하 고 위의 일반적인 정리 코드를 사용 합니다.You'll then apply your result to a texture and use the common clean-up code above.

void OnCapturedPhotoToMemory(PhotoCapture.PhotoCaptureResult result, PhotoCaptureFrame photoCaptureFrame)
   {
       if (result.success)
       {
           // Create our Texture2D for use and set the correct resolution
           Resolution cameraResolution = PhotoCapture.SupportedResolutions.OrderByDescending((res) => res.width * res.height).First();
           Texture2D targetTexture = new Texture2D(cameraResolution.width, cameraResolution.height);
           // Copy the raw image data into our target texture
           photoCaptureFrame.UploadImageDataToTexture(targetTexture);
           // Do as we wish with the texture such as apply it to a material, etc.
       }
       // Clean up
       photoCaptureObject.StopPhotoModeAsync(OnStoppedPhotoMode);
   }

사진 캡처 및 원시 바이트 조작Capture a Photo and Interact with the Raw bytes

메모리 프레임에 있는 원시 바이트와 상호 작용 하려면 Texture2D에 사진을 캡처하는 것 처럼 위와 동일한 설정 단계를 수행 합니다.To interact with the raw bytes of an in memory frame, follow the same setup steps as above and OnPhotoModeStarted as in capturing a photo to a Texture2D. 원시 바이트를 가져와 상호 작용할 수 있는 OnCapturedPhotoToMemory 에서 차이가 있습니다.The difference is in OnCapturedPhotoToMemory where you can get the raw bytes and interact with them.

이 예제에서는 Setpixels () 을 통해 추가 처리 또는 텍스처에 적용 되는 목록을 만듭니다.In this example, you'll create a List to be further processed or applied to a texture via SetPixels()

void OnCapturedPhotoToMemory(PhotoCapture.PhotoCaptureResult result, PhotoCaptureFrame photoCaptureFrame)
   {
       if (result.success)
       {
           List<byte> imageBufferList = new List<byte>();
           // Copy the raw IMFMediaBuffer data into our empty byte list.
           photoCaptureFrame.CopyRawImageDataIntoBuffer(imageBufferList);

           // In this example, we captured the image using the BGRA32 format.
           // So our stride will be 4 since we have a byte for each rgba channel.
           // The raw image data will also be flipped so we access our pixel data
           // in the reverse order.
           int stride = 4;
           float denominator = 1.0f / 255.0f;
           List<Color> colorArray = new List<Color>();
           for (int i = imageBufferList.Count - 1; i >= 0; i -= stride)
           {
               float a = (int)(imageBufferList[i - 0]) * denominator;
               float r = (int)(imageBufferList[i - 1]) * denominator;
               float g = (int)(imageBufferList[i - 2]) * denominator;
               float b = (int)(imageBufferList[i - 3]) * denominator;

               colorArray.Add(new Color(r, g, b, a));
           }
           // Now we could do something with the array such as texture.SetPixels() or run image processing on the list
       }
       photoCaptureObject.StopPhotoModeAsync(OnStoppedPhotoMode);
   }

비디오 캡처Video Capture

네임 스페이스: unityengine. XRNamespace: UnityEngine.XR.WSA.WebCam
유형: VideoCaptureType: VideoCapture

VideoCapture사진 캡처 와 유사 하 게 작동 합니다.VideoCapture functions similarly to PhotoCapture. 두 가지 차이점은 FPS (초당 프레임 수) 값을 지정 해야 하 고, mp4 파일로는 디스크에 직접 저장 하는 것입니다.The only two differences are that you must specify a Frames Per Second (FPS) value and you can only save directly to disk as a .mp4 file. VideoCapture 를 사용 하는 단계는 다음과 같습니다.The steps to use VideoCapture are as follows:

  1. VideoCapture 개체 만들기Create a VideoCapture object
  2. 원하는 설정을 사용 하 여 CameraParameters 개체를 만듭니다.Create a CameraParameters object with the settings you want
  3. Startvideomodeasync 를 통해 비디오 모드 시작Start Video Mode via StartVideoModeAsync
  4. 비디오 녹화 시작Start recording video
  5. 비디오 녹화 중지Stop recording video
  6. 비디오 모드 중지 및 리소스 정리Stop Video Mode and clean up resources

VideoCapture 개체 VideoCapture m_VideoCapture = null 을 만들어 시작 합니다.Start by creating our VideoCapture object VideoCapture m_VideoCapture = null;

void Start ()
   {
       VideoCapture.CreateAsync(false, OnVideoCaptureCreated);
   }

다음으로 기록 하 고 시작 하는 데 사용할 매개 변수를 설정 합니다.Next, set up the parameters you'll want for the recording and start.

void OnVideoCaptureCreated (VideoCapture videoCapture)
   {
       if (videoCapture != null)
       {
           m_VideoCapture = videoCapture;

           Resolution cameraResolution = VideoCapture.SupportedResolutions.OrderByDescending((res) => res.width * res.height).First();
           float cameraFramerate = VideoCapture.GetSupportedFrameRatesForResolution(cameraResolution).OrderByDescending((fps) => fps).First();

           CameraParameters cameraParameters = new CameraParameters();
           cameraParameters.hologramOpacity = 0.0f;
           cameraParameters.frameRate = cameraFramerate;
           cameraParameters.cameraResolutionWidth = cameraResolution.width;
           cameraParameters.cameraResolutionHeight = cameraResolution.height;
           cameraParameters.pixelFormat = CapturePixelFormat.BGRA32;

           m_VideoCapture.StartVideoModeAsync(cameraParameters,
                                               VideoCapture.AudioState.None,
                                               OnStartedVideoCaptureMode);
       }
       else
       {
           Debug.LogError("Failed to create VideoCapture Instance!");
       }
   }

시작 되 면 기록을 시작 합니다.Once started, begin the recording

void OnStartedVideoCaptureMode(VideoCapture.VideoCaptureResult result)
   {
       if (result.success)
       {
           string filename = string.Format("MyVideo_{0}.mp4", Time.time);
           string filepath = System.IO.Path.Combine(Application.persistentDataPath, filename);

           m_VideoCapture.StartRecordingAsync(filepath, OnStartedRecordingVideo);
       }
   }

기록이 시작 된 후에는 중지할 수 있도록 UI 나 동작을 업데이트할 수 있습니다.After recording has started, you could update your UI or behaviors to enable stopping. 여기서는 로그만 합니다.Here you just log.

void OnStartedRecordingVideo(VideoCapture.VideoCaptureResult result)
   {
       Debug.Log("Started Recording Video!");
       // We will stop the video from recording via other input such as a timer or a tap, etc.
   }

나중에 타이머 또는 사용자 입력을 사용 하 여 기록을 중지할 수 있습니다 (예를 들어).At a later point, you'll want to stop the recording using a timer or user input, for instance.

// The user has indicated to stop recording
   void StopRecordingVideo()
   {
       m_VideoCapture.StopRecordingAsync(OnStoppedRecordingVideo);
   }

기록이 중지 되 면 비디오 모드를 중지 하 고 리소스를 정리 합니다.Once the recording has stopped, stop video mode and clean up your resources.

void OnStoppedRecordingVideo(VideoCapture.VideoCaptureResult result)
   {
       Debug.Log("Stopped Recording Video!");
       m_VideoCapture.StopVideoModeAsync(OnStoppedVideoCaptureMode);
   }

   void OnStoppedVideoCaptureMode(VideoCapture.VideoCaptureResult result)
   {
       m_VideoCapture.Dispose();
       m_VideoCapture = null;
   }

문제 해결Troubleshooting

  • 사용 가능한 해결 방법이 없습니다.No resolutions are available
    • 웹캠 기능이 프로젝트에 지정 되어 있는지 확인 합니다.Ensure the WebCam capability is specified in your project.

다음 개발 검사점Next Development Checkpoint

앞서 소개한 Unity 개발 검사점 경험을 팔로 하는 경우 혼합 현실 플랫폼 기능과 Api를 탐색 하는 과정을 진행 하 고 있습니다.If you're following the Unity development checkpoint journey we've laid out, you're in the midst of exploring the Mixed Reality platform capabilities and APIs. 여기에서 다음 항목으로 진행할 수 있습니다.From here, you can continue to the next topic:

또는 디바이스나 에뮬레이터에서 앱 배포로 직접 이동합니다.Or jump directly to deploying your app on a device or emulator:

언제든지 Unity 개발 검사점으로 돌아갈 수 있습니다.You can always go back to the Unity development checkpoints at any time.

참고 항목See Also

  • [위치를 찾을 수 있는 카메라Locatable camera](../platform-capab ilities-and-apis/locatable-camera.md)