Hey Leute, ich habe quasi "gerade erst angefangen", mich mit JAVA3D zu befassen und hocke nun bei einem Transformproblem.
Mein Ziel bzw. die Aufgabenstellung:
1. Pinguin (Madagaskar-alike) in Cinema4D erstellen.
2. Via VRML97 bzw. 3dsloader in Java3D laden
3. Picking
4. Arm des Pinguins soll salutieren können.
Die ersten 3 Punkte habe ich jetzt nach einigen Mühen umschifft, beim vierten Punkt habe ich aber kaum einen Ansatz da. Also ich habe das Objekt in Java3d, kann auch einzelne Unterobjekte (z.B. Arm_L, Arm_R) identifizieren. Jetzt weiß ich nicht, wie ich diese bewege. Ich hau hier mal meinen Code rein, vielleicht kann mir ja jemand helfen. Für generelle Optimierungsvorschläge bin ich natürlich auch immer zu haben, da ich mich an einem Tutorial entlanggehangelt habe kann es sein, dass das alles unschöner nonsens ist - aber es funktioniert bis dahin
Der vielleicht besseren Lesbarkeit halber auch nochmal als Pastebin: [Java] /* * <b>EinfacherVRMLLoader.java</b> * * Ermoeglicht Laden und Objekt-Pi - Pastebin.com
Also schonmal vielen Dank im Voraus, ich hoffe ihr könnt mir helfen. Ich lade mir derweil mal PDFs über Transformgroups herunter. Problem ist, dass ich das bis morgen fertig haben möchte. Aber, klar, am besten schon gestern. Ich hab aber halt das Gefühl, dass das nicht mehr allzu schwer ist, ich nur nicht den richtigen Ansatz finde.
Liebe Grüße!
Mein Ziel bzw. die Aufgabenstellung:
1. Pinguin (Madagaskar-alike) in Cinema4D erstellen.
2. Via VRML97 bzw. 3dsloader in Java3D laden
3. Picking
4. Arm des Pinguins soll salutieren können.
Die ersten 3 Punkte habe ich jetzt nach einigen Mühen umschifft, beim vierten Punkt habe ich aber kaum einen Ansatz da. Also ich habe das Objekt in Java3d, kann auch einzelne Unterobjekte (z.B. Arm_L, Arm_R) identifizieren. Jetzt weiß ich nicht, wie ich diese bewege. Ich hau hier mal meinen Code rein, vielleicht kann mir ja jemand helfen. Für generelle Optimierungsvorschläge bin ich natürlich auch immer zu haben, da ich mich an einem Tutorial entlanggehangelt habe kann es sein, dass das alles unschöner nonsens ist - aber es funktioniert bis dahin
Java:
/*
* <b>EinfacherVRMLLoader.java</b>
*
* Ermoeglicht Laden und Objekt-Picking in der Szene
* Objektname erscheint als Konsolenausgabe
*
*/
package pinguin;
import java.awt.*;
import java.awt.event.*;
import java.util.Enumeration;
import java.util.Hashtable;
import javax.swing.JFrame;
import com.sun.j3d.utils.picking.PickCanvas;
import com.sun.j3d.utils.picking.PickResult;
import com.sun.j3d.utils.picking.PickTool;
import com.sun.j3d.utils.universe.*;
import com.sun.j3d.utils.behaviors.mouse.MouseRotate;
import com.sun.j3d.utils.behaviors.mouse.MouseZoom;
import com.sun.j3d.utils.behaviors.mouse.MouseTranslate;
import com.sun.j3d.utils.geometry.ColorCube;
import javax.media.j3d.*;
import javax.vecmath.*;
import com.sun.j3d.loaders.Scene;
import com.sun.j3d.loaders.vrml97.VrmlLoader;
/**
* Hauptklasse des Programms, implementiert die gesamte Szene des Programms.
*/
public class EinfacherVRMLLoader extends JFrame implements ActionListener,MouseListener {
private static final long serialVersionUID = 1L;
public Scene scene = null;
public String WRL_File = null;
Canvas3D canvas;
SimpleUniverse universe;
TransformGroup vpTransGroup;
VrmlLoader loader;
View view;
BranchGroup sceneRoot;
TransformGroup examineGroup;
BranchGroup sceneGroup;
BoundingSphere sceneBounds;
DirectionalLight headLight;
PointLight pointLight;
AmbientLight ambLight;
Cursor waitCursor;
Cursor handCursor;
PickCanvas pickCanvas;
TextField textField;
/**
* Definition der Fenstereigenschaften und der Position der Szenenkamera
*
*/
public EinfacherVRMLLoader() {
// Mechanismus zum Schliessen des Fensters und beenden des Programms
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLayout(new BorderLayout());
GraphicsConfiguration config = SimpleUniverse.getPreferredConfiguration();
canvas = new Canvas3D(config);
add("Center",canvas);
waitCursor = new Cursor(Cursor.WAIT_CURSOR);
handCursor = new Cursor(Cursor.HAND_CURSOR);
// Universum anlegen
universe = new SimpleUniverse(canvas);
ViewingPlatform vp = universe.getViewingPlatform();
vpTransGroup = vp.getViewPlatformTransform();
Viewer viewer = universe.getViewer();
view = viewer.getView();
// Pinguin laden
WRL_File="Pinguin_M6_bereit2.wrl";
// Hier wird die Szene geladen....
init_wrl(WRL_File);
// Hier wird die Beleuchtung und die Mausinteraktion eingerichtet
setupBehavior();
// Hier wird die geladene Szene aufgeschlüsselt und das Picking initiiert
// und Bewegung durch Behavior
gotoLocation();
setTitle("Laden von Objekten + Picking | Beuckmann, Werner");
setSize(800,800);
// Anweisungstext an Fensterunterkante schreiben
Label label = new Label("Kameraeinstellung:"
+ " li.Maustaste: Rotation, "
+ " re.Maustaste: Translation, "
+ " Alt + li.Maustaste: Zoom");
// South in Fensterunterkante
getContentPane().add("South", label);
// Pinguin in die Mitte vom Fenster
getContentPane().add("Center", canvas);
setVisible(true);
}
/* (non-Javadoc)
* @see java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent)
*/
public void actionPerformed(ActionEvent ae) {
//gotoLocation(textField.getText());
}
/**
* Importieren der wrl-Datei
*
* @param wrl_file Dateiname als String.
*/
public void init_wrl(String wrl_file) {
loader = new VrmlLoader();
System.out.println("Aus dieser Datei wird gelanden: "+WRL_File);
try {
// geladener Pinguin
scene = loader.load(wrl_file);
if (scene != null) System.out.println("Datei mit der Szene wurde geladen");
} catch (Exception e) {
System.out.println("Fehler! Scene nicht gefunden:");
}
}
/**
* Mausverhalten, Beleuchtung
*/
private void setupBehavior() {
// der Grundstein...
sceneRoot = new BranchGroup();
sceneRoot.setCapability(BranchGroup.ALLOW_CHILDREN_EXTEND);
sceneRoot.setCapability(BranchGroup.ALLOW_CHILDREN_READ);
sceneRoot.setCapability(BranchGroup.ALLOW_CHILDREN_WRITE);
// Hintergrundfarbe setzen
Background background = new Background();
background.setColor(1.0f,1.0f,1.0f); // weiss
// die "gebundene Kugel" - Sphaere
BoundingSphere bounds = new BoundingSphere(new Point3d(0.0,0.0,0.0), Double.MAX_VALUE);
background.setApplicationBounds(bounds);
sceneRoot.addChild(background);
// diese TG erlaubt "Child"-Elemente, sich an die Gruppe
// anzuhaengen und deren Inhalte zu Lesen
examineGroup = new TransformGroup();
examineGroup.setCapability(TransformGroup.ALLOW_CHILDREN_EXTEND);
examineGroup.setCapability(TransformGroup.ALLOW_CHILDREN_READ);
examineGroup.setCapability(TransformGroup.ALLOW_CHILDREN_WRITE);
examineGroup.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);
examineGroup.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
sceneRoot.addChild(examineGroup);
BoundingSphere behaviorBounds = new BoundingSphere(new Point3d(0.0, 0.0, 0.0),10000.0f);
// Definition von Maus-Aktionen fuer die komplette Szene...
MouseRotate mr = new MouseRotate();
mr.setTransformGroup(examineGroup);
mr.setSchedulingBounds(behaviorBounds);
sceneRoot.addChild(mr);
MouseTranslate mt = new MouseTranslate();
mt.setTransformGroup(examineGroup);
mt.setSchedulingBounds(behaviorBounds);
sceneRoot.addChild(mt);
MouseZoom mz = new MouseZoom();
mz.setTransformGroup(examineGroup);
mz.setSchedulingBounds(behaviorBounds);
sceneRoot.addChild(mz);
// ein wenig Licht ins Dunkel bringen...
// Beleuchtung erzeugen
BoundingSphere lightBounds = new BoundingSphere(new Point3d(0.0, 0.0, 0.0), 10000.0f);
ambLight = new AmbientLight(true, new Color3f(0.0f, 0.0f, 1.0f));
ambLight.setInfluencingBounds(lightBounds);
ambLight.setCapability(Light.ALLOW_STATE_WRITE);
//sceneRoot.addChild(ambLight); // Licht wirkt blau hiermit... unschoen!
headLight = new DirectionalLight();
headLight.setCapability(Light.ALLOW_STATE_WRITE);
headLight.setInfluencingBounds(lightBounds);
sceneRoot.addChild(headLight);
Color3f pointColour= new Color3f(1.0f,1.0f,1.0f);
Point3f pointPosition =new Point3f(1.0f,1.0f,1.0f);
Point3f pointAbn = new Point3f(1.0f,0.0f,1.0f);
pointLight = new PointLight(pointColour,pointPosition,pointAbn);
pointLight.setInfluencingBounds(lightBounds);
sceneRoot.addChild(pointLight);
universe.addBranchGraph(sceneRoot);
}
/**
* Die zu pickenden Objekte in die Hashtabelle laden und
* an den Szenengraphen anhaengen
*/
public void gotoLocation() {
canvas.setCursor(waitCursor);
// Fehlerfall abfangen
if (sceneGroup != null) {
sceneGroup.detach();
}
if (scene != null) {
System.out.println("geladene Szene aufschluesseln, Picking initiieren");
Hashtable obj = scene.getNamedObjects();
BoundingSphere bounds = new BoundingSphere(new Point3d(0.0, 0.0,0.0), Double.MAX_VALUE);
Enumeration eval = obj.elements();
Enumeration ekey = obj.keys();
if (eval != null) {
while (eval.hasMoreElements() != false) {
Object val = eval.nextElement();
Object key = ekey.nextElement();
all_pick(val, key);
System.out.println("Schluessel: " + key); // Polygonname aus c4d
System.out.println("Wert: " + val); // Adresswert javax.media....@3939j39
}
}
sceneGroup = scene.getSceneGroup();
if (sceneGroup != null) {
canvas.addMouseListener(this); // Maus muss draufhoeren
pickCanvas = new PickCanvas(canvas, sceneGroup); // Picking
pickCanvas.setMode(PickTool.GEOMETRY_INTERSECT_INFO);
pickCanvas.setTolerance(4.0f);
}
// Pinguin Position bestimmen
Transform3D tfsceneGroup = new Transform3D();
// Pinguin Groesse
tfsceneGroup.setScale(0.0099d);
// Pinguin Position
tfsceneGroup.setTranslation(new Vector3f(0.0f, -5.0f, 18.0f)); // x re.li, y ho.ru, z na.fern
// altes: tfsceneGroup.setScale(0.005d);tfsceneGroup.setTranslation(new Vector3f(-4.0f,-10.0f,10.0f));
examineGroup.setTransform(tfsceneGroup);
examineGroup.addChild(sceneGroup);
sceneBounds = new BoundingSphere(new Point3d(0.0, 0.0, 0.0),10000.0);
setViewpoint();
} else {
System.out.println("Fehler: Keine Szene vorhanden");
}
canvas.setCursor(handCursor);
}
/**
* Flags setzen
*
* @param tf TransformGroup,
*/
// Flags die gesetzt werden muessen, um Tastatur Sachen zu machen
public void setFlags(TransformGroup tf) {
if (tf != null) {
tf.setCapability( TransformGroup.ALLOW_TRANSFORM_WRITE);
tf.setCapability( TransformGroup.ALLOW_TRANSFORM_READ);
tf.setCapability( TransformGroup.ALLOW_CHILDREN_EXTEND);
tf.setCapability( TransformGroup.ALLOW_CHILDREN_READ);
tf.setCapability( TransformGroup.ALLOW_CHILDREN_WRITE);
}
}
/**
* Zustaendig fuer das Zugreifen und Identifizieren der einzelnen Objekte in der Szene bei Maus-Interaktionen.
*
* @param val Objekt des Szenengraphen
* @param key Bezeichnung des Objektes
*/
void all_pick(Object val,Object key) {
if (val instanceof SceneGraphObject!=false) {
SceneGraphObject sgo=(SceneGraphObject) val;
sgo.setUserData(key);
if (sgo instanceof Group) {
Group g=(Group) sgo;
Enumeration ekind=g.getAllChildren();
while (ekind.hasMoreElements()!=false)
all_pick(ekind.nextElement(),key);
} else if (sgo instanceof Shape3D) {
PickTool.setCapabilities((Node)sgo, PickTool.INTERSECT_FULL);
}
}
}
/* (non-Javadoc)
* @see java.awt.event.MouseListener#mouseClicked(java.awt.event.MouseEvent)
*/
@Override
public void mouseClicked(MouseEvent e) {
System.out.println("Maus-Klick->");
Hashtable objekt=scene.getNamedObjects();
BoundingSphere bounds = new BoundingSphere(new Point3d(0.0, 0.0, 0.0), Double.MAX_VALUE);
pickCanvas.setShapeLocation(e);
PickResult[] result =pickCanvas.pickAllSorted();
if (result!=null) {
for(int i=0;i<result.length;i++){
PickResult pr=result[i];
Node an=pr.getObject();
if(an.getUserData()!=null){
// System.out.println("Sorteirte Objekte "+i+"= "+an.getUserData());
}
}
}
PickResult pr=pickCanvas.pickClosest();
if (pr!=null) {
Node an=pr.getObject();
if(an.getUserData()!=null){
System.out.println("Aktuelles Objekt: "+an.getUserData());
if(an.getUserData().equals("Arm_L")){
System.out.println("Linken Arm getroffen");
}
}
}
}
/**
* die Sicht des Betrachter auf die Szene
*/
void setViewpoint() {
Transform3D viewTrans = new Transform3D();
Transform3D eyeTrans = new Transform3D();
Point3d center = new Point3d();
sceneBounds.getCenter(center);
Vector3d temp = new Vector3d(center);
viewTrans.set(temp);
// Kann auch Pinguin Werte setzen, sind jetzt aber oben
// x = 0.4; y = -8.0; z = 20.0;
temp.x = 0;
temp.y = -5.0;
temp.z = 35.0;
eyeTrans.set(temp);
viewTrans.mul(eyeTrans);
vpTransGroup.setTransform(viewTrans);
}
/**
* Die main - Methode
*
* @param args the arguments
*/
public static void main(String[] args) {
new EinfacherVRMLLoader();
}
/* (non-Javadoc)
* @see java.awt.event.MouseListener#mouseEntered(java.awt.event.MouseEvent)
*/
@Override
public void mouseEntered(MouseEvent arg0) {
// TODO Auto-generated method stub
}
/* (non-Javadoc)
* @see java.awt.event.MouseListener#mouseExited(java.awt.event.MouseEvent)
*/
@Override
public void mouseExited(MouseEvent arg0) {
// TODO Auto-generated method stub
}
/* (non-Javadoc)
* @see java.awt.event.MouseListener#mousePressed(java.awt.event.MouseEvent)
*/
@Override
public void mousePressed(MouseEvent arg0) {
// TODO Auto-generated method stub
}
/* (non-Javadoc)
* @see java.awt.event.MouseListener#mouseReleased(java.awt.event.MouseEvent)
*/
@Override
public void mouseReleased(MouseEvent arg0) {
// TODO Auto-generated method stub
}
}
Der vielleicht besseren Lesbarkeit halber auch nochmal als Pastebin: [Java] /* * <b>EinfacherVRMLLoader.java</b> * * Ermoeglicht Laden und Objekt-Pi - Pastebin.com
Also schonmal vielen Dank im Voraus, ich hoffe ihr könnt mir helfen. Ich lade mir derweil mal PDFs über Transformgroups herunter. Problem ist, dass ich das bis morgen fertig haben möchte. Aber, klar, am besten schon gestern. Ich hab aber halt das Gefühl, dass das nicht mehr allzu schwer ist, ich nur nicht den richtigen Ansatz finde.
Liebe Grüße!
Zuletzt bearbeitet: