# Frage zu Geometry und Shape3D



## jagdfalke (28. Mai 2006)

Hi,
wie ihr euch sicher denken könnt bin ich etwas weiter voran geschritten von meinem Tutorial und jetzt gehts um Geometry und Shape3D. Da war ein Beispielprogramm, das ich ein wenig verändern wollte und jetzt klappt das alles nicht und ich finde nicht heraus warum:


```
import javax.swing.JFrame;
import javax.media.j3d.*;
import com.sun.j3d.utils.universe.*;
import javax.vecmath.*;
import java.awt.BorderLayout;
import java.awt.GraphicsConfiguration;
import com.sun.j3d.utils.geometry.*;
import com.sun.j3d.utils.image.*;
import com.sun.j3d.utils.behaviors.mouse.MouseRotate;
import javax.swing.Timer;
import java.awt.event.*;

public class Main extends JFrame{

	private SimpleUniverse un;

	
	public Main() {
		setLayout(new BorderLayout());
		setSize(500,500);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
		GraphicsConfiguration config = SimpleUniverse.getPreferredConfiguration();
		
		Canvas3D c=new Canvas3D(config);
		getContentPane().add(c);
		
		un = new SimpleUniverse(c);
	    	un.getViewingPlatform().setNominalViewingTransform();
	    	un.addBranchGraph(createSceneGraph());
	    
		setVisible(true);
	}
	
	
	private BranchGroup createSceneGraph() {
		BranchGroup bg = new BranchGroup();
			
		///////////////////////////////////////////////////
		// LIGHT
		///////////////////////////////////////////////////
		BoundingSphere bndSphere = new BoundingSphere(new Point3d(0f,0f,0f),100000);
		AmbientLight ambLight = new AmbientLight(new Color3f(1f,1f,1f));
			ambLight.setInfluencingBounds(bndSphere);
		bg.addChild(ambLight);
		
		
	        /////////////////////////////////////////////////////
		// SHAPE3D
		/////////////////////////////////////////////////////
		Color3f[] colors = new Color3f[3];
			colors[0] = new Color3f(1f,0f,0f);
			colors[1] = new Color3f(0f,1f,0f);
			colors[2] = new Color3f(0f,0f,1f);
		TriangleArray triangleGeoData = new TriangleArray(3, TriangleArray.COORDINATES | TriangleArray.COLOR_3);
 			triangleGeoData.setCoordinate(0, new Point3f(0f,0f,0f));
 			triangleGeoData.setCoordinate(1, new Point3f(0f,1f,0f));
 			triangleGeoData.setCoordinate(2, new Point3f(1f,0f,0f));
 			triangleGeoData.setColor(0, colors[0]);
 			triangleGeoData.setColor(1, colors[1]);
 			triangleGeoData.setColor(2, colors[2]);
		Shape3D triangle = new Shape3D(triangleGeoData);
		bg.addChild(triangle);

		
		bg.compile();
		return bg;
	}
	

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		new Main();
	}

}
```

Meiner Meinung nach sollte sich da jetzt ein Dreieck zeigen, das die Farben rot, grün und blau hat. Aber alles was ich sehe ich schwarz. Nichts als schwarze gähnende Leere. Kann mich nicht erinnern in schwarzes Loch da reinprogrammiert zu haben, das alles Licht anzieht sodass nichts reflektiert wird 
Also weiß jemand was da falsch ist?

mfg
jagdfalke


----------



## Illuvatar (28. Mai 2006)

Das nennt sich "Culling" und ist in den PolygonAttributes der Appearance festgelegt. So wie du die Punkte gesetzt hast (gegen den Uhrzeigersinn) sieht man nämlich die "Rückseite" des Dreiecks. Der Standardwert für das Culling ist aber CULL_BACK, d.h. Rückseite nicht zeichnen.
D.h. du hast drei Möglichkeiten 
a) Punkte andersrum setzen
b) CULL_FRONT verwenden
c) CULL_NONE verwenden


----------



## jagdfalke (28. Mai 2006)

Ahh verstehe, ja wenn ich Punkte anderes herum eintrage sehe ich das Dreieck. Aber warum ist die Rückseite unsichtbar??? Sollte man da nicht eigentlich auch die Farben sehen? Ich meine das Ding hat ja keine Tiefe, also sieht man von dahinter auch die Vorderseite.
Aber nochwas: Wo genau kann ich das mit dem Culling umstellen???

mfg
jagdfalke


----------



## Illuvatar (28. Mai 2006)

jagdfalke hat gesagt.:
			
		

> Aber warum ist die Rückseite unsichtbar??? Sollte man da nicht eigentlich auch die Farben sehen?



Das heißt nicht "Die Rückseite wird nicht gezeichnet" sondern "Wenn die Rückseite vorne ist, wird es gar nicht gezeichnet". 

Umstellen zB so:


```
Appearance app = new Appearance();
      app.setPolygonAttributes (new PolygonAttributes (PolygonAttributes.POLYGON_FILL, PolygonAttributes.CULL_NONE, 0));
      Shape3D triangle = new Shape3D(triangleGeoData, app);
```


----------



## jagdfalke (28. Mai 2006)

Ok danke!
War irgendwie grad verplant. Hätte selber merken müssen, dass ich einfach die Appearance ändern muss 

mfg
jagdfalke


----------

