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:
"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.
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.
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.
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.