Die Funktion "WebCam" muss deklariert werden, damit eine App die Kamera verwenden kann.
Wechseln Sie im Unity-Editor zu den Spielereinstellungen, indem Sie zur Seite "Projekteinstellungen-Player > bearbeiten>" navigieren.
Wählen Sie die Registerkarte "Windows Store" aus.
Überprüfen Sie im Abschnitt "Funktionen für Veröffentlichungseinstellungen > " die WebCam - und Mikrofonfunktionen .
Mit der Kamera kann jeweils nur ein einzelner Vorgang ausgeführt werden. Sie können überprüfen, in welchem Modus sich die Kamera derzeit in UnityEngine.XR.WSA.WebCam.Mode Unity 2018 und früher oder UnityEngine.Windows.WebCam.Mode in Unity 2019 und höher befindet. Verfügbare Modi sind Foto, Video oder keine.
Fotoaufnahme
Namespace (vor Unity 2019):UnityEngine.XR.WSA.WebCam Namespace (Unity 2019 und höher):UnityEngine.Windows.WebCam Typ:PhotoCapture
Mit dem PhotoCapture-Typ können Sie weiterhin Fotos mit der Fotovideokamera aufnehmen. Das allgemeine Muster für die Verwendung von PhotoCapture zum Aufnehmen eines Fotos lautet wie folgt:
Erstellen eines PhotoCapture-Objekts
Erstellen eines CameraParameters-Objekts mit den gewünschten Einstellungen
Starten des Fotomodus über StartPhotoModeAsync
Aufnehmen des gewünschten Fotos
(optional) Interagieren mit diesem Bild
Beenden des Fotomodus und Bereinigen von Ressourcen
Allgemeine Einrichtung für PhotoCapture
Beginnen Sie für alle drei Verwendungen mit denselben drei Schritten oben
Nachdem Sie das Foto auf der Festplatte aufgenommen haben, beenden Sie den Fotomodus, und bereinigen Sie dann Ihre Objekte.
cs
voidOnCapturedPhotoToDisk(PhotoCapture.PhotoCaptureResult result)
{
if (result.success)
{
Debug.Log("Saved Photo to disk!");
photoCaptureObject.StopPhotoModeAsync(OnStoppedPhotoMode);
}
else
{
Debug.Log("Failed to save Photo to disk");
}
}
Aufnehmen eines Fotos in eine Texture2D mit Position
Beim Erfassen von Daten in eine Texture2D ähnelt der Prozess der Aufzeichnung auf dem Datenträger.
Folgen Sie dem oben beschriebenen Setupprozess.
Erfassen Sie in OnPhotoModeStarted einen Frame im Arbeitsspeicher.
cs
privatevoidOnPhotoModeStarted(PhotoCapture.PhotoCaptureResult result)
{
if (result.success)
{
photoCaptureObject.TakePhotoAsync(OnCapturedPhotoToMemory);
}
else
{
Debug.LogError("Unable to start photo mode!");
}
}
Anschließend wenden Sie Ihr Ergebnis auf eine Textur an und verwenden den allgemeinen Bereinigungscode oben.
cs
voidOnCapturedPhotoToMemory(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);
}
Ausrichtbare Kamera
Wenn Sie diese Textur in der Szene platzieren und mit den locatablen Kameramatrizen anzeigen möchten, fügen Sie in der result.success Prüfung den folgenden Code zu OnCapturedPhotoToMemory hinzu:
cs
if (photoCaptureFrame.hasLocationData)
{
photoCaptureFrame.TryGetCameraToWorldMatrix(out Matrix4x4 cameraToWorldMatrix);
Vector3 position = cameraToWorldMatrix.GetColumn(3) - cameraToWorldMatrix.GetColumn(2);
Quaternion rotation = Quaternion.LookRotation(-cameraToWorldMatrix.GetColumn(2), cameraToWorldMatrix.GetColumn(1));
photoCaptureFrame.TryGetProjectionMatrix(Camera.main.nearClipPlane, Camera.main.farClipPlane, out Matrix4x4 projectionMatrix);
}
Unity hat Beispielcode zum Anwenden der Projektionsmatrix auf einen bestimmten Shader in ihren Foren bereitgestellt.
Aufnehmen eines Fotos und Interagieren mit den unformatierten Bytes
Um mit den unformatierten Bytes eines Speicherframes zu interagieren, führen Sie die gleichen Setupschritte wie oben und OnPhotoModeStarted aus wie beim Aufnehmen eines Fotos in einer Texture2D. Der Unterschied besteht in "OnCapturedPhotoToMemory ", in dem Sie die unformatierten Bytes abrufen und mit ihnen interagieren können.
In diesem Beispiel erstellen Sie eine Liste , die weiter verarbeitet oder auf eine Textur über SetPixels() angewendet werden soll.
cs
voidOnCapturedPhotoToMemory(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);
}
Videoaufnahme
Namespace (vor Unity 2019):UnityEngine.XR.WSA.WebCam Namespace (Unity 2019 und höher):UnityEngine.Windows.WebCam Typ:VideoCapture
VideoCapture funktioniert ähnlich wie PhotoCapture. Die einzigen beiden Unterschiede sind, dass Sie einen Frames pro Sekunde (FPS)-Wert angeben müssen, und Sie können nur direkt auf dem Datenträger als .mp4-Datei speichern. Die Schritte zur Verwendung von VideoCapture lauten wie folgt:
Erstellen eines VideoCapture-Objekts
Erstellen eines CameraParameters-Objekts mit den gewünschten Einstellungen
Starten des Videomodus über StartVideoModeAsync
Videoaufzeichnung starten
Videoaufnahme beenden
Beenden des Videomodus und Bereinigen von Ressourcen
Erstellen Sie zunächst unser VideoCapture-ObjektVideoCapture m_VideoCapture = null;
Nachdem die Aufzeichnung gestartet wurde, können Sie Ihre Benutzeroberfläche oder Ihr Verhalten aktualisieren, um das Beenden zu aktivieren. Hier melden Sie sich einfach an.
cs
voidOnStartedRecordingVideo(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.
}
Zu einem späteren Zeitpunkt möchten Sie die Aufzeichnung z. B. mit einem Timer oder benutzereingaben beenden.
cs
// The user has indicated to stop recordingvoidStopRecordingVideo()
{
m_VideoCapture.StopRecordingAsync(OnStoppedRecordingVideo);
}
Nachdem die Aufzeichnung beendet wurde, beenden Sie den Videomodus, und bereinigen Sie Ihre Ressourcen.
Stellen Sie sicher, dass die WebCam-Funktion in Ihrem Projekt angegeben ist.
Nächster Entwicklungsprüfpunkt
Wenn Sie dem Weg der Unity-Entwicklungsprüfpunkte folgen, den wir eingerichtet haben, befinden Sie sich mitten in der Erkundung der Mixed Reality-Plattformfunktionen und APIs. Von hier aus können Sie mit dem nächsten Thema fortfahren:
Erfahren Sie, wie Sie die Hologrammstabilität in Unity manuell optimieren, indem Sie den Fokus für immersive HoloLens- und Windows Mixed Reality-Headsets festlegen.
Erfahren Sie, wie Sie die Hauptkamera von Unity für die Entwicklung von Windows Mixed Reality einrichten und verwenden, um holografisches Rendering durchzuführen.
Erfahren Sie, wie Sie die Blickeingabe als primäre Möglichkeit für Benutzer verwenden, um die Hologramme, die Ihre App in Mixed Reality erstellt, als Ziel zu verwenden.