# 2D-Bilder in Java3D



## just4fun (22. Jul 2008)

EDIT: Mein Problem wird hier gelöst -> http://www.java-forum.org/de/topic55714_2d-grafiken-auf-canvas3d.html



Hallo,
ich suche schon seit einiger Zeit nach einer Lösung zu meinem Problem. Ich möchte in meinem 3D-Spiel (bestehend aus einem Auto und einer Straße, das Auto kann sich drehen, vorwärts und rückwarts fahren. Das Auto befindet sich immer im Mittelpunkt, die Umgebung bewegt sich) ein 2D-Bild einbauen. Z.B. beim Drücken auf Escape kommt ein Spielmenü.

Ich habe den Code für diesen Zweck mal auf das minimum reduziert, damit er übersichtlicher ist. 
- Imports sind weggelassen
- Umgebung auf nur das Auto(Taxi) verkleinert
- einige Variablen und Methoden habe ich zur besseren Übersicht entfernt


```
public class TotalChaos extends JApplet implements KeyListener
{

	private double sleeptime = 50.0;
	private double perms = 1000/sleeptime;
   
	private TransformGroup objTrans;
    private Transform3D trans = new Transform3D();      

    private Transform3D scale = new Transform3D();              
	private Transform3D rotation = new Transform3D();
	private double rot_grade;
	private double x_move, z_move;
 
   //Unwichtige Variablen für diese Beispiel entfernt

	public TotalChaos() 
	{
	    setLayout(new BorderLayout());
	    GraphicsConfiguration config = SimpleUniverse.getPreferredConfiguration();
	    Canvas3D c = new Canvas3D(config);
	    add("Center", c);
		for(i_obj = 0; i_obj<max_obj; i_obj++)
		{
			obj[i_obj] = new object();
			objTran[i_obj] = new TransformGroup();
		}
		setobjAts();
	    c.addKeyListener(this);
	    addKeyListener(this);
	    // Create a simple scene and attach it to the virtual universe
	    BranchGroup scene = createSceneGraph();
	
	    SimpleUniverse u = new SimpleUniverse(c);
	    u.getViewingPlatform().setNominalViewingTransform();
	    u.addBranchGraph(scene);
	    	    
	    timer= new java.util.Timer();
	  	task= new TimerTask() { public void run() { mainTask(); } };
	    timer.scheduleAtFixedRate(task, (long)0, (long)sleeptime);		    
	}

	public BranchGroup createSceneGraph() 
	{
	// Create the root of the branch graph
	    BranchGroup objRoot = new BranchGroup();
	    objTrans = new TransformGroup();
	    objTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
	    objRoot.addChild(objTrans)
	    // Create a simple shape leaf node, add it to the scene graph.
	   	ObjectFile file = new ObjectFile (ObjectFile.RESIZE);
		Scene scene = null;
		try 
		{
			scene = file.load("/taxi.obj");
                    	}
		catch (FileNotFoundException e) 
		{
			System.err.println(e);
			System.exit(1);
		}
		catch (ParsingErrorException e) 
		{
			System.err.println(e);
			System.exit(1);
		}
		catch (IncorrectFormatException e) 
		{
			System.err.println(e);
			System.exit(1);
		}
		
	    objTrans = new TransformGroup();
	    objTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
	    Transform3D pos1 = new Transform3D();
	    scale.setScale(scaler);
	    pos1.setTranslation(new Vector3f(0.0f, -0.5f, 0.0f));
	    rotation.rotY(Math.PI / (2*-1));
	    rotation.mul(pos1);
	    rotation.mul(scale);
	    objTrans.addChild(scene.getSceneGroup());
	    objTrans.setTransform(rotation);
	    objRoot.addChild(objTrans);

                        //Licht und Hintergrund: rausgeschnitten, weil unwichtig
	
		return objRoot;
	}


//KEYEVENTS: Alle rausgeschnitten, weil unwichtig

	public void mainTask() 
	{	
                                        //Berechnung der Geschwindigkeit, Methode weggelassen		
		calculatespeed(speedup, speeddown);
		
		z_move = Math.cos(rot_grade)*speedinthis;
		x_move = Math.sin(rot_grade)*speedinthis;
		
                    //Bewegeung der Objekte(Straße etc): Rausgeschnitten
                                        //Falls das Spiel gerade gestartet wurde, Methode auch rausgeschnitten
  		if(firstrun)
			firstrun();
		
                                        //Drehung der Objekte	
		if(rotateright && speedinkmh > 0 || rotateleft && speedinkmh < 0 )
		{

			rotation.rotY(Math.PI/45);
			rot_grade = rot_grade + Math.PI/45;	
			transTotal.mul(rotation);	
		}
		if(rotateleft && speedinkmh > 0 || rotateright && speedinkmh < 0)
		{
			rotation.rotY(Math.PI/(45*-1));			
			transTotal.mul(rotation);
			rot_grade = rot_grade - Math.PI/45;
		}
                    }
	public static void main(String[] args) 
  	{
		TotalChaos TC = new TotalChaos();
	    TC.addKeyListener(TC);
	    MainFrame mf = new MainFrame(TC, 1000, 700);    
	}
```

Danke, danke, danke, danke, danke! Ich kanns kaum erwarten, die Antwort zu hören. ^^

Finn


PS/EDIT: Es ist ja nicht so, dass das einfach mit paint(Graphics g) ginge und dann in der Maintask immer repaint(); machen, sonst hätte ich es auch schon. =|


----------



## just4fun (25. Jul 2008)

Entschuldigung, dass ich doubleposte, aber da es nach einigen Tage noch immer keine Antwort gab ist das wohl okay.



Also, falls ihr nicht versteht, was ich meine, sagt bitte, was ihr nicht versteht. Danke nochmals.


Finn


----------



## AndiGast (27. Jul 2008)

Du willst also nur ein Bild auf die Zeichenfläche bringen?

Ich muss erstmal sagen das ich mich in Java 3D nicht so besonders auskenne, darum hier ein etwas umständlicher Vorschlag:

Wie wärs wenn du einfach in deinem Applet ein zweites Canvas (nicht 3D) an der gleichen Stelle einfügst und das Bild da reinzeichnest?
Da müsstest du natürlich mit setBounds die Positionen genau festlegen. (glaub ich)
Du machst dann während das Spiel läuft das normale Canvas unsichtbar und das Canvas3D sichtbar.
Und beim Wechsel ins Menü einfach das ganze umdrehen.

Wie gesagt, ist keine besonders tolle Idee, aber besser als garnichts.

mfg Andi


----------



## just4fun (29. Jul 2008)

Vielen dank für deine Antwort, muss ich mal ausprobieren. Ich fahr aber bald in Urlaub, ist recht stressig grade.

Finn


----------



## just4fun (2. Aug 2008)

Hier wird das Problem gelöst:
http://www.java-forum.org/de/topic55714_2d-grafiken-auf-canvas3d.html


----------

