Get to know MDN better
Dieser Inhalt wurde automatisch aus dem Englischen übersetzt, und kann Fehler enthalten. Erfahre mehr über dieses Experiment.
Lassen Sie uns unsere quadratische Fläche in drei Dimensionen überführen, indem wir fünf weitere Flächen hinzufügen, um einen Würfel zu erstellen. Um dies effizient zu tun, werden wir vom Zeichnen der Vertices direkt durch Aufruf der Methode gl.drawArrays() dazu übergehen, das Vertex-Array als Tabelle zu verwenden und einzelne Vertices in dieser Tabelle zu referenzieren, um die Positionen der Vertices jeder Fläche zu definieren, und zwar durch Aufruf von gl.drawElements().
Betrachten Sie: jede Fläche benötigt vier Vertices, um sie zu definieren, aber jeder Vertex wird von drei Flächen geteilt. Wir können viel weniger Daten verschieben, indem wir ein Array von allen 24 Vertices erstellen und dann auf jeden Vertex durch seinen Index in diesem Array verweisen, anstatt ganze Koordinatensätze zu verschieben. Falls Sie sich fragen, warum wir 24 Vertices und nicht nur 8 benötigen: Das liegt daran, dass jede Ecke drei verschiedenen Flächen mit unterschiedlichen Farben gehört und ein einzelner Vertex eine bestimmte Farbe haben muss; daher erstellen wir drei Kopien jedes Vertex in drei verschiedenen Farben, eine für jede Fläche.
Zuerst wollen wir den Vertex-Positionspuffer des Würfels erstellen, indem wir den Code in initBuffers() aktualisieren. Dies ist im Wesentlichen dasselbe wie bei der quadratischen Fläche, aber etwas länger, da es 24 Vertices gibt (4 pro Seite).
In der Funktion initPositionBuffer() Ihres "init-buffers.js"-Moduls ersetzen Sie die Deklaration von positions mit diesem Code:
Da wir eine z-Komponente zu unseren Vertices hinzugefügt haben, müssen wir die numComponents unseres vertexPosition-Attributes auf 3 aktualisieren.
In der Funktion setPositionAttribute() Ihres "draw-scene.js"-Moduls ändern Sie die Konstante numComponents von 2 auf 3:
Wir müssen auch ein Array von Farben für jeden der 24 Vertices erstellen. Dieser Code beginnt mit der Definition einer Farbe für jede Fläche und verwendet dann eine Schleife, um ein Array aller Farben für jeden der Vertices zu erstellen.
In der Funktion initColorBuffer() Ihres "init-buffers.js"-Moduls ersetzen Sie die Deklaration von colors mit diesem Code:
Sobald die Vertex-Arrays erstellt sind, müssen wir das Element-Array erstellen.
In Ihrem "init-buffer.js"-Modul fügen Sie die folgende Funktion hinzu:
Das indices-Array definiert jede Fläche als Paar von Dreiecken, wobei die Vertices jedes Dreiecks als Index in die Vertex-Arrays des Würfels spezifiziert werden. Somit wird der Würfel als Sammlung von 12 Dreiecken beschrieben.
Als Nächstes müssen Sie diese neue Funktion von initBuffers() aufrufen und den Puffer zurückgeben, den sie erstellt.
Am Ende der Funktion initBuffers() Ihres "init-buffers.js"-Moduls fügen Sie den folgenden Code hinzu und ersetzen die bestehende return-Anweisung:
Als Nächstes müssen wir Code zu unserer Funktion drawScene() hinzufügen, um mit dem Index-Puffer des Würfels zu zeichnen, indem neue Aufrufe von gl.bindBuffer() und gl.drawElements() hinzugefügt werden.
In Ihrer Funktion drawScene() fügen Sie den folgenden Code direkt vor der Zeile gl.useProgram ein:
In der Funktion drawScene() Ihres "draw-scene.js"-Moduls ersetzen Sie den Block direkt nach den beiden gl.uniformMatrix4fv-Aufrufen, der die Zeile gl.drawArrays() enthält, durch den folgenden Block:
Da jede Fläche unseres Würfels aus zwei Dreiecken besteht, gibt es 6 Vertices pro Seite, also insgesamt 36 Vertices im Würfel, obwohl viele von ihnen Duplikate sind.
Schließlich ersetzen wir unsere Variable squareRotation durch cubeRotation und fügen eine zweite Rotation um die x-Achse hinzu.
Am Anfang Ihrer "webgl-demo.js"-Datei ersetzen Sie die Deklaration von squareRotation durch diese Zeile:
In Ihrer Deklaration der Funktion drawScene() ersetzen Sie squareRotation durch cubeRotation:
In Ihrer Funktion drawScene() ersetzen Sie den Aufruf von mat4.rotate durch folgenden Code:
In Ihrer Funktion main() ersetzen Sie den Code, der drawScene() aufruft und squareRotation aktualisiert, damit cubeRotation stattdessen übergeben und aktualisiert wird:
Zu diesem Zeitpunkt haben wir nun einen animierten Würfel, der sich dreht und dessen sechs Flächen ziemlich lebhaft gefärbt sind.
Vollständiger Code anzeigen | Öffnen Sie dieses Demo auf einer neuen Seite
Der Bauplan für ein besseres Internet.
Besuche die gemeinnützige Muttergesellschaft der Mozilla Corporation, die Mozilla Foundation.
Teile dieses Inhalts sind ©1998–2026 von einzelnen mozilla.org-Mitwirkenden. Inhalte sind verfügbar unter einer Creative-Commons-Lizenz.