# Ein 3D-Objekt mit Maus auswählen



## kawrom (14. Feb 2006)

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:


```
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?


----------



## MPW (14. Feb 2006)

Guck dir am besten mal die mitgelieferten demos an, das ist das ganz gut gemacht, da kannste dir das dann abschauen.


----------



## kawrom (14. Feb 2006)

Jo, vielen Dank für den Tip. Wusste garnicht dass Demos mit dem Java3d Packet mitgeliefert werden. Das wird mir weiterhelfen. :toll:  :toll:   :toll:


----------



## kawrom (15. Feb 2006)

:lol: Also die Demos haben sich als eine wahre Goldgrube rausgestellt :lol: 

Vielen Dank nochmal!!!


----------



## SidKennedy (25. Apr 2006)

ähhm....wo finde ich denn diese Demos?


----------



## SidKennedy (25. Apr 2006)

hat sich erledigt  hab die tutorials gefunden


----------

