# Java3D - Textur laden geht nicht



## Java3D_Noob (27. Okt 2012)

Hallo Community 

Ich hab mal wieder eine Frage  
Erstmal der Quelltext:

[Java]
//[...]

Sphere sonne = new Sphere(0.15f,1,40,texturSonne());

			TransformGroup sonnenVerschieber = new TransformGroup();
			Transform3D verschieben = new Transform3D();
			verschieben.setTranslation(new Vector3f(-0.75f, 0.45f, 0f));
			sonnenVerschieber.setTransform(verschieben);
			sonnenVerschieber.addChild(sonne);

			szene.addChild(sonnenVerschieber);

//[...]

private static Appearance texturSonne() {

		BufferedImage bildKriegen = null;
		try{
			bildKriegen = ImageIO.read(new File("C:\\Users\\*****\\Desktop\\sonne.jpg"));
		}catch (Exception e){}

		TextureLoader bildLader = new TextureLoader(bildKriegen);
		ImageComponent2D bild = bildLader.getImage();

		Texture2D dieTextur = new Texture2D(Texture2D.BASE_LEVEL,Texture2D.RGBA,340,300);
			dieTextur.setImage(0, bild);
			dieTextur.setEnable(true);

		Appearance textur = new Appearance();
			textur.setTexture(dieTextur);

		return textur;

//[...]

[/Java]

Ich wollte den gelben Kreis, der bisher meine Sonne darstellte eben durch ein Bild von einer Sonne ersetzten. So bisschen gegoogelt und dann zu diesem Quelltext gekommen. Was bei anderen funktioniert, funktioniert bei mir mal wieder nicht -.- 
Wenn ich das compile, dann sehe ich das Bild nicht, sondern nur wieder den ursprünglichen Kreis, aber in weiß.

Was mache ich falsch?

Liebe Grüße


----------



## Marco13 (28. Okt 2012)

Dieses "Pokemon-Exception-Handling"
[c]}catch (Exception e){}[/c]
solltest du dir schleunigst abgewöhnen :autsch:


----------



## Java3D_Noob (28. Okt 2012)

Marco13 hat gesagt.:


> Dieses "Pokemon-Exception-Handling"
> [c]}catch (Exception e){}[/c]
> solltest du dir schleunigst abgewöhnen :autsch:



hm, das prüft doch nur ob das File vorhanden ist oder? Und das ist es ja.
Wie soll ich das denn sonst machen? 

Oder noch besser, was muss ich schreiben, damit ich keinen weißen Kreis,
sondern die Textur sehe?


----------



## Gast2 (28. Okt 2012)

Zunächst mal solltest du den catch Block nicht leer lassen, da gehört mindestens ein 
	
	
	
	





```
e.printStacktrace();
```
 rein.

Was Marco13 mit "Pokemon-Exception-Handling" meint: Du solltest nicht einfach alles abfangen, sondern immer nur die Exceptions, die auch auftreten können. In deinem Fall wäre das also die IOException.


----------



## Java3D_Noob (28. Okt 2012)

Hm, das sind wohl Anfängerfehler, würde das dann so aussehen?


```
catch (Exception IOException) {
IOException.printStackTrace();
}
```

Aber mal ne dumme Frage, der Fall catch tritt ja nur ein, wenn try nicht klappt. Try klappt aber immer, weil mein File ja vorhanden ist. Also ist es doch eigentlich egal was bei catch steht (außer dass es unsauber programmiert ist). 

Und wenn ich da was reinschreibe ändert das ja nichts an meinem Problem. Also weiß einer, was ich jetzt genau ändern muss, damit ich keinen weißen Kreis sondern die Textur angezeigt bekomme? Hab schon viel probiert, z.B. TransparencyAttributes eingefügt und das alles transparent gemacht, aber danach war der weiße Kreis immer noch da, also schätze ich, dass ich irgendwas falsch gemacht habe, oder dass sich das Transparency auf die Textur bezogen hat. 

Also, hat jemand eine Idee, wie ich diesen weißen Kreis da weg bekomme und meine Textur da hin?


----------



## Gast2 (28. Okt 2012)

Nein, das würde so ausschauen:

```
catch (IOException ioe) {
    ioe.printStackTrace();
}
```
Schau mal ob da was auf der Konsole ausgegeben wird.


----------



## Java3D_Noob (28. Okt 2012)

Ok danke für die Korrektur, aber da wird nichts ausgegeben, es funktioniert ja.  Ich checks nicht


----------



## Java3D_Noob (28. Okt 2012)

Hm, hab jetzt nochmal ein bisschen probiert (gegoogelt xD) und bin zu diesem Quelltext gekommen: 

```
private static Appearance texturSonne() {
		
		BufferedImage bildKriegen = null;
		try{
			bildKriegen = ImageIO.read(new File("C:\\Users\\*****\\Desktop\\sonne.jpg"));
		}catch (IOException ioe){
			ioe.printStackTrace();
		}
		
		TextureLoader bildLader = new TextureLoader(bildKriegen);
		ImageComponent2D bild = bildLader.getImage();
		
		Texture2D dieTextur = new Texture2D(Texture2D.BASE_LEVEL,Texture2D.RGBA,17,15);
			dieTextur.setImage(0, bild);
			dieTextur.setEnable(true);	
			
		TexCoordGeneration koordinaten = new TexCoordGeneration(TexCoordGeneration.OBJECT_LINEAR, TexCoordGeneration.TEXTURE_COORDINATE_2);	
		
		TextureAttributes eigenschaften = new TextureAttributes();
			eigenschaften.setTextureMode(TextureAttributes.REPLACE);
		
		Appearance textur = new Appearance();
			textur.setTexture(dieTextur);
			textur.setTexCoordGeneration(koordinaten);
			textur.setTextureAttributes(eigenschaften);
		    textur.setMaterial(new Material());

		return textur;
	
	}
```


Jetzt wird das Bild geladen, aber am Anfang war es viel zu groß (sprich es wurde nur der untere rechte Teil angezeigt), dann hab ichs kleiner gemacht weil ich dachte, dann passt es, aber so war es nicht. Dann war es nur pixeliger, aber es wurde immernoch nur der rechte untere Teil angezeigt. Das hängt bestimmt mit den autogenerated TexturKoordinaten zusammen oder?

Wie krieg ich das ganze Bild angezeigt?

Liebe Grüße


----------



## Marco13 (28. Okt 2012)

Ja, eine Kugel kann man eben nicht vernünftig mit einer rechteckigen Textur belegen. Es wird also immer mehr oder weniger sch.... aussehen. Evtl. muss man die Texturkoordinaten noch skalieren oder anpassen, damit es weniger sch... aussieht. Aber zugegeben, die Funtkionsweise von dem TexCoordGeneration-Zeug hab' nich auch nicht im Kopf (die JavaDoc ist da ja sehr ausführlich). Vielleicht würde ein KSKB helfen (Sowas wie Texture: picture ball : Texture3DJava könnte da als Ausgangspunkt dienen, wenn da der gleiche Effekt auftritt).


----------



## Java3D_Noob (28. Okt 2012)

Wow danke für den Link! Der wird mir auf jeden Fall helfen  Wenn ich noch Probleme hab, meld ich mich wieder 
DANKE DANKE DANKE!!!


----------

