# Java3D - Lichtquelle einbauen



## theBigJimmy (6. Mrz 2011)

Hallo zusammen,

ich habe mit java3D eine Szene ausscließlich bestehend aus Dreiecken, Kanten und Knoten gezeichnet. 


```
public Java3DExample() throws Exception{
        super("Java3DExample");
        setDefaultCloseOperation(EXIT_ON_CLOSE);

         Canvas3D canvas = new Canvas3D(SimpleUniverse.getPreferredConfiguration());
        canvas.setSize(600, 400);
        SimpleUniverse simpleUniverse = new SimpleUniverse(canvas);
        simpleUniverse.getViewingPlatform().setNominalViewingTransform();
        
        BranchGroup rootBranchGroup = new BranchGroup();
        TransformGroup rootTransformGroup = new TransformGroup();

        rootBranchGroup.addChild(rootTransformGroup);
        rootTransformGroup.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);

                Appearance polygon1Appearance = new Appearance();
		ColoringAttributes ca = new ColoringAttributes();
		
		ca.setColor(0f,1f,0f);  

		polygon1Appearance.setColoringAttributes(ca);
		
		TriangleArray polygon1 = new TriangleArray (3, TriangleArray.COORDINATES);
		polygon1.setCoordinate (0, new Point3d (0, 0, 0));
    	        polygon1.setCoordinate (1, new Point3d (1, 0, 0));
    	        polygon1.setCoordinate (2, new Point3d (1, 1, 0));
    	        rootTransformGroup.addChild(new Shape3D(polygon1,polygon1Appearance));
}
```

Diese Objekte modellieren eine Fläche. Um diese Fläche nun plastischer darzustellen würde ich gerne eine Lichtquelle einbauen, nur weiß ich leider nicht wie. Kann mir jemand einen entsprechenden Beispielcode einfügen?

Viele Grüße und Danke im Vorraus.


----------



## Marco13 (6. Mrz 2011)

Ausgehend von sowas wie Light Demo : Light3DJava ... oder was ist die Frage?


----------



## theBigJimmy (6. Mrz 2011)

Ja, zum Beispiel. Ich habe den Code mal in meinem Beispiel eingebaut


```
public Java3DExample() throws Exception{
        super("Java3DExample");
        setDefaultCloseOperation(EXIT_ON_CLOSE);
 
         Canvas3D canvas = new Canvas3D(SimpleUniverse.getPreferredConfiguration());
        canvas.setSize(600, 400);
        SimpleUniverse simpleUniverse = new SimpleUniverse(canvas);
        simpleUniverse.getViewingPlatform().setNominalViewingTransform();
        
        BranchGroup rootBranchGroup = new BranchGroup();
        TransformGroup rootTransformGroup = new TransformGroup();
 
        rootBranchGroup.addChild(rootTransformGroup);
        rootTransformGroup.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
 
                Appearance polygon1Appearance = new Appearance();
        ColoringAttributes ca = new ColoringAttributes();
        
        ca.setColor(0f,1f,0f);  
 
        polygon1Appearance.setColoringAttributes(ca);
        
        TriangleArray polygon1 = new TriangleArray (3, TriangleArray.COORDINATES);
        polygon1.setCoordinate (0, new Point3d (0, 0, 0));
                polygon1.setCoordinate (1, new Point3d (1, 0, 0));
                polygon1.setCoordinate (2, new Point3d (1, 1, 0));
                rootTransformGroup.addChild(new Shape3D(polygon1,polygon1Appearance));

        DirectionalLight d_Licht = new DirectionalLight();
        d_Licht.setInfluencingBounds(new BoundingSphere(new Point3d(0.0d, 0.0d,0.0d), Double.MAX_VALUE));
        d_Licht.setColor(new Color3f(1.0f, 0.0f, 0.0f));
        Vector3f dir = new Vector3f(1.0f, 2.0f, -1.0f);
        dir.normalize();
        d_Licht.setDirection(dir);
        rootBranchGroup.addChild(d_Licht);

        // ambient Licht
        AmbientLight a_licht = new AmbientLight();
        a_licht.setInfluencingBounds(new BoundingSphere(new Point3d(0.0f, 0.0f,0.0f), Double.MAX_VALUE));
        a_licht.setColor(new Color3f(1.0f, 0.0f, 0.0f));
        rootBranchGroup.addChild(a_licht);
}
[\JAVA]

nur sehe ich leider keine Veränderung. Macht es etwas aus, dass mein Hintergrund weiß ist?

Viele Grüße und Danke im Vorraus.
```


----------



## Marco13 (6. Mrz 2011)

Bau mal ein KSKB, in Code-Tags


----------



## theBigJimmy (6. Mrz 2011)

```
import javax.media.j3d.BoundingSphere;
import javax.media.j3d.BranchGroup;
import javax.media.j3d.Canvas3D;
import javax.media.j3d.TransformGroup;
import javax.media.j3d.Appearance;
import javax.media.j3d.ColoringAttributes;
import javax.media.j3d.PointAttributes;
import javax.media.j3d.Transform3D;
import javax.media.j3d.Background;
import javax.media.j3d.TriangleArray;
import javax.media.j3d.Shape3D;
import javax.media.j3d.AmbientLight;
import javax.media.j3d.DirectionalLight;







import javax.swing.JFrame;
import javax.vecmath.AxisAngle4f;
import javax.vecmath.Matrix4f;
import javax.vecmath.Point3d;
import javax.vecmath.Color3f;
import javax.vecmath.Vector3f;
import javax.vecmath.AxisAngle4d;

 
import com.sun.j3d.utils.behaviors.keyboard.KeyNavigatorBehavior;
import com.sun.j3d.utils.behaviors.mouse.MouseRotate;
import com.sun.j3d.utils.behaviors.mouse.MouseTranslate;
import com.sun.j3d.utils.behaviors.mouse.MouseZoom;
import com.sun.j3d.utils.geometry.ColorCube;
import com.sun.j3d.utils.universe.SimpleUniverse;
import com.sun.j3d.utils.geometry.Sphere;
import com.sun.j3d.utils.geometry.Box;
import com.sun.j3d.utils.geometry.Cylinder;


import java.io.File;
import java.io.BufferedReader;
import java.io.FileReader;

import java.util.LinkedList;

import java.lang.Math;

import java.awt.Color;




 
/**
 * @author Thomas.Darimont
 * 
 */
public class Java3DExampleSMALL extends JFrame{
	
	public void addTriangle(float x1, float y1, float z1, float x2, float y2, float z2, float x3, float y3, float z3, TransformGroup rootTransformGroup){
		Appearance polygon1Appearance = new Appearance();
		ColoringAttributes ca = new ColoringAttributes();
		
		ca.setColor(0f,1f,0f);  

		polygon1Appearance.setColoringAttributes(ca);
		
		TriangleArray polygon1 = new TriangleArray (3, TriangleArray.COORDINATES);
		polygon1.setCoordinate (0, new Point3d (x1, y1, z1));
    	polygon1.setCoordinate (1, new Point3d (x2, y2, z2));
    	polygon1.setCoordinate (2, new Point3d (x3, y3, z3));
    	rootTransformGroup.addChild(new Shape3D(polygon1,polygon1Appearance));
    	
    	Appearance polygon2Appearance = new Appearance();
		ColoringAttributes ca1 = new ColoringAttributes();
		
		ca1.setColor(0f,0f,0f);  

		polygon2Appearance.setColoringAttributes(ca1);
    	
    	
    	TriangleArray polygon2 = new TriangleArray (3, TriangleArray.COORDINATES);
		polygon2.setCoordinate (2, new Point3d (x1, y1, z1));
    	polygon2.setCoordinate (1, new Point3d (x2, y2, z2));
    	polygon2.setCoordinate (0, new Point3d (x3, y3, z3));
    	rootTransformGroup.addChild(new Shape3D(polygon2,polygon2Appearance));
	}

	
	public Java3DExampleSMALL() throws Exception{
        super("Java3DExample");
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        
        
        Canvas3D canvas = new Canvas3D(SimpleUniverse.getPreferredConfiguration());
        canvas.setSize(600, 400);
        SimpleUniverse simpleUniverse = new SimpleUniverse(canvas);
        simpleUniverse.getViewingPlatform().setNominalViewingTransform();
        
        BranchGroup rootBranchGroup = new BranchGroup();
        TransformGroup rootTransformGroup = new TransformGroup();

        rootBranchGroup.addChild(rootTransformGroup);
        rootTransformGroup.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
        
        /*AmbientLight lightA = new AmbientLight();
        lightA.setInfluencingBounds(new BoundingSphere());
        rootBranchGroup.addChild(lightA);*/
        
        /*DirectionalLight lightD1 = new DirectionalLight();
        lightD1.setInfluencingBounds(new BoundingSphere());
        rootBranchGroup.addChild(lightD1);*/
        
        DirectionalLight d_Licht = new DirectionalLight();
        d_Licht.setInfluencingBounds(new BoundingSphere(new Point3d(0.0d, 0.0d,
            0.0d), Double.MAX_VALUE));
        d_Licht.setColor(new Color3f(1.0f, 0.0f, 0.0f));
        Vector3f dir = new Vector3f(1.0f, 2.0f, -1.0f);
        dir.normalize();
        d_Licht.setDirection(dir);
        rootBranchGroup.addChild(d_Licht);

        // ambient Licht
        AmbientLight a_licht = new AmbientLight();
        a_licht.setInfluencingBounds(new BoundingSphere(new Point3d(0.0f, 0.0f,
            0.0f), Double.MAX_VALUE));
        a_licht.setColor(new Color3f(1.0f, 0.0f, 0.0f));
        rootBranchGroup.addChild(a_licht);


        
        //Ein neues Objekt wird erzeugt und mit seiner TransformGroup-Umgebung an rootTransformGroupt angehangen
        //------------------------------------------------------------------------------------------------------

        addTriangle(0f, 0f, 0f, 1f, 0f, 0f, 1f, 1f, 0f, rootTransformGroup);
        addTriangle(0f, 0f, 0f, 1f, 0f, 0f, 1f, 0f, 1f, rootTransformGroup);
        addTriangle(0f, 0f, 0f, 1f, 0f, 1f, 1f, 1f, 0f, rootTransformGroup);
        addTriangle(1f, 0f, 0f, 1f, 1f, 0f, 1f, 0f, 1f, rootTransformGroup);


        //------------------------------------------------------------------------------------------------------
        
        
        BoundingSphere boundingSphere = new BoundingSphere(new Point3d(0,0,0),10000);
        
        Color3f color = new Color3f(150f, 150f, 150f);
        Background background = new Background();
        background.setColor(color);
        background.setCapability(Background.ALLOW_COLOR_WRITE);
        background.setApplicationBounds(boundingSphere);
        rootBranchGroup.addChild(background);
        
        //rootTransformGroup ist die Wurzel Transformguppe, an die alle weiteren Tranformgruppen als Kinder angehängt werden
        //rootTransformGroup wird mit den Interaktions-Listenern gekoppelt --> Gesamte Baum wird als Raum rotiert, gedreht, verschoben etc
        	MouseRotate mouseRotate = new MouseRotate();
        	mouseRotate.setTransformGroup(rootTransformGroup); //!!!!!!!!!!
        	mouseRotate.setSchedulingBounds(boundingSphere);
        	rootBranchGroup.addChild(mouseRotate);
 
        	MouseTranslate mouseTranslate = new MouseTranslate();
        	mouseTranslate.setTransformGroup(rootTransformGroup); //!!!!!!!!!!!
        	mouseTranslate.setSchedulingBounds(boundingSphere);
        	rootBranchGroup.addChild(mouseTranslate);
        
    
        
        	MouseZoom mouseZoom = new  MouseZoom();
        	mouseZoom.setTransformGroup(rootTransformGroup); //!!!!!!!!!
        	mouseZoom.setSchedulingBounds(boundingSphere);
        	rootBranchGroup.addChild(mouseZoom);
        
        	KeyNavigatorBehavior keyNavigatorBehavior = new KeyNavigatorBehavior(rootTransformGroup);
        	keyNavigatorBehavior.setSchedulingBounds(boundingSphere);
        	rootBranchGroup.addChild(keyNavigatorBehavior);
        
        rootBranchGroup.compile();
        
        simpleUniverse.addBranchGraph(rootBranchGroup);
        
        add(canvas);
        pack();
        setVisible(true);
    }
    
    /**
     * @param args
     */
    public static void main(String[] args) throws Exception {
        new Java3DExampleSMALL();
    }
 
}
```

Das Ding baut dir einen vierseitigen Polyeder, dessen Facetten durch Dreiecke darsgestellt werden. Du kannst den Körper mit der Maus drehen, verschieben und die Ansicht zoomen. Ohne diese Perspektivenwechsel ist es jedoch sehr schwer die Form des Objektes mit dem Auge zu erkennen. Meine Hoffnung ist es, dass dieses Problem durch künstliche Lichtquellen behoben wird.

Vielen Dank im Vorraus für Deine Mühe.


----------



## Marco13 (6. Mrz 2011)

Man muss bei der Appearance wohl noch das Material spezifizieren (wie stark es glänzt, bzw. allgemein wie es sich bei Lichteinfall verhält) und natürlich brauchen alle Objekte Normalen.

```
public void addTriangle(float x1, float y1, float z1, float x2, float y2, float z2, float x3, float y3, float z3, TransformGroup rootTransformGroup){
        Appearance polygon1Appearance = new Appearance();
        ColoringAttributes ca = new ColoringAttributes();
        Material mat = new Material();
        mat.setShininess(50.0f);
        mat.setDiffuseColor(new Color3f(1.0f, 0.0f, 0.0f));
        mat.setSpecularColor(new Color3f(0.0f, 0.0f, 0.0f));
        polygon1Appearance.setMaterial(mat);
        ca.setColor(0f,1f,0f);

        polygon1Appearance.setColoringAttributes(ca);

        Point3d p0 = new Point3d (x1, y1, z1);
        Point3d p1 = new Point3d (x2, y2, z2);
        Point3d p2 = new Point3d (x3, y3, z3);
        Vector3d v0 = new Vector3d();
        v0.sub(p1, p0);
        Vector3d v1 = new Vector3d();
        v1.sub(p2, p0);
        Vector3d nd = new Vector3d();
        nd.cross(v0, v1);
        Vector3f n = new Vector3f(nd);
        n.normalize();


        TriangleArray polygon1 = new TriangleArray (3, TriangleArray.COORDINATES | TriangleArray.NORMALS);
        polygon1.setCoordinate (0, new Point3d (x1, y1, z1));
        polygon1.setCoordinate (1, new Point3d (x2, y2, z2));
        polygon1.setCoordinate (2, new Point3d (x3, y3, z3));
        polygon1.setNormal (0, n);
        polygon1.setNormal (1, n);
        polygon1.setNormal (2, n);

        rootTransformGroup.addChild(new Shape3D(polygon1,polygon1Appearance));

        Appearance polygon2Appearance = new Appearance();
        ColoringAttributes ca1 = new ColoringAttributes();

        ca1.setColor(0f,0f,0f);

        polygon2Appearance.setColoringAttributes(ca1);
        polygon2Appearance.setMaterial(mat);


        TriangleArray polygon2 = new TriangleArray (3, TriangleArray.COORDINATES | TriangleArray.NORMALS);
        polygon2.setCoordinate (2, new Point3d (x1, y1, z1));
        polygon2.setCoordinate (1, new Point3d (x2, y2, z2));
        polygon2.setCoordinate (0, new Point3d (x3, y3, z3));
        polygon2.setNormal (2, n);
        polygon2.setNormal (1, n);
        polygon2.setNormal (0, n);
        rootTransformGroup.addChild(new Shape3D(polygon2,polygon2Appearance));
    }
```


----------



## theBigJimmy (7. Mrz 2011)

Vielen Dank schon einmal für das schöne Beispiel!

Kannst Du mir auch ein bißchen erklären, was da geometrisch genau gemacht wird. Was ich nicht verstehe, ist z.B. in welcher Position nun die Lichtquelle liegt. Was ich auch nicht verstehe, sind die Einstellungen bzgl. Lichtempfindlichkeit.

Viele Dank im Vorraus.


----------



## theBigJimmy (7. Mrz 2011)

Und noch eine Frage habe ich, wie kann ich einen Schatten realisieren, der z.B. von einer Forderen Facette auf eine hintere Facette (Von der Lichtquelle aus betrachtet) geworfen wird.

Viele Grüße.


----------

