Virtuelle Realität - Herausforderung für Entwickler

Stereoskopisches Rendering mit WebVR
Keine Kommentare

Virtuelle Realität lässt Nutzer in vollkommen neue Welten abtauchen und schafft intensive Möglichkeiten, sich auf die neue Umgebung einzustellen und darin aufzugehen. Allerdings benötigt Virtual Reality aufgrund der hohen Bildraten sehr hochauflösende Displays und leistungsstarke Grafik-Prozessoren. Die Industrie wird noch in den nächsten Jahren mit deren Entwicklung beschäftigt sein. Doch vor welche Herausforderungen werden Entwickler bei stereoskopischen Renderings gestellt?

Zur Darstellung virtueller Welten werden spezielle Ausgabegeräte benötigt, damit innerhalb der Virtuellen Realität (VR) ein Gefühl der Immersion erzeugt wird. Bekannt sind vor allem Head-Mounted-Displays wie Oculus Rift, Großbildleinwände oder die Cave Automatic Virtual Environment (CAVE). Um einen räumlichen Eindruck zu erzeugen, werden zwei Bilder aus unterschiedlichen Perspektiven erzeugt und dargestellt (Stereoprojektion). Es existieren verschiedene Technologien (aktiv und passiv), um das jeweilige Bild dem richtigen Auge zuzuführen.

Das Team von Mozilla möchte auch tiefer in die Virtuelle Realität einsteigen und darin „die besten Features des Webs zusammenführen“: Vernetzung, Erstellen von Content ohne Beschränkung und sichere Ausführung von Remote Code – und das alles mit dem Modell der Virtuellen Realität. Einen ersten Schritt in Richtung Virtual Reality ist Mozilla bereits mit der Unterstützung für das Oculus DK2 Headset gegangen. Welche Unterschiede es bei den Render-Techniken gibt und worauf Entwickler beim Bau ihrer ersten VR-Entwürfe mit WebVR achten sollten, hat Nick Desaulniers in einem Blogpost zusammengefasst. WebVR ist ein API, das speziell angefertigte Interfaces für Virtual-Reality-Hardware bietet, mit denen Developer einfach VR-Erfahrungen erzeugen können sollen.

Multiple Ansichten derselben Szene

Zuerst ein wichtiger Unterschied: Bei der altbewährten Ansicht auf einem Bildschirm wird eine dreidimensionale Szene auf eine Ebene verflacht – der sogenannte View Port. Objekte können zwar verschiedene Abstände zum View Port aufweisen, dennoch wird alles von einem einzigen Point of View gerendert. Auch multiple Draw Calls können auftreten, aber normalerweise wird mit einer View-Matrix und einer Projection-Matrix gerendert, die zur Zeit der Szenenerstellung berechnet werden. Die View-Matrix beinhaltet dabei beispielsweise die Position der virtuellen Kamera in Relation zu allen anderen Objekten in der Szene sowie User-Ausrichtung. Die Projection-Matrix bestimmt, ob man eine perspektivische oder eine senkrechte Projektion einnimmt und legt das Field of View (FOV), das View-Port-Seitenverhältnis und die Draw Distance fest.

Möchte man nun von der Standardansicht auf ein Head-Mounted-Display wechseln, muss alles zweimal aus unterschiedlichen Perspektiven gerendert werden.

monoscopic_stereoscopic

Screenshot: http://mzl.la/1LAdiIb

stereoscopic-250x173

Screenshot: http://mzl.la/1LAdiIb

Man benötigt nun jeweils zwei View-Matrizen und Projection-Matrizen; zudem muss das Field of View des Headsets für beide Augen abgefragt werden. Denn jedes Auge hat sein eigenes Blickfeld – und das muss gerade bei Head-Mounted-Displays ausgeglichen sein, denn diese umfassen das gesamte FOV. Das Oculus SDK verfügt über ein Konfigurations-Utility, über die der User das individuelle Field of View pro Auge und den Augenabstand einstellen kann.

Die beiden einmaligen Fields of View führen zu zwei einzigartigen Projection-Matrizen. Da die Augen versetzt zueinander sind, haben sie auch aus der Sicht des Viewers unterschiedliche Positionen. So erhält man zusätzlich zwei unterschiedliche View-Matrizen. Die beiden Matrizen müssen unbedingt genau eingestellt sein, damit das Gehirn des Nutzers zwei individuelle Bilder richtig zusammensetzen kann. Wird außerdem der Augenabstand nicht beachtet, kann ein ordentlich funktionierender Parallax-Effekt nicht erreicht werden. Zudem muss das Head-Mounted-Display konfiguriert werden, um die Größe des Darstellungsbereichs anzupassen.

Rendert man eine monoskopische Ansicht, erhält man folgenden (oder ähnlichen) JavaScript-Code, den Nick Desaulniers in seinem Blogpost bereitgestellt hat:

function init () {
// using gl-matrix for linear algebra
var viewMatrix = mat4.lookAt(mat4.create(), eye, center, up);
var projectionMatrix = mat4.perspective(mat4.create(), fov, near, far);
var mvpMatrix = mat4.multiply(mat4.create(), projectionMatrix, viewMatrix);
gl.uniformMatrix4fv(uniforms.uMVPMatrixLocation, false, mvpMatrix);
};
function update (t) {
gl.clear(flags);
gl.drawElements(mode, count, type, offset);
requestAnimationFrame(update);
};

Rendert man aber von zwei unterschiedlichen Viewpoints mit WebVR, sieht der Code folgendermaßen aus:

function init () {
// hypothetical function to get the list of
// attached HMD's and Position Sensors.
initHMD();
initModelMatrices();
};
function update () {
gl.clear(flags);

// hypothetical function that
// uses the webVR API's to update view matrices
// based on orientation provided by HMD's
// accelerometer, and position provided by the
// position sensor camera.
readFromHMDPS();

// left eye
gl.viewport(0, 0, canvas.width / 2, canvas.height);
mat4.multiply(mvpMatrix, leftEyeProjectionMatrix, leftEyeViewMatrix);
gl.uniformMatrix4fv(uniforms.uMVPMatrixLocation, false, mvpMatrix);
gl.drawElements(mode, count, type, offset);

// right eye
gl.viewport(canvas.width / 2, 0, canvas.width / 2, canvas.height);
mat4.multiply(mvpMatrix, rightEyeProjectionMatrix, rightEyeViewMatrix);
gl.uniformMatrix4fv(uniforms.uMVPMatrixLocation, false, mvpMatrix);
gl.drawElements(gl.TRIANGLES, n, gl.UNSIGNED_SHORT, 0);

requestAnimationFrame(update);
};

Weitere Informationen zu den Unterschieden im Rendering bieten die Oculus Docs.

90 Hertz Bildwiederholrate und geringe Latenz

Beim Rendern bestimmt die Bildwiederholrate der Hardware die Geschwindigkeit der Display-Aktualisierungen, das sogenannte „Refreshing“. Für die meisten Monitore beträgt die Rate 60 Hertz – das bedeutet, man hat genau 16,66 ms, um alles in einer Szene einzuzeichnen. requestAnimationFrame beschränkt dabei die Geschwindigkeit von Update-Loops. Das Oculus DK2 hat derzeit hingegen eine maximale Bildwiederholrate von 75 Hertz – 13,33 ms pro Frame. 2016 soll eine Bildwiederholrate von 90 Hertz erreicht werden.

Das bedeutet, dass nicht nur alles zweimal von zwei unterschiedlichen Viewpoints gerendert werden muss, sondern dass auch nur 2/3 der Zeit dafür bleiben. Eine niedrigere Frame Time lässt sich durch verschiedene Tricks erreichen (geringere Szenenkomplexität, Hochskalierung etc.); die auf der Hardware beruhende Latenz zu reduzieren ist hingegen komplizierter: Denn hier geht es nicht nur um die Bildwiederholrate, sondern auch um die Latenz beim User-Input. Der größte Unterschied zwischen Echtzeit-Rendering und Pre-Rendering ist, dass eine Szene in Echtzeit dynamisch mit Input des Viewers generiert wird. Dreht ein Nutzer den Kopf oder bewegt sich an einen anderen Ort, soll ein kompakter Feedback-Loop zwischen Bewegung und Darstellung des neuen Viewpoints auf dem Display gegeben sein.

Die Rendering-Ergebnisse sollen also früher dargestellt werden – das führt allerdings zum klassischen Double-Buffering- vs. Screen-Tearing-Problem. Zu diesem Effekt kann es kommen, wenn Aufbau und Anzeige der Einzelbilder nicht mit der Monitorwiedergabe synchronisiert sind. Der Betrachter sieht dann möglicherweise mehrere Teile aufeinanderfolgender Einzelbilder zur selben Zeit, d. h. die Bilder wirken „zerrissen“. Wünschenswert ist eine Latenz von unter 20 ms zwischen Nutzerinteraktion und Feedback-Präsentation.

Ob aktuelle Desktop-Grafik-Hardware für diese Aufgabe bereit ist, muss sich aber erst noch zeigen – mal ganz abgesehen von aktueller Mobile-Hardware.

Weitere Informationen zu WebVR finden sich auf der MozVR Download-Page, den MDN Docs oder den WebVR Specs.

ML Conference 2019

Workshop: Machine Learning 101++ using Python

mit Dr. Pieter Buteneers (Chatlayer.ai)

Honey Bee Conservation using Deep Learning

mit Thiago da Silva Alves, Jean Metz (JArchitects)

Python Summit 2019

Daten analysieren und transformieren mit Python

mit Doniyor Jurabayev (Freelancer)

Advanced Flow Control

mit Oz Tiram (noris network AG)

Aufmacherbild: Happy guy is sitting at home and doing scuba diving using head-mounted device for virtual reality von Shutterstock / Urheberrecht: Julia Tim

Unsere Redaktion empfiehlt:

Relevante Beiträge

Hinterlasse einen Kommentar

Hinterlasse den ersten Kommentar!

avatar
400
  Subscribe  
Benachrichtige mich zu:
X
- Gib Deinen Standort ein -
- or -