• Wir präsentieren Dir heute ein Stellenangebot für einen Frontend-Entwickler Angular / Java in Braunschweig. Hier geht es zur Jobanzeige

OpenGL: Eine Kugel

temi

temi

Top Contributor
Ich beschäftige mit gerade etwas mit OpenGL und versuche eine Kugel zu erzeugen.

Die Idee ist es einen Würfel zu erstellen und diesen anschließen "aufzublasen".

Dazu habe ich eine Klasse Quad, die eine Fläche mit einer bestimmten Orientierung erzeugt und eine Klasse Sphere, die für jede Richtung eine entsprechende Fläche erzeugen soll und diese dann in je ein Array mit Vertices und Indices für den Mesh kopieren soll.

Solange ich nur eine einzelne Seite erzeuge scheint das auch zu funktionieren. Sobald eine weitere Seite dazukommt, wird es konfus.
Java:
import org.joml.Vector3f;

public class Sphere {

    private static final int MIN_RESOLUTION = 2;
    private final static Vector3f[] DIRECTIONS = {
        //new Vector3f(1f, 0f, 0f),
        new Vector3f(-1f, 0f, 0f)
    };
    private final int resolution;
    private float[] vertices;
    private int[] indices;

    public Sphere(final int resolution) {
        this.resolution = resolution < MIN_RESOLUTION ? MIN_RESOLUTION : resolution;
        create();
    }

    public Mesh getMesh() {
        return new Mesh(vertices, indices);
    }

    private void create() {
        vertices = new float[resolution * resolution * 3 * (DIRECTIONS.length)];
        indices = new int[(resolution - 1) * (resolution - 1) * 6 * (DIRECTIONS.length)];

        for(int ixDirection = 0; ixDirection < DIRECTIONS.length; ixDirection++) {
            // create a new Quad for a given direction
            Quad quad = new Quad(resolution, DIRECTIONS[ixDirection]);

            // normalize and copy all vertices to the vertices array
            Vector3f[] quadVertices = quad.getVertices();
            int ixVertices = ixDirection * quadVertices.length;
            for (int ixQuadVertices = 0; ixQuadVertices < quadVertices.length; ixQuadVertices++) {
                Vector3f vertex = quadVertices[ixQuadVertices].normalize();
                vertices[ixVertices++] = vertex.x;
                vertices[ixVertices++] = vertex.y;
                vertices[ixVertices++] = vertex.z;
            }

            // copy all indices to the indices array
            int[] quadIndices = quad.getIndices();
            int ixIndices = ixDirection * quadIndices.length;
            for(int index : quadIndices) {
                indices[ixIndices++] = index;
            }
        }
    }
}



Das Ergebnis mit einer Seite (die andere funktioniert entgegengesetzt):
Java:
private final static Vector3f[] DIRECTIONS = {
        new Vector3f(1f, 0f, 0f),
        //new Vector3f(-1f, 0f, 0f)
    };

1611312125079.png


Und mit zwei Seiten:
1611312198079.png
 
temi

temi

Top Contributor
Einen Fehler habe ich bei der Berechnung des aktuellen Vertexindex gehabt:
Java:
int ixVertices = ixDirection * quadVertices.length * 3;
Aus einem Vektor werden ja drei Floats.

Der zweite Fehler lag bei den Indices. Da ja jeder Quad separat erzeugt wird, beginnt dessen Indexzuweisung auch immer wieder bei 0. Es wird hier ein Offset benötigt.
Java:
indices[ixIndices++] = index + ixDirection * quadVertices.length;

1611314653893.png


Ist zwar optisch keine Kugel, aber da fehlt nur eine entsprechende Korrektur der Perspektive.
 
Zuletzt bearbeitet:
temi

temi

Top Contributor
Der Vollständigkeit halber, hier noch der funktionierende Code für Quad und Sphere. Aus dem Code für die Sphere lässt sich ganz einfach ein Cube machen, indem die Normalisierung der Vertices weggelassen wird (Hier: Vector3f normalizedVertex = quadVertex.normalize();. Damit bleiben die Ebenen des Quad erhalten und werden nur kubisch angeordnet.


Quad:
import org.joml.Vector2f;
import org.joml.Vector3f;

public class Quad {

    private static final int MIN_RESOLUTION = 2;
    private final int resolution;
    private final Vector3f faceNormal;
    private final Vector3f axisA;
    private final Vector3f axisB;
    private Vector3f[] vertices;
    private int[] indices;

    public Quad(final int resolution, final Vector3f faceNormal) {
        this.resolution = resolution < MIN_RESOLUTION ? MIN_RESOLUTION : resolution;
        this.faceNormal = faceNormal.normalize();
        axisA = new Vector3f(faceNormal.y, faceNormal.z, faceNormal.x);
        axisB = new Vector3f(faceNormal).cross(axisA);
        create();
    }

    Vector3f[] getVertices() {
        return vertices;
    }

    int[] getIndices() {
        return indices;
    }

    public Mesh getMesh() {
        return new Mesh(vertices, indices);
    }

    private void create() {
        vertices = new Vector3f[resolution * resolution];
        indices = new int[(resolution - 1) * (resolution - 1) * 6];
        int ixVertices = 0;
        int ixIndices = 0;
        for (int y = 0; y < resolution; y++) {
            for (int x = 0; x < resolution; x++) {
                Vector2f percent = new Vector2f(x, y).div(resolution - 1);
                Vector3f a = new Vector3f(axisA).mul((percent.x - 0.5f) * 2);
                Vector3f b = new Vector3f(axisB).mul((percent.y - 0.5f) * 2);

                vertices[ixVertices] = new Vector3f(faceNormal).add(a).add(b);

                if (x < resolution - 1 && y < resolution - 1) {
                    indices[ixIndices++] = ixVertices;
                    indices[ixIndices++] = ixVertices + resolution + 1;
                    indices[ixIndices++] = ixVertices + resolution;
                    indices[ixIndices++] = ixVertices;
                    indices[ixIndices++] = ixVertices + 1;
                    indices[ixIndices++] = ixVertices + resolution + 1;
                }
                ixVertices++;
            }
        }
    }
}
Sphere:
import org.joml.Vector3f;

public class Sphere {

    private static final int MIN_RESOLUTION = 2;
    private final static Vector3f[] DIRECTIONS = {
            new Vector3f(1f, 0f, 0f), // right
            new Vector3f(0f, 1f, 0f), // top
            new Vector3f(0f, 0f, 1f), // front
            new Vector3f(-1f, 0f, 0f), // left
            new Vector3f(0f, -1f, 0f), // bottom
            new Vector3f(0f, 0f, -1f) // back
    };
    private final int resolution;
    private float[] vertices;
    private int[] indices;

    public Sphere(final int resolution) {
        this.resolution = Math.max(resolution, MIN_RESOLUTION);
        create();
    }

    public Mesh getMesh() {
        return new Mesh(vertices, indices);
    }

    private void create() {
        vertices = new float[resolution * resolution * 3 * (DIRECTIONS.length)];
        indices = new int[(resolution - 1) * (resolution - 1) * 6 * (DIRECTIONS.length)];

        for(int ixDirection = 0; ixDirection < DIRECTIONS.length; ixDirection++) {
            // create a new Quad for a given direction
            Quad quad = new Quad(resolution, DIRECTIONS[ixDirection]);

            // normalize and copy all vertices to the vertices array
            Vector3f[] quadVertices = quad.getVertices();
            int ixVertices = ixDirection * quadVertices.length * 3;
            for (Vector3f quadVertex : quadVertices) {
                Vector3f normalizedVertex = quadVertex.normalize();
                vertices[ixVertices++] = normalizedVertex.x;
                vertices[ixVertices++] = normalizedVertex.y;
                vertices[ixVertices++] = normalizedVertex.z;
            }

            // copy all indices to the indices array
            int[] quadIndices = quad.getIndices();
            int ixIndices = ixDirection * quadIndices.length;
            for(int quadIndex : quadIndices) {
                indices[ixIndices++] = quadIndex + ixDirection * quadVertices.length;
            }
        }
    }
}
 
Zuletzt bearbeitet:
H

httpdigest

Top Contributor
temi

temi

Top Contributor
Bitte immer darauf achten, dass im JOML alle Methoden, die keinen expliziten `dest` (out) Parameter haben, immer `this` aktualisieren, also keine neue Instanz zurückliefern. Hier wird also `quadVertex` selbst verändert.
Siehe: https://github.com/JOML-CI/JOML/wik...-a-dest-parameter-modify-this-and-return-this
(und natürlich immer die JavaDocs der Methoden lesen :) )
Danke für den Hinweis! :)

Da bin ich bei Quad schon drüber gestolpert, wo sich die Verschiebevektoren plötzlich geändert hatten.

Da du irgendwo erklärt hast, dass Computergrafik dein Steckenpferd ist, hast du einen Tipp, wie ich da eine Textur drüber legen kann?

Ich dachte an Cubemaps, aber bin noch am Probieren, wie ich überhaupt mit Texturen umgehen muss. Wie ganz oben geschrieben, sind das meine ersten Schritte in OpenGL. Immerhin habe ich jetzt schon mal die Projektions-, Welt- und Viewmatrix drin, so dass die Kugel jetzt auch eine Kugel ist und ich mich im Raum bewegen kann.
 
Zuletzt bearbeitet:
H

httpdigest

Top Contributor
Da du ja bereits irgendwo erklärt hast, dass Computergrafik dein Steckenpferd ist...
Nicht nur das, bin auch LWJGL Committer, hauptsächlich für das lwjgl3-demos Repository: https://github.com/LWJGL/lwjgl3-demos
Da sind für dich vielleicht interessante Sachen drin. Z.B. die hier: https://github.com/LWJGL/lwjgl3-demos/tree/main/src/org/lwjgl/demo/opengl/textures

In OpenGL gibt es aber unzählige Wege, dasselbe zu erreichen. Also z.B. nutzt du Shader? Nutzt du noch die alte fixed-function Pipeline? Nutzt du Vertex Array Objects mit Vertex Buffer Objects oder den immediate mode mit glBegin/glEnd, etc. etc.
 
temi

temi

Top Contributor
Nicht nur das, bin auch LWJGL Committer, hauptsächlich für das lwjgl3-demos Repository: https://github.com/LWJGL/lwjgl3-demos
Da sind für dich vielleicht interessante Sachen drin. Z.B. das hier: https://github.com/LWJGL/lwjgl3-dem.../demo/opengl/textures/SimpleTexturedQuad.java

In OpenGL gibt es aber unzählige Wege, dasselbe zu erreichen. Also z.B. nutzt du Shader? Nutzt du noch die alte fixed-function Pipeline? Nutzt du Vertex Array Objects mit Vertex Buffer Objects oder den immediate mode mit glBegin/glEnd, etc. etc.
Sehr cool!

Ich nutze LWJGL und Shader und VAOs und VBOs. Ich halte mich derzeit etwas an https://ahbejarano.gitbook.io/lwjglgamedev/, das scheint mir recht ordentlich zu sein. Ich habe mir aber heute auch "Learning OpenGL" von https://learnopengl.com/ heruntergeladen und bin da auf die Cubemaps gestoßen.

Ich muss allerdings jetzt erst mal noch ein paar Schritte zurück gehen und erst mal einfache Texturen ausprobieren.
 
H

httpdigest

Top Contributor
Nice! Na dann, viel Spass und Erfolg dabei! :)

Falls du nähere Fragen zu LWJGL und/oder OpenGL hast, die vielleicht zu spezifisch für java-forum.org sind, dann sind viele Leute auch aktiv bei:
- java-gaming.org
- forum.lwjgl.org
- slack.lwjgl.org (Registrierungsseite und Weiterleitung auf den LWJGL Slack Channel)
- und es gibt noch einen inoffiziellen LWJGL Discord Channel (meistens Minecraft-spielende Schulkinder mit Minecraft-problemen oder Minecraft-clone-Projekten)
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
P Audio Visualizer mit OpenGL in Java? Spiele- und Multimedia-Programmierung 4
Z Vlcj in OpenGL Spiele- und Multimedia-Programmierung 4
coolian opengl von scale in breite und höhe konvertieren Spiele- und Multimedia-Programmierung 23
F OpenGL (LWJGL) Shader Programmierung GLSL Spiele- und Multimedia-Programmierung 2
K Messdaten in Echtzeit darstellen in OpenGL Spiele- und Multimedia-Programmierung 4
J OpenGL Bild wird nicht richtig angezeigt Spiele- und Multimedia-Programmierung 2
B LWJGL OpenGL SIGSEGV auf Linux (Verzweiflung :/) Spiele- und Multimedia-Programmierung 8
KeexZDeveoper Fehler von OpenGL Spiele- und Multimedia-Programmierung 1
Kim_Dotcom libGDX - opengl Fehler Spiele- und Multimedia-Programmierung 5
Streeber Problem mit Transparenz/TextDrawing in LWJGL/Slick2d (OpenGL) Spiele- und Multimedia-Programmierung 1
RalleYTN OpenGL Context im JFrame? Spiele- und Multimedia-Programmierung 0
L OpenGL TransformationMatrix eines Flugzeugs Spiele- und Multimedia-Programmierung 2
F OpenGL - Transparenz mit Depth Peeling Spiele- und Multimedia-Programmierung 0
turing OpenGL / Jogle Code Reveiw zur Performance Verbesserung Spiele- und Multimedia-Programmierung 1
K LibGdx, Loadingscreen & Opengl context Spiele- und Multimedia-Programmierung 3
turing OpenGL VBO and Unfiform Handling Spiele- und Multimedia-Programmierung 1
B LWJGL / OPENGL Kriege Depth-Test nicht hin :( Spiele- und Multimedia-Programmierung 0
T opengl und Android.... Spiele- und Multimedia-Programmierung 3
D [OpenGL] Spiel in der Art von Age of Empires Spiele- und Multimedia-Programmierung 4
R LWJGL: OpenGL Fehler - weitere Informationen auslesen möglich? Spiele- und Multimedia-Programmierung 2
T Welche OpenGL-Version soll ich verwenden? Spiele- und Multimedia-Programmierung 2
O OpenGL - Texture falsch herum Spiele- und Multimedia-Programmierung 3
Gregorrr OpenGL & RCP/SWT Spiele- und Multimedia-Programmierung 3
P LWJGL oder OpenGL (C++) Spiele- und Multimedia-Programmierung 7
K Android: OpenGL render performance Tipps ? Spiele- und Multimedia-Programmierung 4
lumo opengl, sprites/tiles Spiele- und Multimedia-Programmierung 8
M OpenGL: Rectangle dort erstellen wo ich hintippe Spiele- und Multimedia-Programmierung 2
U OpenGl 1.1 (LWJGL GL11.*) und weiter? Spiele- und Multimedia-Programmierung 7
CookieSoft OpenGl Translatef Frage Spiele- und Multimedia-Programmierung 2
V Keine Ahnung von OpenGL! Hilfe wäre lieb! Spiele- und Multimedia-Programmierung 8
T 3D Stadtmodell mit OpenGL Spiele- und Multimedia-Programmierung 5
TheWhiteShadow OpenGL glDrawArrays Bufferfehler Spiele- und Multimedia-Programmierung 10
B LWJGL/OpenGL rendert manche Objekte nicht Spiele- und Multimedia-Programmierung 6
S OpenGL Textur unsauber Spiele- und Multimedia-Programmierung 2
T OpenGL ES verschwindene Vertices Spiele- und Multimedia-Programmierung 2
T Android OpenGL Bewegen Spiele- und Multimedia-Programmierung 5
R OpenGL Textur mit verschiedenen bit depths Spiele- und Multimedia-Programmierung 6
Helgon OpenGL Blend Frage Spiele- und Multimedia-Programmierung 18
A LWJGL/OpenGL und Text Spiele- und Multimedia-Programmierung 8
Helgon OpenGL vernünftige Tutorial? Spiele- und Multimedia-Programmierung 22
A OpenGL Textur und nicht Textur Spiele- und Multimedia-Programmierung 2
T Jmonkey opengl problem Spiele- und Multimedia-Programmierung 13
T Probleme mit Skysphere in Opengl Spiele- und Multimedia-Programmierung 4
M Problem mit Kamera (glMultMatrix (OpenGL/ LWJGL)/ Quaternionen) Spiele- und Multimedia-Programmierung 5
F Suche Tutorial zu "purem" OpenGL mit Java Spiele- und Multimedia-Programmierung 10
Kr0e OpenGL + glSubTexImage2D -> Bufferproblem Spiele- und Multimedia-Programmierung 3
F OpenGL Screenshot in iMove (als Greenscreen) => Farben invertiert? Spiele- und Multimedia-Programmierung 16
I Vergleich von Java3D und OpenGL Spiele- und Multimedia-Programmierung 17
F Mac: OpenGL Desktop-Screen aus Grafikkarte lesen Spiele- und Multimedia-Programmierung 2
F OpenGL 2D MouseClick/MouseMove Listener Spiele- und Multimedia-Programmierung 4
Kr0e Sehr schnelle Texturupdates (OpenGL) Spiele- und Multimedia-Programmierung 3
Kr0e OpenGL beliebige Texturgröße Spiele- und Multimedia-Programmierung 2
BattleMaster246 OpenGL - Transparenz Spiele- und Multimedia-Programmierung 10
Kr0e OpenGL .. Pixel Buffer Objekt oder Frame Buffer Object? Spiele- und Multimedia-Programmierung 2
Y JOGL / OPENGL in Frame Spiele- und Multimedia-Programmierung 11
A Problem openGL-Pipeline mit Win7? Spiele- und Multimedia-Programmierung 6
G OpenGL boolesche operation auf Rechtecke Spiele- und Multimedia-Programmierung 15
A JOGL / OpenGL Spiele- und Multimedia-Programmierung 7
G API für 3d-Programmierung? OpenGL? Spiele- und Multimedia-Programmierung 12
J OpenGL (JOGL) - Radial Blur Effekt (Glow) Spiele- und Multimedia-Programmierung 2
J Opengl Texture laden Null Pointer Exception Spiele- und Multimedia-Programmierung 6
J netbeans opengl keyPressed(KeyEvent evt) benutzen Spiele- und Multimedia-Programmierung 4
J netbeans opengl gluPerspective und gluLookAt Verständnis Spiele- und Multimedia-Programmierung 13
S glTexSubImage2D()-Fragen(Zerstörbares Terrain, OpenGL) Spiele- und Multimedia-Programmierung 3
Z Suche Tutorial zum Einstieg in OpenGl mit Java (JOGL) Spiele- und Multimedia-Programmierung 2
T Overlay in anderer OpenGL Anwendung Spiele- und Multimedia-Programmierung 4
egrath Vista OpenGL Performance Problem? Spiele- und Multimedia-Programmierung 3
Y OpenGL Spiele- und Multimedia-Programmierung 5
J opengl beispiele? Spiele- und Multimedia-Programmierung 10
D Java mit OpenGL - besser LWJGL oder JOGL? Spiele- und Multimedia-Programmierung 6
N OpenGL und DirectX - was genau ist das? Spiele- und Multimedia-Programmierung 5
C OpenGl Support für Applet (sun.java2d.opengl=True) Spiele- und Multimedia-Programmierung 3
B OpenGL oder Direct X Spiele- und Multimedia-Programmierung 9
H Mausbewegungen wie eine echte Maus in 3 dimensionalen Spielen Spiele- und Multimedia-Programmierung 12
Taknax Versuche eine Mod von 1.11.2 in 1.12.2 zu porten. Spiele- und Multimedia-Programmierung 1
J noch eine Runde spielen? Spiele- und Multimedia-Programmierung 6
K Wie bekomme ich eine Transition für alle Objekte zum stoppen? Spiele- und Multimedia-Programmierung 1
P Wie kann ich einem Programm hinter eine GUI verstecken? Spiele- und Multimedia-Programmierung 12
J Wie kann man eine grafische Oberfläche erzeugen um eine Textdatei auswählen zu können ?? Spiele- und Multimedia-Programmierung 1
D Iterieren durch einen Ordner mit Audiodateien und verketten eine andere Audiodatei Spiele- und Multimedia-Programmierung 17
C Eine eigene 3d Engine : Shader - aber wie ? Spiele- und Multimedia-Programmierung 2
MABY Eine mp3 Datei in Java abspielen Spiele- und Multimedia-Programmierung 14
B Mit Swing eine Grafische Oberfläche erstellen Spiele- und Multimedia-Programmierung 1
X Minecraft Wie kann ich eine Karte erstellen wie zb:(Bei Minecraft) Spiele- und Multimedia-Programmierung 1
M Wie kann man die Auflösung eine fertigen Programms ändern? Spiele- und Multimedia-Programmierung 1
Furtano Vektoren für Bewegung für eine 2D-Simulation Spiele- und Multimedia-Programmierung 3
TheSorm Collision an einer bestimmten Seite eine Rectangles abfragen Spiele- und Multimedia-Programmierung 3
T Sinusgenerator für eine Hp Spiele- und Multimedia-Programmierung 8
S eine nullpointerexception, wo sie nicht sein sollte Spiele- und Multimedia-Programmierung 12
N Webanwendung als eine Art Spiel Spiele- und Multimedia-Programmierung 8
M Eine Art "Vier Gewinnt" Spiele- und Multimedia-Programmierung 5
B j3d Rotation um mehr als eine Achse Spiele- und Multimedia-Programmierung 9
M Methoden eine Map zu zeichnen Spiele- und Multimedia-Programmierung 5
2 Eine Java App als Midi Device? Spiele- und Multimedia-Programmierung 2
W 3D-APIs für Java - Eine Übersicht Spiele- und Multimedia-Programmierung 8
M Wavefront Object Loader zeigt nur eine Textur an. Spiele- und Multimedia-Programmierung 7
D Problem beim Öffnen einer PHP für eine Highscore Spiele- und Multimedia-Programmierung 5
R JLayer player spielt nur eine mp3 Datei ab Spiele- und Multimedia-Programmierung 1
M Variable die eine Klasse enthält ändern Problem Spiele- und Multimedia-Programmierung 16
G Was genau ist eine Grafikengine? Spiele- und Multimedia-Programmierung 14

Ähnliche Java Themen

Anzeige

Neue Themen


Oben