zum Beispiel-Applet
Meine kleine 3D-Engine diente mir dem Erlernen von Java. Als Ziel hatte ich diese Sammlung an Klassen, mit denen man 3D-Objekte erzeugen und anzeigen kann.
Erstmal ein kleiner Überblick der Klassen und deren Eigenschaften / Fähigkeiten:
| Überblick der Klassen | | Klasse | Beschreibung |
| object3d | Eine Instanz dieser Klasse symbolisiert das eigendliche 3D-Objekt |
| cam3d | Mit Hilfe eines cam3d-Objektes wird ein 3D-Objekt angezeigt |
die folgenden Klassen werden von object3d und cam3d benutzt |
| point3d | ein 3-dimensionaler Punkt |
| point2d | ein 2-dimensionaler Punkt |
| line3d | eine 3-dimensionale Linie zwischen zwei 3-dim. Punkten |
| area3d | eine Fläche zwischen 3-dimensionalen Punkten |
von object3d abgeleitete Klassen |
| cube3d | erzeugt einen Würfel |
| sphere3d | erzeugt eine Kugel |
|
Wie in dieser Übersicht erkennbar ist, wird ein Objekt vom Typ object3d und eins vom Typ cam3d benötigt. Ein object3d-Objekt besteht aus einer jeweils unbegrenzten Anzahl von:
point3d-Punkten
point2d-Punkten
line3d-Linien
area3d-Flächen.
Die Punkte, die zu einer Linie, bzw. Fläche gehören werden nicht durch deren Koordinaten, sondern durch den Index des Punktes in der Liste der 3D-Punkte gespeichert.
Legt man ein object3d-Objet an, so erzeugt man zuerst die benötigten Punkte, und erzeugt dann Linien und Flächen unter Benutzung der entsprechenden Indizes der Punkte.
Demnach hat man mit den Klassen point3d, point2d, line3d und area3d eigendlich keinen Kontakt, sie werden volständig vom object3d-Objekt verwaltet.
Um mit den Klassen arbeiten zu können hier nun die ausführlich Referenz:
| Klassenreferenz | | Klasse | Methode und Beschreibung |
| object3d |
object3d()
Konstruktor, erzeugt ein leeres object3d-Objekt
void addPoint(double x, double y, double z)
Fügt dem 3D-Objekt einen 3-dimensionalen Punkt mit den Koordinaten (x,y,z) hinzu.
void addLine(int P1, int P2)
Fügt dem 3D-Objekt eine 3-dimensionale Linie zwischen den Punkten P1 und P2 hinzu.
void addArea(int p1, int p2, int p3, int p4, Color col)
Fügt eine Fläche mit 4 Eckpunkten hinzu. Die Eckpunkte werden durch die Indizes der Punkte identifiziert. Der zu erst angelegte Punkt hat den Index 0.
Sollten nur drei Punkte benötigt werden, so kann der dritte Punkt als vierter Punkt angegeben werden.
Die Klasse Color wird durch import java.awt.Color; eingebunden.
void show(Graphics g, cam3d cam)
Zeigt das Objekt mit der Perspektive von cam an. Das Objekt g erhält man unter anderem in der Methode paint(Graphics g) eines Applets.
|
| Klasse | Methode und Beschreibung |
| cam3d |
cam3d()
Konstruktor, erzeugt ein neues cam3d-Objekt mit vernünftigen Anfangswerten
cam3d(double phixz, double phiy)
Konstruktor, erzeugt ein neues cam3d-Objekt mit den Winkeln phixz und phiy.
void setPhiXZ(double phi)
void setPhiY (double phi)
Setzt den Winkel PhiXZ bzw. PhiY.
void movPhiXZ(double phi)
void movPhiY (double phi)
Verändert den Winkel PhiXZ bzw. PhiY um den Winkel phi.
double getPhiXZ()
double getPhiY ()
Gibt den aktuellen Wert von PhiXZ bzw. PhiY zurück.
|
|
Mit den Methoden movPhiXZ und movPhiY wird die Blickrichtung der Kamera verändert. Mit diesem Beispiel-Applet wird die einfache Funktionsweise dargestellt. Es wird eine Kugel angezeigt:
import java.awt.*;
import java.awt.event.*;
public class space extends java.applet.Applet {
sphere3d sphere=new sphere3d();
cam3d cam=new cam3d();
int oldx=-1;
int oldy=-1;
public void paint(Graphics g){
sphere.show(g,cam);
}
// mouseDrag ist nur zur Bewegung des Objektes zuständig
public boolean mouseDrag(Event e, int x, int y) {
if(oldx==-1){oldx=x;}
if(oldy==-1){oldy=y;}
if(x>oldx){ cam.movPhiXZ(0.01); }
if(x<oldx){ cam.movPhiXZ(-0.01); }
if(y>oldy){ cam.movPhiY(0.01); }
if(y<oldy){ cam.movPhiY(-0.01); }
oldx=x; oldy=y;
repaint();
return true;
}
} |
Mit sphere3d sphere=new sphere3d(); wird ein 3D-Objekt angelegt, cam3d cam=new cam3d(); ist für die Perspektive zuständig und mit sphere.show(g,cam); wird das Objekt angezeigt.
Download der Klassen (8 kByte Zip)
|