problem mit huntergrund bild

K

kubapl

Hallo Leute. Ich bin neu auf dem Gebiet java3d. Nun muss ich eine Aufgabe erstellen zu meinen Studium.
Die Aufgabe lautet wie folgt:

Programmieren Sie die Java-Applikation MagicSphere mit den folgenden Mindestanforderungen:

1. MagicSphere zeigt eine Kugel in einem dreidimensionalen Raum.
2. Der Hintergrund, den MagicSphere darstellt, besteht aus einem Ausschnitt des Quellcodes von MagicSphere.
3. MagicSphere ist in Java realisiert und nutzt die Java-3D-Klassen.

so weit so gut. Ich habe mich da nun mal den ganzen tag ran gesetzt und eigentlich bin ich sehr sicher das alles richtig ist. Nur er zeigt mit das Hintergrund Bild nicht an. Also der hintergrund soll ja ein auszug vom Quellcode selber sein also screen machen u.s.w.

Wenn ich das Prog starte sehe ich halt nur die Kugel auf einem schwarzen Hintergrund (wie gesagt er läd das Bild irgend wie nicht).

Hier mal der Quellcode:
Code:
        import java.applet.Applet;
        import java.awt.BorderLayout;
        import java.awt.GraphicsConfiguration;
        
        import com.sun.j3d.utils.geometry.Primitive;
        import com.sun.j3d.utils.geometry.Sphere;
            
        
        import com.sun.j3d.utils.image.TextureLoader;
        import com.sun.j3d.utils.universe.SimpleUniverse;
		
		import com.sun.j3d.utils.applet.MainFrame;
		
		import javax.media.j3d.Appearance;
		import javax.media.j3d.Background;
		import javax.media.j3d.BranchGroup;
		import javax.media.j3d.BoundingSphere;
		import javax.media.j3d.Canvas3D;
		import javax.media.j3d.DirectionalLight;
		import javax.media.j3d.Material;
		import javax.media.j3d.TexCoordGeneration;
		import javax.media.j3d.Texture;
		import javax.media.j3d.TextureAttributes;
		
		import javax.media.j3d.Transform3D;
		import javax.media.j3d.TransformGroup;
		
		import javax.vecmath.Color3f;
		import javax.vecmath.Color4f;
		import javax.vecmath.Point3d;
		import javax.vecmath.Vector3f;
		
		public class SimpleFigure3Da extends Applet
		{
			private SimpleUniverse u = null;
			
			
			private SimpleFigure3Da()
			{
				super();
			}
			
			
			public BranchGroup createSceneGraph()
			{
				BranchGroup bg = new BranchGroup();
				Appearance app = new Appearance();
				Color3f ambientC =
					new Color3f(0.9f, 0.2f, 1.0f);
				Color3f emissiveC =
					new Color3f(0.0f, 0.0f, 0.0f);
				Color3f diffuseC =
					new Color3f(0.9f, 0.2f, 1.0f);
				Color3f specularC =
					new Color3f(0.0f, 0.0f, 0.0f);
				float shininess = 80.0f;
				
				app.setMaterial(
				new Material(
				ambientC,
				emissiveC,
				diffuseC,
				specularC,
				shininess));
			Sphere sphere =
				  new Sphere(
				0.2f, Primitive.GENERATE_NORMALS, 40, app);
			bg.addChild(sphere);
			return bg;
			}
			
		public BranchGroup createBackground()
		{
			BranchGroup bg =
				new BranchGroup();
			Background back = new Background();
			back.setApplicationBounds(
				getBoundingSphere());
			BranchGroup bgGeometry =
				new BranchGroup();
			Appearance app = new Appearance();
			
			Texture tex = new TextureLoader(
					"/text.jpg",
					null).getTexture();
			app.setTexture(tex);
			
			app.setTexCoordGeneration(
				new TexCoordGeneration(
				TexCoordGeneration.SPHERE_MAP,
				TexCoordGeneration.TEXTURE_COORDINATE_2));
			app.setTextureAttributes(
				new TextureAttributes(
				TextureAttributes.REPLACE,
				new Transform3D(),
				new Color4f(),
				TextureAttributes.NICEST));
			
			Sphere sphere = new Sphere(1.0f,
				Primitive.GENERATE_TEXTURE_COORDS |
				Primitive.GENERATE_NORMALS_INWARD, 40, app);
			
			bgGeometry.addChild(sphere);
			back.setGeometry(bgGeometry);
			bg.addChild(back);
			return bg;
		}
			
		public void addLights(BranchGroup bg)
		{
			DirectionalLight light =
				new DirectionalLight(
				new Color3f(1.0f, 1.0f, 0.0f),
				new Vector3f(-1.0f, -1.0f, -1.0f));
			light.setInfluencingBounds(
					this.getBoundingSphere());
			bg.addChild(light);
		}
		
		
		public TransformGroup createBehaviors(
				BranchGroup bg)
		{
			TransformGroup objTrans =
				new TransformGroup();
			bg.addChild(objTrans);
			return objTrans;
		}
		
		
		BoundingSphere getBoundingSphere()
		{
			return new BoundingSphere(
					new Point3d(0.0, 0.0, 0.0), 200.0);
		}
		
			public void init()
			{
				this.setLayout(new BorderLayout());
				GraphicsConfiguration config =
					SimpleUniverse.getPreferredConfiguration();
				Canvas3D c = new Canvas3D(config);
				this.add("Center", c);
				u = new SimpleUniverse(c);
				u.getViewingPlatform().
				      setNominalViewingTransform();
				
				BranchGroup bgRoot = new BranchGroup();
				TransformGroup tg = this.createBehaviors(bgRoot);
				tg.addChild(this.createSceneGraph());
				this.addLights(bgRoot);
				u.addBranchGraph(bgRoot);
				
			}
			
			public void destroy()
			{
				u.cleanup();
			}
			
			public static void main(String[] args)
			{
				new MainFrame(new SimpleFigure3Da(), 300, 400);
			}
		}

Die stelle wo er das Bild laden soll ist ja nicht zu übersehen, aber wie gesagt er läd das Bild einfach nicht. Bin schon ganzen tag am verzweifeln. Muss den kack morgen auch noch abgeben.

Hier noch mal den Quellcode teil wo er das bild laden soll und zum hintergrund machen:
Code:
public BranchGroup createBackground()
		{
			BranchGroup bg =
				new BranchGroup();
			Background back = new Background();
			back.setApplicationBounds(
				getBoundingSphere());
			BranchGroup bgGeometry =
				new BranchGroup();
			Appearance app = new Appearance();
			
			Texture tex = new TextureLoader(
					"/text.jpg",
					null).getTexture();
			app.setTexture(tex);
			
			app.setTexCoordGeneration(
				new TexCoordGeneration(
				TexCoordGeneration.SPHERE_MAP,
				TexCoordGeneration.TEXTURE_COORDINATE_2));
			app.setTextureAttributes(
				new TextureAttributes(
				TextureAttributes.REPLACE,
				new Transform3D(),
				new Color4f(),
				TextureAttributes.NICEST));
			
			Sphere sphere = new Sphere(1.0f,
				Primitive.GENERATE_TEXTURE_COORDS |
				Primitive.GENERATE_NORMALS_INWARD, 40, app);
			
			bgGeometry.addChild(sphere);
			back.setGeometry(bgGeometry);
			bg.addChild(back);
			return bg;
		}

so sieht es aus: http://bilder-speicher.de/Jessie55729.vollbild.html

und so soll es eigentlich aussehen:http://www.250kb.de/u/061218/j/d27c5172.jpg

oder so:http://www.250kb.de/u/061218/j/1b54fcef.jpg

ich hoffe ihr könnt mir helfen das wäre echt super.

ps: kann es sein das ich irgend was falsch machen mit dem pfad zum bild
das meine ich:
Code:
			Texture tex = new TextureLoader(
					"/text.jpg",
					null).getTexture();
			app.setTexture(tex);

schon mal vielen dank im vorraus.
gruss jakob

ps: der prof von der uni hat das genau so und beim ihm laden die bilder wie man auf den bildern sieht.
so nun reicht es aber. Ihr sei dran. :) Oh man der kack muss bsi morgen laufen :(
 
Zuletzt bearbeitet von einem Moderator:
Hi,

also ich habe noch nicht mit Java3D gearbeitet, aber das Problem ist bei mir auch schon öfter aufgetreten. Und zwar lag es daran, dass das Bild nicht vollständig geladen wurde oder der repaint nicht ignoriert wurde. War in JAVA 2D.

Das heißt, dein Programm ist zu schnell für das Bild. Ich weiß nicht, ob es funktioniert, aber versuch es mal mit dem Mediatracker auszubremsen. Versuchs mal so. Ich weiß nicht ob es geht, aber ein Versuch ist es wert.

Code:
MediaTracker mt = new MediaTracker(this);
Texture tex = new TextureLoader(
  	"/text.jpg",
	null).getTexture();
mt.add(tex,0);
mt.waitForID(0);
app.setTexture(tex);

Das nimmt glaube ich ein Image Objekt. Wenn das nicht geht, dann versuch mal folgendes

Code:
Texture tex = new TextureLoader(
  	"/text.jpg",
	null).getTexture();
//In der Schleife wird nix gemacht. Wartet nur bis Objekt geladen ist.
while(tex.getWidth() < 0);
app.setTexture(tex);
 
Zurück