Das Problem mit der Koordinatenbestimmung ist geschafft, da taucht schon das nächste auf:
gibt es eine Möglichkeit bei einem Click in den 3D-Raum mit der Maus, das dabei getroffene Shape3D modell zu ermitteln
Hier ein Beispiel:
So jetzt dacht ich, ich würd mein Shape3D-Objekt zuruck kriegen, aber bei jedem Click kriegt man nur ein NULL-Objekt zurück.
Gibt es eine andere Möglichkeit dieses Problem zu lösen?
gibt es eine Möglichkeit bei einem Click in den 3D-Raum mit der Maus, das dabei getroffene Shape3D modell zu ermitteln
Hier ein Beispiel:
Code:
import java.awt.*;
import java.awt.event.*;
import javax.media.j3d.*;
import javax.vecmath.*;
import com.sun.j3d.utils.universe.*;
import com.sun.j3d.utils.behaviors.picking.*;
class Test extends Frame implements MouseListener
{
public static void main(String[] args)
{
Test test = new Test();
}
public Test()
{
//Erzeugung eines SimpleUniverse und anhängen der BranchGroup
super("test");
setLocation(200, 200);
setSize(640, 480);
canvas3d = new Canvas3D (SimpleUniverse.getPreferredConfiguration());
canvas3d.addMouseListener(this);
add(canvas3d);
universe = new SimpleUniverse(canvas3d);
universe.getViewingPlatform().setNominalViewingTransform();
bg = createObject();
universe.addBranchGraph(bg);
setVisible(true);
}
Canvas3D canvas3d;
SimpleUniverse universe;
BranchGroup bg;
//Erzeugung eines BranchGroup-Objektes mit einem angehängtem Shape3D
public BranchGroup createObject()
{
BranchGroup ret = new BranchGroup();
QuadArray qa = new QuadArray(4, PointArray.COORDINATES);
qa.setCoordinate(0, new Point3f(-0.2f, -0.2f, 0.0f));
qa.setCoordinate(1, new Point3f( 0.2f, -0.2f, 0.0f));
qa.setCoordinate(2, new Point3f( 0.2f, 0.2f, 0.0f));
qa.setCoordinate(3, new Point3f(-0.2f, 0.2f, 0.0f));
Shape3D obj = new Shape3D();
obj.setGeometry(qa);
obj.setCapability(Shape3D.ENABLE_PICK_REPORTING);
obj.setPickable(true);
ret.addChild(obj);
return ret;
}
public void mouseClicked(MouseEvent e)
{
PickObject pickDreh = new PickObject(canvas3d, bg);
SceneGraphPath sgp = pickDreh.pickClosest(e.getX(), e.getY(), PickObject.SHAPE3D);
Shape3D shape = (Shape3D)(pickDreh.pickNode(sgp, PickObject.SHAPE3D));
//um jetzt schnell festzustellen ob irgendetwas getroffen wurde
//wird das Objekt per toString()-Methode durch die Standartausgabe
//angezeigt
System.out.println(sgp);
}
public void mousePressed(MouseEvent e){}
public void mouseReleased(MouseEvent e){}
public void mouseEntered(MouseEvent e){}
public void mouseExited(MouseEvent e){}
}
So jetzt dacht ich, ich würd mein Shape3D-Objekt zuruck kriegen, aber bei jedem Click kriegt man nur ein NULL-Objekt zurück.
Gibt es eine andere Möglichkeit dieses Problem zu lösen?