# Hilfe beim Lernprozess von java3d



## Seppel (26. Sep 2011)

Hallo, habe folgenden Code ausschnitt der mir 10 ColorCubes erzeugt:


```
public BranchGroup createSceneGraph() {
BranchGroup objRoot = new BranchGroup();
Transform3D formen =new Transform3D();
	    
TransformGroup transgruppe[] = new TransformGroup[10]; 
TransformGroup alle = new TransformGroup();

int i=0;
for (i=0;i<10;i++){
	transgruppe[i]=new TransformGroup(); 
	formen.setTranslation (new Vector3f (0, i, 0));
	transgruppe[i].setTransform(formen);
	transgruppe[i].addChild(addColorCube(new ColorCube(0.1+((i+1)/10))));
	alle.addChild(transgruppe[i]);
}
objRoot.addChild (alle);
...
objRoot.compile ();
return objRoot;
}
```

Hier zu erst mal folgende Fragen.
1. Wenn ich das Programm ausführen lasse dann zeigt es mit 9 kleine gleich große wurfel an un der letzte ist dagegen gigantisch. Eigentlich sollten sie alle immer ein wenig größer werden.
2. Kann man den code optimieren?

jetzt wollte ich den Code einwenig auslagern:


```
for (i=0;i<10;i++){
werteSetzen(0,i,0,0,0,0); 
transgruppe[i].addChild(addColorCube(new ColorCube(0.1+((i+1)/10))));
}
```


```
public TransformGroup addColorCube (ColorCube Form)  {	
	  Transform3D trans = new Transform3D();
	  trans.setTranslation(new Vector3f (x, y, z));
	  trans.rotX (Math.PI*2 * xRot);
	  trans.rotY (Math.PI*2 * yRot);
	  trans.rotZ (Math.PI*2 * zRot);
	  TransformGroup TG = new TransformGroup (trans);
	  TG.addChild (Form);
	  return TG;	  
 }
```


```
public void werteSetzen(int xn,int yn,int zn,int xRn,int yRn,int zRn){
	  x=xn;	  y=yn;	  z=zn;
	  xRot=xRn;	  yRot=yRn;	  zRot=zRn;
  }
```

Jetzt kann ich aber nur noch ein Würfel sehen. Wo ist der Denkfehler?

Ich danke schon mal für eure Hilfe


----------



## Marco13 (26. Sep 2011)

1. ((i+1)/10) ist ein int, der durch einen int geteilt wird 
9/10 ist 0
Mit [c]((i+1.0)/10.0)[/c] sollt's gehen.

2. Optimieren? In bezug auf Effizienz? Lohnt sich da noch nicht...

3. WerteSetzen ist bogus (die Werte sollten an die Methode übergeben werden, und NICHT als Instanzvariablen gespeichert werden!!!) - abgesehen davon, dass dort immer lautern 0en übergeben werden.


----------



## Seppel (26. Sep 2011)

> 1. ((i+1)/10) ist ein int, der durch einen int geteilt wird
> 9/10 ist 0
> Mit ((i+1.0)/10.0) sollt's gehen.



Da ärger ich mich jetzt das übersehen zu haben 



> 2. Optimieren? In bezug auf Effizienz? Lohnt sich da noch nicht...


Ich wollte mir bloß nichts falsches angewöhnen



> 3. WerteSetzen ist bogus (die Werte sollten an die Methode übergeben werden, und NICHT als Instanzvariablen gespeichert werden!!!) - abgesehen davon, dass dort immer lautern 0en übergeben werden.


Ja gut die Funktion ist müll und kann man sich sparen, es ging mir bei diesen auslagern weniger um effizens. Ich wollte halt bissel experimentieren. Funktioniert das ganze nun nicht weil es als Instanzvariable abgespeichert wurde?

Weiter Frage abseits vom Code. Wie auch bei Direktx gibt es ja auch bei java ein sichtfeld also was zu Nahe oder zuweit weg ist wird abgeschnitten, wie kann man das ändern und wie verhindert mandas sich das Bild aufhängt enn man zu weit wegscrollt?


----------



## Marco13 (26. Sep 2011)

In erster Linie funktionierte das wohl nicht, weil überall 0 übergeben wurde.

Zur Sichtweite http://www.java-forum.org/spiele-multimedia-programmierung/86570-java3d-sichtweite.html (falls du das meinst)


----------



## Seppel (26. Sep 2011)

i wurde übergeben und damit eine stetig andere Zahl

jup das mit der Distanz war der rechte Befehl
und mit dem aufhängen?


----------



## Marco13 (26. Sep 2011)

Oh ja, ich hatte da nur die ganzen 0en gesehen - also, die y-Position sollte jeweils 'i' sein? Das sollte eigentlich gehen... Ein KSKB wäre bei solchen Fragen nicht schlecht. Auch in bezug auf das "Aufhängen", ist mir nicht klar, was damit gemeint ist...


----------



## Seppel (26. Sep 2011)

Zum aufhängen erst mal:
Also ich kann inerhalb eines bestimmten bereiches scrollen (dieser bereich ist kleiner als der Bereich der max sichtbar ist (view bereich))
außerhalb kommt es nicht immer aber oft dazu das das Bild einfriert und scrollen nicht mehr möglich ist, die anwendung reagiert weder auf Maus noch andere Aktionen

und das andere:


```
import javax.swing.*;
import javax.media.j3d.*;
import javax.vecmath.*;
import com.sun.j3d.utils.universe.*;  //SimpleUniverse
import com.sun.j3d.utils.behaviors.vp.OrbitBehavior;
import com.sun.j3d.utils.geometry.*;

public class First3DProgram extends JFrame {
	public static final long serialVersionUID = 121121112l; 	
	SimpleUniverse simpleU;
	Canvas3D c3d;
	int xRot=0, yRot=0, zRot=0;
	int x=0,y=0,z=0;	
 
	//Konstruktor
	public First3DProgram()  {
	    super ("Ein ColorCube");	    
	    setSize (500, 500);
	    setLocationRelativeTo (null);  //zentrieren
	    setDefaultCloseOperation (DO_NOTHING_ON_CLOSE);  
	     //Jetzt kommt der 3D-Teil
	    c3d = new Canvas3D (SimpleUniverse.getPreferredConfiguration());	    
	    simpleU = new SimpleUniverse (c3d); 
	    BranchGroup scene = createSceneGraph();
	    simpleU.addBranchGraph (scene); 
	    simpleU.getViewingPlatform().setNominalViewingTransform();  
	    
	    add (c3d); 
	    setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 
	    setVisible (true);
	}
	
	public BranchGroup createSceneGraph() {  //Methode aus Java3D-Examples von Sun
	    BranchGroup objRoot = new BranchGroup();    
	    TransformGroup transgruppe[] = new TransformGroup[10]; 
	    
	    int i=0;
	    for (i=0;i<5;i=i+1){
	    	transgruppe[i]=new TransformGroup(); 	    	
	    	werteSetzen(0,i,0,0,0,0); 
	    	transgruppe[i].addChild(addColorCube(new ColorCube(0.1)));
	    	objRoot.addChild(transgruppe[i]);
	    }
	    
	    //Maus bewegung
	    OrbitBehavior orbit = new OrbitBehavior(c3d, OrbitBehavior.REVERSE_ALL);  //OrbitBehavior liegt in dem Paket com.sun.j3d.utils.behaviors.vp
	    orbit.setSchedulingBounds (new BoundingSphere ());
	    simpleU.getViewingPlatform().setViewPlatformBehavior (orbit);
	    
	    objRoot.compile ();
	    return objRoot;
	}
  
  //Formen
	public TransformGroup addColorCube (ColorCube Form)  {  
	      Transform3D trans = new Transform3D();
	      trans.setTranslation(new Vector3f (x, y, z));
	      trans.rotX (Math.PI*2 * xRot);
	      trans.rotY (Math.PI*2 * yRot);
	      trans.rotZ (Math.PI*2 * zRot);
	      TransformGroup TG = new TransformGroup (trans);
	      TG.addChild (Form);
	      return TG;      
	 } 

  //Position
	public void werteSetzen(int xn,int yn,int zn,int xRn,int yRn,int zRn){
	  x=xn;	  y=yn;	  z=zn;
	  xRot=xRn;	  yRot=yRn;	  zRot=zRn;
  }
  
  //Startmethode
	public static void main (String[]args)  {new First3DProgram();}
}
```

Hoffe ist kurz genug


----------



## Marco13 (26. Sep 2011)

Wie gesagt: Das mit dem "werteSetzen" macht so keinen Sinn, aber es würde anzastzweise funktionieren, wenn nicht in der addColorCube noch ein Fehler wäre. Doku zu Transform3D#rotX:


> Sets the value of this transform to a counter clockwise rotation about the x axis. *All of the non-rotational components are set as if this were an identity matrix. *



Wenn man mehrere Transforms kombinieren will, muss man sie miteinander multiplizieren. Und alle Rotationen zu setzen macht in dieser Form i.a. keinen Sinn, weil man immer eine _Reihenfolge_ für die Rotationen vorgibt, und dann ein Gimbal Lock ? Wikipedia auftritt. Um Rotationen zu beschreiben braucht man mindestens 4 float-Werte (weil es keinen Homöomorphismus vom R^3 auf SO3 gibt). Dafür bieten sich Quaternionen (Quat4f) an, oder (etwas anschaulicher) AxisAngle4f (eine Kombination aus Rotationsachse und Rotationswinkel), oder eben gleich eine ganze Rotationsmatrix, was eigentlich verschwenderisch ist (4x4=16 float-Werte), aber für's Rechnen braucht man die sowieso immer, deswegen ist das auch OK. 
Nebenbei: Wenn es nur um "elementare" Berechnungen geht, ist die Klasse Matrix4f meistens leichtgewichtiger, handlicher und effizienter als Transform3D. Bei Matrix4f muss man nach dem Erstellen noch 
matrix.setIdentity();
aufrufen, aber ansonsten kann man sie fast genauso verwenden.

In bezug auf das Programm an sich ist mir nicht ganz klar, was damit erreicht werden soll (außer Übung) aber du hängst dort für jeden Würfel eine TransformGroup an eine andere TransformGroup (und eine der beiden hat immer die "Identity-Transform" - ist damit also vermutlich überflüssig).

Eine Möglichkeit

```
import javax.swing.*;
import javax.media.j3d.*;
import javax.vecmath.*;
import com.sun.j3d.utils.universe.*;
import com.sun.j3d.utils.behaviors.vp.OrbitBehavior;
import com.sun.j3d.utils.geometry.*;

public class First3DProgram extends JFrame {
    public static final long serialVersionUID = 121121112l;
    private SimpleUniverse simpleU;
    private Canvas3D c3d;

    //Konstruktor
    public First3DProgram()  {
        super ("Ein ColorCube");
        setSize (500, 500);
        setLocationRelativeTo (null);  //zentrieren
        setDefaultCloseOperation (DO_NOTHING_ON_CLOSE);
         //Jetzt kommt der 3D-Teil
        c3d = new Canvas3D (SimpleUniverse.getPreferredConfiguration());
        simpleU = new SimpleUniverse (c3d);
        BranchGroup scene = createSceneGraph();
        simpleU.addBranchGraph (scene);
        simpleU.getViewingPlatform().setNominalViewingTransform();

        add (c3d);
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        setVisible (true);
    }

    public BranchGroup createSceneGraph() {  //Methode aus Java3D-Examples von Sun
        BranchGroup objRoot = new BranchGroup();
        TransformGroup transgruppe[] = new TransformGroup[10];

        int i=0;
        for (i=0;i<5;i=i+1){
            transgruppe[i]=createTransformGroup(new Vector3f(0,i/5.0f,0), new AxisAngle4f(1,1,0, i/5.0f));
            transgruppe[i].addChild(new ColorCube(0.1));
            objRoot.addChild(transgruppe[i]);
        }

        //Maus bewegung
        OrbitBehavior orbit = new OrbitBehavior(c3d, OrbitBehavior.REVERSE_ALL);
        orbit.setSchedulingBounds (new BoundingSphere ());
        simpleU.getViewingPlatform().setViewPlatformBehavior (orbit);

        objRoot.compile ();
        return objRoot;
    }


    public TransformGroup createTransformGroup(Vector3f translation, AxisAngle4f rotation)  {
        Matrix4f matrix = new Matrix4f();
        matrix.setIdentity();

        Matrix4f m = new Matrix4f();
        m.setIdentity();
        m.setTranslation(translation);
        matrix.mul(m);

        m.setIdentity();
        m.set(rotation);
        matrix.mul(m);

        Transform3D t = new Transform3D();
        t.set(matrix);
        TransformGroup tg = new TransformGroup(t);
        return tg;
     }


  //Startmethode
    public static void main (String[]args)  {new First3DProgram();}
}
```


Das mit dem Aufhängen... konnte ich nicht nachvollziehen... sollte aber sicher NICHT am Programm an sich liegen. Vielleicht irgendein Treiberfehler oder so? (Grafikkartentreiber auf dem neuesten Stand? :bahnhof: )


----------



## Seppel (26. Sep 2011)

Trieber sind eigentlich ok und Grafikarte auch, sinst wäre bfbc 2 ne möglich 

Zum anderen, danke für die ausführlich Erklärung, hat mir auf jeden Fall geholfen .


----------



## Seppel (27. Sep 2011)

Zum aufhängen nochmal:
Ich habe das Objekt automatisch um sich drehen gelassen und habe dann rausgescrollt. Das Scrollen hat sich aufgehangen, aber die Drehung war noch zu sehen.


----------



## Marco13 (27. Sep 2011)

Es ist schwer, genau nachzuvollziehen, was du meinst. Der Beschreibung nach könnte es auch schlicht und einfach sein, dass du außerhalb der SchedulingBounds der OrbitBehavior gelaufen bist (das wäre dann kein "Aufhängen" in dem Sinne, aber....) versuch vielleicht mal ein
orbit.setSchedulingBounds (new BoundingSphere (new Point3d(0,0,0), *1000*));
oder so...


----------



## Seppel (27. Sep 2011)

Jup Problem gelöst.
Ich lass den thread mal offen, werde sicherlich noch paar Fragen näcghsten Tage haben, danke für deine Hilfe


----------



## Seppel (28. Sep 2011)

Nach dem ich das bisherige geübt habe und kleine "Welten" erstellt habe will ich jetzt mich mit Texturen beschäftigen:
Hier zu mein Problemen:
1.Das Bild was ich darauf lege ist ein 128*128 pixel größes mit weiß-blauen Streifen
Das ergebnis ist jedoch immer blau. 
2. Wie muss ich das mit dem Licht einstellen das alle seiten Sichtbar sind und nicht nur die direkt angestahlten
	
	
	
	





```
private Appearance meinSetAppearance(Color3f col){
		Appearance coneApp = new Appearance();
		TextureLoader loader = new TextureLoader("verputzaneinerwand_152.jpg", this);
		ImageComponent2D image = loader.getImage();
		image.setCapability(ImageComponent2D.FORMAT_RGBA8);
		Texture2D texture = new Texture2D();
		int form  = texture.getFormat();
	    int base = texture.getMipMapMode();
	    texture = new Texture2D(base,form,128,128);
		texture.setImage(0, image);		
		coneApp.setTexture(texture);
		coneApp.setColoringAttributes (new ColoringAttributes (col, ColoringAttributes.NICEST));
		coneApp.setPolygonAttributes (new PolygonAttributes (PolygonAttributes.POLYGON_FILL, PolygonAttributes.CULL_BACK, 0));
		TextureAttributes texat = new TextureAttributes(TextureAttributes.MODULATE,new          Transform3D(),new Color4f(),TextureAttributes.NICEST);
		coneApp.setTextureAttributes(texat);
		coneApp.setMaterial(new Material());
		return coneApp;
	}
```


```
Color3f ambientLightColour = new Color3f(0.9f, 0.9f, 0.9f);
	    AmbientLight ambientLight = new AmbientLight(ambientLightColour);
	    ambientLight.setInfluencingBounds(new BoundingSphere(new Point3d(0.0, 0.0, 0.0), 1000.0));
	    objRoot.addChild(ambientLight);
	    Color3f directionLightColour = new Color3f(1.0f, 1.0f, 1.0f);
	    Vector3f directionLightDir = new Vector3f(-1.0f, -1.0f, -1.0f);
	    DirectionalLight directionLight = new DirectionalLight(directionLightColour, directionLightDir);
	    directionLight.setInfluencingBounds(new BoundingSphere(new Point3d(0.0, 0.0, 0.0), 1000.0));
	    objRoot.addChild(directionLight);
	    //
	    objRoot.compile ();
	    return objRoot;
```

Letzte Frage, vileicht ist das auch das Problem bei 1., muss man nicht sagen wie die Texur/Bild auf das Objekt gelegt wird(gestreckt, wiederholend...)

Danke


----------



## Marco13 (28. Sep 2011)

Ja, das letzte wäre auch meine erste Gegenfrage gewesen: Legst du auch irgendwo Texturkoordinaten fest? (Wie immer: Ein KSKB könnte helfen...)


----------



## Seppel (29. Sep 2011)

Nein lege keine texturkoordinaten fest, da ich zwar folgendes gefunden habe:

```
QuadArray plane = new QuadArray(4, GeometryArray.COORDINATES | GeometryArray.TEXTURE_COORDINATE_2);
		Point3f p = new Point3f();
		p.set(-1.0f, 1.0f, 0.0f);	plane.setCoordinate(0, p);
		p.set(-1.0f, -1.0f, 0.0f); 	plane.setCoordinate(1, p);
		p.set( 1.0f, -1.0f, 0.0f);	plane.setCoordinate(2, p);
		p.set( 1.0f, 1.0f, 0.0f);	plane.setCoordinate(3, p);
		
		Point2f q = new Point2f();
		q.set(0.0f, 1.0f);		plane.setTextureCoordinate(0, q);
		q.set(0.0f, 0.0f);		plane.setTextureCoordinate(1, q);
		q.set(1.0f, 0.0f);		plane.setTextureCoordinate(2, q);
		q.set(1.0f, 1.0f);		plane.setTextureCoordinate(3, q);
```
aber keine Ahnung wie ich das einbauen kann. da das in den Tutorials die ich gelsen habe nicht recht beschrieben war.

Hier noch mal das Programm:

```
import static java.awt.Color.BLUE;

import javax.swing.*;

import java.awt.*;
import java.awt.event.*;

import javax.media.j3d.*;
import javax.vecmath.*;

import com.sun.j3d.utils.universe.*;  //SimpleUniverse
import com.sun.j3d.utils.behaviors.vp.OrbitBehavior;
import com.sun.j3d.utils.geometry.*;
import com.sun.j3d.utils.geometry.Box;
import com.sun.j3d.utils.image.TextureLoader;

public class First3DProgram extends JFrame {
	public static final long serialVersionUID = 121121112l; 
	
	SimpleUniverse simpleU;
	Canvas3D c3d;
	boolean left = false, right = false, up=false, down=false;
	
	//Konstruktor
	public First3DProgram()  {
	    super ("Ein ColorCube");
	    
	    
	    setSize (500, 500);
	    setLocationRelativeTo (null);  //zentrieren
	    setDefaultCloseOperation (DO_NOTHING_ON_CLOSE);
	     //Jetzt kommt der 3D-Teil
	    c3d = new Canvas3D (SimpleUniverse.getPreferredConfiguration());  
	    
	    simpleU = new SimpleUniverse (c3d);
	   
	    BranchGroup scene = createSceneGraph();
	    simpleU.addBranchGraph (scene); 	    
	    simpleU.getViewingPlatform().setNominalViewingTransform();  
	    c3d.setBackground(Color.LIGHT_GRAY);
	    View v = simpleU.getViewer().getView();
	    v.setBackClipDistance(20); 
	    v.setFrontClipDistance(1f);
	    
	    add (c3d); 
	    setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 
	    setVisible (true);
	}
	
	public BranchGroup createSceneGraph() {  //Methode aus Java3D-Examples von Sun
	    BranchGroup objRoot = new BranchGroup();
	    
	    Transform3D formen =new Transform3D();	    
	    TransformGroup kistegroup = new TransformGroup();
	    TransformGroup kistegroup2 = new TransformGroup();
	    TransformGroup alle = new TransformGroup();	    
	    
	    formen.setTranslation (new Vector3f (5, 5, 0));
	    //kistegroup.setTransform(formen);	   	    
	    kistegroup.addChild(addRaum());	 
	    //kistegroup.addChild(new Box(1,10,10,meinSetAppearance(new Color3f (BLUE))));	
	    formen.setTranslation (new Vector3f (-10, 0, 0));
	    kistegroup2.setTransform(formen);	    
	    //kistegroup2.addChild(new Box(1,10,10,meinSetAppearance(new Color3f (BLUE))));
	    kistegroup.addChild(kistegroup2);
	    alle.addChild(kistegroup);
	    	    
	    objRoot.addChild (alle);    
	    
	    
	    //Maus bewegung
	    OrbitBehavior orbit = new OrbitBehavior(c3d, OrbitBehavior.REVERSE_ALL);  //OrbitBehavior liegt in dem Paket com.sun.j3d.utils.behaviors.vp
	    orbit.setSchedulingBounds (new BoundingSphere ());
	    simpleU.getViewingPlatform().setViewPlatformBehavior (orbit);
	    //Licht
	    Color3f ambientLightColour = new Color3f(0.9f, 0.9f, 0.9f);
	    AmbientLight ambientLight = new AmbientLight(ambientLightColour);
	    ambientLight.setInfluencingBounds(new BoundingSphere(new Point3d(0.0, 0.0, 0.0), 1000.0));
	    objRoot.addChild(ambientLight);
	    Color3f directionLightColour = new Color3f(1.0f, 1.0f, 1.0f);
	    Vector3f directionLightDir = new Vector3f(-1.0f, -1.0f, -1.0f);
	    DirectionalLight directionLight = new DirectionalLight(directionLightColour, directionLightDir);
	    directionLight.setInfluencingBounds(new BoundingSphere(new Point3d(0.0, 0.0, 0.0), 1000.0));
	    objRoot.addChild(directionLight);
	    //
	    objRoot.compile ();
	    return objRoot;
	}
  
  //Formen
	public TransformGroup addRaum ()  {	 
		  Transform3D trans = new Transform3D();
		  
		  trans.setTranslation(new Vector3f ( 9, 5, 0));	
		  TransformGroup Wand1 = new TransformGroup (trans);
		  Wand1.addChild(new Box(1,10,10,meinSetAppearance(new Color3f (BLUE))));
		  
		  trans.setTranslation(new Vector3f ( -9,5, 0));	
		  TransformGroup Wand2 = new TransformGroup (trans);
		  Wand2.addChild(new Box(1,10,10,meinSetAppearance(new Color3f (Color.RED))));
		  
		  trans.setTranslation(new Vector3f (0,5,  -9));	
		  TransformGroup Wand3 = new TransformGroup (trans);
		  Wand3.addChild(new Box(10,10,1,meinSetAppearance(new Color3f (Color.GREEN))));
		  
		  trans.setTranslation(new Vector3f (0,5,  9));	
		  TransformGroup Wand4= new TransformGroup (trans);
		  Wand4.addChild(new Box(10,10,1,meinSetAppearance(new Color3f (Color.YELLOW))));
		  
		  trans.setTranslation(new Vector3f (0,-5, 0 ));			  
		  TransformGroup Wand5= new TransformGroup (trans);
		  Wand5.addChild(new Box(10,1,10,meinSetAppearance(new Color3f (Color.BLACK))));
		  
		  trans.setTranslation(new Vector3f (0,15,  0));	
		  TransformGroup Wand6= new TransformGroup (trans);
		  Wand6.addChild(new Box(10,1,10,meinSetAppearance(new Color3f (Color.WHITE))));
		  
		  TransformGroup TG = new TransformGroup ();
		  TG.addChild (Wand1);
		  TG.addChild (Wand2);
		  TG.addChild (Wand3);
		  TG.addChild (Wand4);
		  TG.addChild (Wand5);
		  TG.addChild (Wand6);
		  return TG;	  
	  }
	
	
	private Appearance meinSetAppearance(Color3f col){
		QuadArray plane = new QuadArray(4, GeometryArray.COORDINATES | GeometryArray.TEXTURE_COORDINATE_2);
		Point3f p = new Point3f();
		p.set(-1.0f, 1.0f, 0.0f);	plane.setCoordinate(0, p);
		p.set(-1.0f, -1.0f, 0.0f); 	plane.setCoordinate(1, p);
		p.set( 1.0f, -1.0f, 0.0f);	plane.setCoordinate(2, p);
		p.set( 1.0f, 1.0f, 0.0f);	plane.setCoordinate(3, p);
		
		Point2f q = new Point2f();
		q.set(0.0f, 1.0f);		plane.setTextureCoordinate(0, q);
		q.set(0.0f, 0.0f);		plane.setTextureCoordinate(1, q);
		q.set(1.0f, 0.0f);		plane.setTextureCoordinate(2, q);
		q.set(1.0f, 1.0f);		plane.setTextureCoordinate(3, q);
				
				
		Appearance coneApp = new Appearance();
		TextureLoader loader = new TextureLoader("verputzaneinerwand_152.jpg", this);
		ImageComponent2D image = loader.getImage();
		image.setCapability(ImageComponent2D.FORMAT_RGBA8);
		Texture2D texture = new Texture2D();
		int form  = texture.getFormat();
	    int base = texture.getMipMapMode();
	    texture = new Texture2D(base,form,128,128);
		texture.setImage(0, image);		
		coneApp.setTexture(texture);
		//coneApp.setColoringAttributes (new ColoringAttributes (col, ColoringAttributes.NICEST));
		//coneApp.setPolygonAttributes (new PolygonAttributes (PolygonAttributes.POLYGON_FILL, PolygonAttributes.CULL_BACK, 0));
		//TextureAttributes texat = new TextureAttributes(TextureAttributes.MODULATE,new          Transform3D(),new Color4f(),TextureAttributes.NICEST);
		//coneApp.setTextureAttributes(texat);
		coneApp.setMaterial(new Material());
		return coneApp;
	}
	
  //Startmethode
	public static void main (String[]args)  {new First3DProgram();}
}
```


----------



## Seppel (30. Sep 2011)

Ao habe jetzt da mit der textur hinbekommen, allerdings ohne fetslegen von Koordinaten, über das automatische festlegen der Koordinaten

Wand1.addChild(new Box(1,10,10,Box.GENERATE_TEXTURE_COORDS,meinSetAppearance(new Color3f (BLUE))));

Kann man das auch mit selbst ersellten Koordinaten?


----------



## Marco13 (30. Sep 2011)

Seppel hat gesagt.:


> Kann man das auch mit selbst ersellten Koordinaten?



Sicher. Aber bei allem, was komplexer ist, als eine Box, bietet es sich an, das ganze mit einem 3D-Programm zu erstellen und dann aus einer Datei (z.B. OBJ) zu lesen.


----------



## Seppel (1. Okt 2011)

Kannst du mir eins empfehlen? Und vieleicht auch ein Tutoriel 
wo beschrieben wird wie man diese datei einbindet(anzeigt)?


----------



## Marco13 (1. Okt 2011)

Konktet empfehlen kann ich keins. Sowas wie 3DStudio kostet schnell ein paar Tausender, sowas wie Blender ist zwar kostenlos, aber ... das war selbst mir zu "unkonventionell" (wenn man es kann ist es bestimmt toll, aber die Einarbeitungszeit selbs für einfachste Dinge ist enorm). Vielleicht hat da jemand anderes noch einen Tipp. Das Laden an sich sollte _relativ_ einfach sein, man findet mit Websuchen wie "Java3d obj loader" schnell KSKBs wie Object Loader Example : Object VRML File3DJava (dort offenbar noch ohne Texturen - ich habe noch nicht mit dem OBJLoader gearbeitet, und Texturen können das ganze noch ein bißchen frickeliger machen, aber sollte noch machbar sein - bei konkreten Fragen am besten mit einem KSKB und der Beispieldatei nochmal nachfragen...)


----------



## Seppel (1. Okt 2011)

Ja also es sollte schon kostenlos sein, habe auch ein ganz einfaches gefunden, aber da wird das obj als class ausgegeben
Blender habe ich auch zuhause und zugegeben es ist nicht ganz einfach es dauert lang um nur einfache Dinge zu generieren vorallem weil alles im Fachschagong geschrieben ist. Vielleicht hat ja wirklich noch ein anderer ne Idee

Danke für den Link


----------



## Seppel (2. Okt 2011)

Also habe folgenden gefunden:3dCreator

hier der Link zur verion 3
Easy 3D Creator - Free software downloads and software reviews - CNET Download.com

Version 0.9 ist kostenlos diese version Version3 wird nicht überall kostenlos angeboten

Ansonsten halt Blender ein arbeiten...


----------

