Du bist nicht angemeldet.

JuKu

Profi

  • »JuKu« ist der Autor dieses Themas

Beiträge: 574

Registrierungsdatum: 29.09.2011

Danksagungen: 48

  • Private Nachricht senden

1

04.01.2014, 13:24

1. Ein 3D Spiel in Java mit einer kleinen Einführung in 3D mit Java

Hallo liebe DevTa Mitglieder,

Ich habe mich entschlossen, mal wieder eine Tutorialreihe zu beginnen, da die alte auch großen Zuspruch bei euch gefunden hat.
Diesmal zum Thema "Java und 3D", mit einer kleinen Grundlegenden Einführung in Java und 3D, und Sachen, die anderen genauso schwer fallen, wenn sie mit Java und 3D beginnen um vllt. ein großes 3D Spiel in Java zu entwickeln.

Vorerst aber noch, was ihr dazu braucht und evtl. installieren solltet:
  • Eine Entwicklungsumgebung für Java eurer Wahl
  • Die jMonkeyEngine, da ich darauf aufbaue
  • Google Sketchup, da diese Anwendung meiner Meinung nach vorallem für Anfänger sehr gut geeignet ist, um einfache Meshs zu erzeugen
  • Viel Gedult und vorallem Spaß!!!


Vorerst noch zu mir.
Ich selber habe ebenfalls erst mit Java und 3D angefangen und weiß noch nicht alles!
Ich kann also nur meinen aktuellen Wissensstand hier vermitteln und kann auch nicht auf jede Kleinigkeit eingehen, da dies hier den Rahmen sprengen würde.
Außerdem hoffe ich sehr auf Kritik, Vorschläge und zahlreiche Ideen, die diese Tutorialreihe voranbringen sollen.
Übrigens setze ich ein paar Java Kentnisse voraus, falls ich das oben noch nicht erwähnt haben sollte.
Ich selbst möchte übrigens ebenfalls ein 3D Spiel in Java programmieren und habe mein Konzept an ein Buch angelegt.
Sozusagen wird das 3D Spiel in Java eine Art Simulationsspiel, welches sich an das Buch anlehnt.

Mein kleines Spiel Konzept
Bevor ihr loslegt, ein 3D Spiel in Java zu programmieren, solltet ihr euch ein kleines Konzept überlegen.
Mein Konzept für das 3D Spiel in Java ist wie gesagt an die Bücherserie "Mystery Park" von Andreas Schreiner angelegt.
Hier mal der Text, der auf dem Cover steht:

Zitat

"Mystery Park" ist ein riesiger Freizeitpark, der nur den Kids gehört: Die "Freaks", die besten Computerhacker weit und breit, sorgen dafür, dass es kein Chaos gibt. Eine grandiose Hightechausrüstung und ein hypermodernes Computernetzwerk helfen ihnen den "Mystery Park" zu steuern. Ein Unbekannter Superhacker macht den "Freaks" das Leben schwer. Immer fordert er sie heraus zu einer atemberaubenden Rätseljagd über Wasser und durch wegelose Schungel, durch Dateien und streng geheime Schaltzentralen. Fesselnde Abenteuer im ungewöhnlichsten Freizeitpark der Welt. www.generation-future.de Das Forum zum Buch


Da die Beschreibung auf dem Buchcover meist nicht so wirklich was über das Buch verrät, hier nochmal eine kleine Zusammenfassung von mir.

Zitat

Im Buch geht es um einen Freizeitpark nur für Kids. Hierbei gibt es 2 Teile, wie ihr auch auf der Webseite entnehmen könnt. Es gibt den Mystery Park, einen Park für alle Kinder unter 16 Jahren und Aurora, für die Älteren. Dieser Freizeitprak kostet nichts und es sind überall kleine Rätsel versteckt, die es zu lösen gibt. Eig. ist der Roman für Computerbegeisterte, wenn man es so nimmt, da im Park vieles durch Computer gesteuert wird, z.B. alle Pumpenanlagen, Sicherheitssysteme und vieles mehr. Außerdem soll man Passworte hacken können, um z.B. Zugang zur UBahn erhalten zu können usw.


Natürlich kann ich das Buch Konzept nicht direkt auf das Spiel übertragen.
Ich möchte deshalb das Spiel als Netzwerkspiel aufbauen, wo es einen Server und mehrere Clients gibt und die Spieler zusammenspielen müssen.
Im Park geht auch öfters mal was kaputt, was es zu reparieren gilt.
Außerdem soll ein komplettes Computernetzwerk simuliert werden und wie im Buch möchte ich auch hier eine Chatterbot KI programmieren.
Nun aber genug zum Konzept, ich möchte euch ja hier etwas über 3D in Java erzählen und euch nicht mit dem Konzept langweilen.
Ich werde auch nicht darauf eingehen, wie man das komplette Spiel hier programmiert, da sich da später vermutlich auch noch ein Team bilden wird.
Ich möchte hier nur die grundlegendsten Dinge vermitteln, die ihr unbedingt braucht, um ein 3D Spiel in Java zu programmieren.
Und eins solltet ihr noch wissen, nämlich dass es am Anfang gar nicht so einfach ist, ein 3D Spiel in Java zu programmieren.

Wozu jMonkeyEngine? Reicht nicht Java alleine auch aus?
Diese Frage habe ich mir am Anfang auch gestellt.
Zuerst solltet ihr wissen, dass ihr zwar 3D Modelle erstellt, der Computer selbst diese aber wieder in 2D umrechnet, da die normalen Monitore nur 2D Grafiken darstellen können.
Diese Arbeit übernimmt ein sogenannter Renderer.
Das "3D Rendering" ist also der Computer Grafik Prozess um 3D Modelle in 2D Grafiken zu konvertieren und dabei Effekte mit zu berücksichtigen.
Außerdem werden dabei Reflektionen, Schatten von dem Renderer berücksichtigt und evtl. mitgezeichnet.
Eine 3D Gameengine (Engine bedeutet soviel wie Motor) ist ein spezielles Framework für Computerspiele, die den Spielverlauf steuern und für die visuelle Darstellung des Spielablaufes verantwortlich ist (Quelle: Wikipedia). So eine 3D Gameengine nimmt den Programmierer viel Arbeit ab und kann sich nochmal in Grafikengine, Physikengine usw. unterteilen.

Eine Grafikengine beinhaltet meist folgende Werkzeuge:
  • Funktionen zum Laden, Verwalten und Anzeigen von Texturen beziehungsweiße Sprites.
  • Textausgabe
  • Effekte wie Feuer, Explosionen, Wasser, Schnee, Nebel
  • Funktionen zum Laden, Verwalten, Darstellen und Animieren von 3D Modellen sowie ein Shadersystem zur möglichst realisitischen Darstellung der Wirkung von Licht und Schatten auf verschiedene Materialien (beispielsweiße Metall, Holz oder Haut)


Wer nun immer noch nicht verstanden hat, was eine Grafikengine macht, kann das nochmal unter http://de.m.wikipedia.org/wiki/Spiel-Engine nachlesen.

Nun gibt es für Java sogar mehrere Gameengines, z.B. Java3D oder die jMonkeyEngine.
Ich werde im folgenden die jMonkeyEngine verwenden, da diese sehr gute Werkzeuge für Entwickler sowie eine eigene angepasste Entwicklungsumgebung (wobei diese auf einer anderen aufsetzt) mitliefert, in der ihr viele einfache Dinge gleich tun könnt. Außerdem ist Java3D nur für kleine Sachen geeignet, da sie von der Performance her nicht sehr gut ist.
Die jMonkeyEngine soll hingegen sehr schnell laufen und laut einigen Berichten sogar dank der OpenGL Unterstützung mit den hardwarenahen Programmiersprachen wie C oder C++ mithalten können.
Außerdem ist die jMonkeyEngine eine Gameengine, die sehr viele nützliche Werkzeuge mitbringt und dem Programmierer viel Arbeit abnimmt.
Sie ist übrigens auch in Java geschrieben und wird ständig erweitert und ist auf sehr Ressourcenfressende Spiele ausgelegt, was uns als Entwickler nur freuen kann.

Der erste Code mit der jMonkeyEngine
Als erstes müsst ihr euch nun die jMonkeyEngine herunterladen und installieren.
Nachdem ihr dies getan habt, erstellt ihr ein neues Projekt.



Nachdem ihr dies getan habt, fügt ihr folgenden Code ein.

Java-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
package jme3test.helloworld;
 
import com.jme3.app.SimpleApplication;
import com.jme3.material.Material;
import com.jme3.math.Vector3f;
import com.jme3.scene.Geometry;
import com.jme3.scene.shape.Box;
import com.jme3.math.ColorRGBA;
 
/** Sample 1 - how to get started with the most simple JME 3 application.
 * Display a blue 3D cube and view from all sides by
 * moving the mouse and pressing the WASD keys. */
public class HelloJME3 extends SimpleApplication {
 
    public static void main(String[] args){
        HelloJME3 app = new HelloJME3();
        app.start(); // start the game
    }
 
    @Override
    public void simpleInitApp() {
        Box b = new Box(1, 1, 1); // create cube shape
        Geometry geom = new Geometry("Box", b);  // create cube geometry from the shape
        Material mat = new Material(assetManager,
          "Common/MatDefs/Misc/Unshaded.j3md");  // create a simple material
        mat.setColor("Color", ColorRGBA.Blue);   // set color of material to blue
        geom.setMaterial(mat);                   // set the cube's material
        rootNode.attachChild(geom);              // make the cube appear in the scene
    }
}


Bitte verzeiht es mir, wenn der Codestil hier nicht so übernommen wird, das liegt leider am Forum.
Diesen Code habe ich von der jMonkeyEngine Seite aus übernommen.
Wie ihr seht, wird in der main() Methode eine neue Instanz der Klasse erzeugt und diese dann gestartet.
Die Methode start() wird hierbei von der jMonkeyEngine geliefert, da die Klasse ja von der Klasse SimpleApplication erbt, und darf nicht überschrieben werden.
Damit werden dann diverse Threads gestartet, die sich um die Grafik usw. kümmern und dann wird die Methode simpleInitApp() aufgerufen.
Diese Methode wird nur beim Start der Methode aufgerufen und dabei könnt ihr eure 3D Modelle laden und hinzufügen.
In diesem Fall wird mit

Java-Quelltext

1
Box b = new Box(1, 1, 1); // create cube shape
eine einfache Box erzeugt.
Danach wird mit

Java-Quelltext

1
Geometry geom = new Geometry("Box", b);  // create cube geometry from the shape
eine Geometrie erzeugt.
Die jMonkeyEngine Seite spuckt dazu folgendes aus.

Zitat

Geometry defines a leaf node of the scene graph. The leaf node contains the geometric data for rendering objects. It manages all rendering information such as a Material object to define how the surface should be shaded and the Mesh data to contain the actual geometry.


Zitat

Geometry defines a leaf node of the scene graph. The leaf node contains the geometric data for rendering objects. It manages all rendering information such as a Material object to define how the surface should be shaded and the Mesh data to contain the actual geometry.


Die Box wird nun zu der Geometry hinzugefügt und es wird noch ein Name vergeben, in diesem Fall der Name Box.
Danach wird mit

Java-Quelltext

1
2
Material mat = new Material(assetManager,
          "Common/MatDefs/Misc/Unshaded.j3md");  // create a simple material
ein Material geladen.
Jedes 3D Objekt in einem Spiel besteht nicht nur aus dem Mesh, also der Form, sondern auch aus einem Material, z.B. Metall, Holz usw.
Dieses Material sagt in diesem Fall der jMonkeyEngine, wie sie Reflektionen und Schatten darstellen soll, ob das Material lichtdurchlässig oder lichtundurchlässig ist usw.
Nun kann man dem Mesh, in diesem Fall die Box, noch eine Texture oder eine Farbe geben, in diesem Fall wird mit

Java-Quelltext

1
mat.setColor("Color", ColorRGBA.Blue);   // set color of material to blue
der Box die Farbe blau gegeben.
Nun wird mit

Java-Quelltext

1
geom.setMaterial(mat);                   // set the cube's material
der jMonkeyEngine noch gesagt, dass sie für diese Geometry, die den Mesh Box enthält, das oben angegebene Material verwenden soll.
Zuletzt wird das Geometry Objekt mit der Box und den Material Definitionen noch mit

Java-Quelltext

1
rootNode.attachChild(geom);              // make the cube appear in the scene
zum rootNode, also der Spielwelt hinzugefügt.

Das wars erstmal zu dem Code von oben.
Ihr könnt nun gespannt sein, über was ich im nächsten Post schreibe.
Wenn euch mein Beitrag weitergeholfen hat, drückt auf "Bedanken"!
Danke! :D

Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von »JuKu« (04.01.2014, 14:28)


Es haben sich bereits 4 registrierte Benutzer bedankt.

Benutzer, die sich für diesen Beitrag bedankt haben:

Patrick (04.01.2014), Erik (04.01.2014), Simon (05.01.2014), Alex (05.01.2014)

Erik

Profi

Beiträge: 1 274

Registrierungsdatum: 22.06.2011

Wohnort: Deutschland ;)

Danksagungen: 307

  • Private Nachricht senden

2

04.01.2014, 22:41

Gutes Tutorial :)
jMonkey ftw :D SketchUp naja... hab damit auch angefangen, ist aber net so geil :D

Solltest vielleicht oben die Sachen, die man installieren muss, verlinken ;D

Die Erklärungen, zB was Rendern ist, find ich sehr gut :)
Später sollte vllt auch noch ne Erklärung kommen, was der SceneGraph überhaupt ist. Da gabs glaub ich bei jME sone coole Flash-Animation zu :D

Oh, und das eine Zitat ist irgendwie doppelt ;D

LG
Beste Webite im Internet ( ͡° ͜ʖ ͡°)
xinra.de

JuKu

Profi

  • »JuKu« ist der Autor dieses Themas

Beiträge: 574

Registrierungsdatum: 29.09.2011

Danksagungen: 48

  • Private Nachricht senden

3

07.01.2014, 19:00

Danke für das Feedback!
Ich werde das noch machen, sobald ich die Zeit dafür habe, vllt. morgen schon.
Wenn euch mein Beitrag weitergeholfen hat, drückt auf "Bedanken"!
Danke! :D

Johannes S.

Fortgeschrittener

Beiträge: 444

Registrierungsdatum: 24.06.2011

Wohnort: Lychen

Danksagungen: 71

  • Private Nachricht senden

4

08.01.2014, 20:58

Es ist etwas verwirrend, dass der 2. Teil in einer Unterkategorie ist und der erste nicht^^
Es währe glaube ich ganz gut, wenn sich jemand finden würde, der das Thema in die Unterkategorie verschiebt.
Signatur ?

Erik

Profi

Beiträge: 1 274

Registrierungsdatum: 22.06.2011

Wohnort: Deutschland ;)

Danksagungen: 307

  • Private Nachricht senden

5

08.01.2014, 22:01

Hab das mal gemacht :)
Beste Webite im Internet ( ͡° ͜ʖ ͡°)
xinra.de

Es hat sich bereits 1 registrierter Benutzer bedankt.

Benutzer, die sich für diesen Beitrag bedankt haben:

Johannes S. (09.01.2014)

JuKu

Profi

  • »JuKu« ist der Autor dieses Themas

Beiträge: 574

Registrierungsdatum: 29.09.2011

Danksagungen: 48

  • Private Nachricht senden

6

10.01.2014, 20:40

Das wollte ich machen, aber es ging irgendwie nicht.
Meine Moderatorenrechte haben da irgendwie nicht gestimmt gehabt.
Wenn euch mein Beitrag weitergeholfen hat, drückt auf "Bedanken"!
Danke! :D

Ähnliche Themen