# Blender Model mit Texturen in Java Importieren



## dergrüne (13. Okt 2007)

Servus,

ich habe mit blender mal ein kleines Model erstellt und dem ein paar einfache Texturen gegeben (halt über importierte jpgs).

Jetzt ist halt die Frage wie ich das Model mit Texturen in Java/Java3D einbinde. Ich habe es zwar schon geschafft das Model zum Importieren und auch entsprechend Lichtquellen etc. gesetzt, nur leider sind die Texturen nicht mehr vorhanden.

Das Model habe ich mit Blender ins obj Format Exportiert und beide Dateien obj und mtl ins selbe Verzeichnis gelegt, so dass die Java Datei diese findet. Ich habe auch die entsprechenden jpgs mit ins Verzeichnis gelegt leider werden die Texturen immernoch nicht angezeigt.

Wenn ich das Bild in Blender rendere werde diese angezeigt. Jetzt ist halt die Frage wie ich das Model korrekt importiere oder ob ich die Texturen separat importieren muss?

mfg

Der Grüne


----------



## merlin2 (13. Okt 2007)

Die Texturen sollten funktionieren, wenn du in Blender auch einstellst, dass die Texturen geschreiben werden sollen (MTL-Datei).


----------



## dergrüne (13. Okt 2007)

Das müsste ich eigentlich alles angegeben haben.

Die mtl Datei sieht so aus


```
# Blender3D MTL File: spaceshipMid.blend
# Material Count: 3
newmtl Material.002
Ns 96.078431
Ka 0.000000 0.000000 0.000000
Kd 0.640000 0.640000 0.640000
Ks 0.500000 0.500000 0.500000
Ni 1.000000
d 1.000000
illum 2


newmtl Material
Ns 96.078431
Ka 0.000000 0.000000 0.000000
Kd 0.640000 0.640000 0.640000
Ks 0.500000 0.500000 0.500000
Ni 1.000000
d 1.000000
illum 2


newmtl Material.001
Ns 96.078431
Ka 0.000000 0.000000 0.000000
Kd 0.640000 0.640000 0.640000
Ks 0.500000 0.500000 0.500000
Ni 1.000000
d 1.000000
illum 2
```


Der entsprechende JavaCode um das Schiff darzustellen sieht dann so aus


```
import java.applet.Applet;
import java.awt.BorderLayout;
import java.io.FileNotFoundException;

import javax.media.j3d.Background;
import javax.media.j3d.BoundingSphere;
import javax.media.j3d.BranchGroup;
import javax.media.j3d.Canvas3D;
import javax.media.j3d.DirectionalLight;
import javax.vecmath.Color3f;
import javax.vecmath.Point3d;
import javax.vecmath.Vector3f;

import com.sun.j3d.loaders.IncorrectFormatException;
import com.sun.j3d.loaders.ParsingErrorException;
import com.sun.j3d.loaders.Scene;
import com.sun.j3d.loaders.objectfile.ObjectFile;
import com.sun.j3d.utils.behaviors.vp.OrbitBehavior;
import com.sun.j3d.utils.universe.SimpleUniverse;


public class ObjLoader extends Applet {

	private static final long serialVersionUID = 1L;
	private String filename = "D:\\develop\\Java3DTest\\bin\\spaceshipMid_Scene.obj";	
	private BoundingSphere bs;
	private SimpleUniverse su;
	
	public void init(){
		setLayout(new BorderLayout());
		setSize(800, 600);
		Canvas3D c = new Canvas3D(SimpleUniverse.getPreferredConfiguration());
		add("Center", c);
		su = new SimpleUniverse(c);
		BranchGroup scene = erstelleSzeneGraph();
		su.getViewingPlatform().setNominalViewingTransform();
	
		OrbitBehavior orbit = new OrbitBehavior(c, OrbitBehavior.REVERSE_ALL);  //OrbitBehavior liegt in dem Paket com.sun.j3d.utils.behaviors.vp
	    orbit.setSchedulingBounds (new BoundingSphere ());
	    su.getViewingPlatform().setViewPlatformBehavior (orbit);
	
		scene.compile();		
		su.addBranchGraph(scene);
	}
	
	public BranchGroup erstelleSzeneGraph(){
		BranchGroup objRoot = new BranchGroup();
		
		ObjectFile f = new ObjectFile(ObjectFile.RESIZE);
		Scene s = null;		
		try {
			s = f.load(filename);			
		} catch (FileNotFoundException e) {
			System.err.println(e);
			System.exit(1);
		} catch (IncorrectFormatException e) {
			System.err.println(e);
			System.exit(1);
		} catch (ParsingErrorException e) {
			System.err.println(e);
			System.exit(1);
		}
		
		bs = new BoundingSphere(new Point3d(0.0,0.0,0.0) ,100.0);
		objRoot = s.getSceneGroup();
		
		Color3f bgColor = new Color3f(0.05f, 0.05f, 0.5f);
		Background bgNode = new Background(bgColor);
		bgNode.setApplicationBounds(bs);
		objRoot.addChild(bgNode);
		
		//Licht

		DirectionalLight d1 = new DirectionalLight();
		d1.setInfluencingBounds(new BoundingSphere());
		d1.setColor(new Color3f(1.0f,1.0f,1.0f));
		objRoot.addChild(d1);
		
		DirectionalLight d2 = new DirectionalLight();
		d2.setInfluencingBounds(new BoundingSphere());
		d2.setDirection(new Vector3f(1.0f,1.0f,0.0f));
		d2.setColor(new Color3f(1.0f,1.0f,1.0f));
		objRoot.addChild(d2);
		
		DirectionalLight d3 = new DirectionalLight();
		d3.setInfluencingBounds(new BoundingSphere());
		d3.setDirection(new Vector3f(-1.0f,-1.0f,-1.0f));
		d3.setColor(new Color3f(1.0f,1.0f,1.0f));
		objRoot.addChild(d3);
		
		return objRoot;
	}
	
}
```


Muss ich im Javacode die mtl Datei auch irgendwie mit angeben?

Gruß


----------



## merlin2 (13. Okt 2007)

dergrüne hat gesagt.:
			
		

> Muss ich im Javacode die mtl Datei auch irgendwie mit angeben?


Nein, das musst du nicht. Die MTL-Datei muss nur in der Obj-Datei angegeben werden.
Aber in deiner MTL-Datei steht nichts von Texturen.
Kannst du vielleicht deine *.blend-Datei mal hochladen?


----------



## dergrüne (13. Okt 2007)

Klar kann ich die online stellen, ich hoffe es gibt kein Problem mit dem Umlaut in der URL ansonsten musst du den alternativen Link nutzen.

www.dergrüne.de/temp/spacechipMid.blend
www.dergrüne.de/temp/fluegel.jpg
www.dergrüne.de/temp/rakete.jpg
www.dergrüne.de/temp/spaceshipMid_Scene.mtl
www.dergrüne.de/temp/spaceshipMid_Scene.obj

Alternativ geht auch anstatt www.dergrüne.de dieser hier http://www.xn--dergrne-r2a.de/

Danke schonmal

Gruß
Der Grüne


----------



## dergrüne (13. Okt 2007)

Nachtrag:

Ich muss dazu sagen, dass ich mit Blender und Java3D erst am Mittwoch angefangen habe und versuche mich halt durch div. Tutorials englisch und deutsche in das Thema einzuarbeiten.

Von daher kann es auch ganz gut sein, dass ich in Blender irgendwas falsch gemacht habe. Vermutlich sogar sonst würde es ja funktionieren ;-D

Gruß


----------



## merlin2 (13. Okt 2007)

Wenn ich das aus Blender exportiere, erhalte ich folgende MTL-Datei:


> # Blender3D MTL File: spaceshipMid.blend
> # Material Count: 1
> newmtl Material.001
> Ns 96.078431
> ...


Wie sieht das Resultat mit dieser aus?

Edit: Sieht außerdem so aus, als ob nur die fluegel.jpg verwendet würde.


----------



## dergrüne (13. Okt 2007)

Hmm, wenn ich deine MTL Datei benutze läuft mein Programm (Den Code den ich oben gepostet habe) irgendwie in eine Endlosschleife.

Wie hast du das Blender Model den exportiert um so eine MTL zu bekommen?
(Blender 2.45)

Ich gehe über File->Export->Wavefront (.obj) -> Export Wavefront 

Dann klicke ich unter "Context" "All Scenes" an und deaktiviere "Selection Only" und dann auf OK.


Gruß


----------



## merlin2 (13. Okt 2007)

Das muss ein Problem deines Codes sein, denn mit meinem Code, deiner OBJ-Datei und meiner MTL-Datei läuft alles korrekt.


----------



## merlin2 (13. Okt 2007)

Hm. Aber auch mit deinem Code, deiner .obj und meiner .mtl läuft alles gut, sobald man den absoluten Pfad durch einen relativen ersetzt.

Edit: Nutze übrigens Blender 2.44.


----------



## spyboot (22. Okt 2008)

Ich habe auch das problem nur das bei mir wenn ich die textur lade erstmal der Fehler:
com.sun.j3d.loaders.ParsingErrorException: Unrecognized token, line 4
Exception in thread "main" java.lang.NullPointerException
	at Objekt3D.obj3D.<init>(obj3D.java:26)
	at Welt.main(Welt.java:104)
auftaucht ich muss dann dass zb. o Sphere in zeile 4 löschen beispiel:


```
# Blender3D v246 OBJ File: 
# [url]www.blender3d.org[/url]
mtllib 1_Scene.mtl
o Sphere
v 0.078723 -1.000000 0.019681
v 0.802323 -0.447215 0.545401
v -0.197662 -0.447215 0.870321
v -0.815702 -0.447215 0.019681
v -0.197662 -0.447215 -0.830959
v 3.026260 -0.447215 -0.506039
v 0.355108 0.447215 0.870321
v -0.644877 3.536669 0.545401
v -0.644877 0.447215 -0.506039
v 0.355108 0.447215 -0.830959
v 0.973148 0.447215 0.019681

...
```

hinterher:


```
# Blender3D v246 OBJ File: 
# [url]www.blender3d.org[/url]
mtllib 1_Scene.mtl

v 0.078723 -1.000000 0.019681
v 0.802323 -0.447215 0.545401
v -0.197662 -0.447215 0.870321
v -0.815702 -0.447215 0.019681
v -0.197662 -0.447215 -0.830959
v 3.026260 -0.447215 -0.506039
v 0.355108 0.447215 0.870321
v -0.644877 3.536669 0.545401
v -0.644877 0.447215 -0.506039
v 0.355108 0.447215 -0.830959
v 0.973148 0.447215 0.019681


...
```

EDIT: Mann kann das Objekt auch nur sehen wenn ich licht einsetzte und eine textur gibt dan auchnich.


----------

