# Würfel erstellen und als Raum nutzen



## cable545 (9. Mai 2012)

Hallo,
ich versuche mich gerade an Java3D und hab da einige Probleme. Ich möchte einen Würfel als einen Raum nutzen in welchem ich Vektoren, Körper oder sonst was darstellen kann. Drei Flächen des Würfels sollen transparent sein, um in den Raum(Würfel) hineingucken zu können.  Die anderen drei Flächen sollen weiß sein. Meine Frage ist jetzt wie ich die Sache angehe. Muss ich mir den Würfel aus einzelnen Flächen zusammenbauen, denn ich möchte später an einige Seiten des Würfels noch eine Skala ranbasteln usw., oder gibt es eine Klasse welche mir einen Würfel erstellt den ich auch noch genug editieren/verändern kann?


----------



## Marco13 (9. Mai 2012)

Vorgefertigt gibt's sowas wohl eher nicht... ich würde zwei Objekte machen, jeweils 3 Würfelseiten, eins Weiß und eins Halbtransparent.


----------



## cable545 (10. Mai 2012)

jo, genau so hab ich das jetzt auch gemacht. Da ich ja nun in meinen Würfel hinaein schauen kann, würde ich innerhalb des Würfels die Seiten auch gerne einfärben. Gibts da einen Trick?

edit: ich hab noch ein anders Problem, wenn ich das Programm starte bleibt das Bild manchmal leer(also leeres Fenster mit weißem Hintergrund) und manchmal wird der Würfel angezeigt mit meinem eingestellten Hintergrund. 

hier ist mein Code

```
package test;

import java.awt.Color;
import java.awt.Frame;

import javax.media.j3d.Appearance;
import javax.media.j3d.Background;
import javax.media.j3d.BoundingSphere;
import javax.media.j3d.BranchGroup;
import javax.media.j3d.Canvas3D;
import javax.media.j3d.ColoringAttributes;
import javax.media.j3d.IndexedLineArray;
import javax.media.j3d.LineArray;
import javax.media.j3d.LineAttributes;
import javax.media.j3d.PointAttributes;
import javax.media.j3d.QuadArray;
import javax.media.j3d.Shape3D;
import javax.media.j3d.Transform3D;
import javax.media.j3d.TransformGroup;
import javax.media.j3d.TransparencyAttributes;
import javax.vecmath.Color3f;
import javax.vecmath.Point3d;
import javax.vecmath.Point3f;

import com.sun.j3d.utils.universe.SimpleUniverse;

public class Third3DProgram extends Frame
{
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	public Third3DProgram(String title)
	{
		super(title);
		
		Canvas3D canvas3D = new Canvas3D(SimpleUniverse.getPreferredConfiguration());
		add(canvas3D);
		
		SimpleUniverse universe = new SimpleUniverse(canvas3D);
		universe.getViewingPlatform().setNominalViewingTransform();
		
		//Hintergrund setzen
		BoundingSphere riesenkugel = new BoundingSphere(new Point3d(0.0d, 0.0d, 0.0d),
                                                                                     Double.MAX_VALUE);
		Background hintergrund = new Background();
		hintergrund.setColor(new Color3f(Color.GRAY)/*new Color3f(0.8f, 0.7f, 1.0f)*/);
	        hintergrund.setApplicationBounds(riesenkugel);
	        
	        BranchGroup scene1 = createSceneGraph();
		BranchGroup scene3 = new BranchGroup();
		
		scene3.addChild(hintergrund);
		
		scene1.compile();
		scene3.compile();
		
		universe.addBranchGraph(scene1);
		universe.addBranchGraph(scene3);
	}
	
	public BranchGroup createSceneGraph() 
	{
	    BranchGroup objWurzel = new BranchGroup();
	    BranchGroup wuerfel   = new BranchGroup();
	    
	    QuadArray transparente_flaechen;
	    QuadArray flaechen;
	    LineArray kanten;
	    
	    Point3f[] ecke = new Point3f[8];
	    
	    //Punkte des Würfels
	    ecke[0] = new Point3f(-0.5f, 0.0f, 0.5f);
	    ecke[1] = new Point3f( 0.5f, 0.0f, 0.5f);
	    ecke[2] = new Point3f( 0.5f, 0.5f, 0.5f);
	    ecke[3] = new Point3f(-0.5f, 0.5f, 0.5f);
	    ecke[4] = new Point3f(-0.5f, 0.0f, -0.5f);
	    ecke[5] = new Point3f( 0.5f, 0.0f, -0.5f);
	    ecke[6] = new Point3f( 0.5f, 0.5f, -0.5f);
	    ecke[7] = new Point3f(-0.5f, 0.5f, -0.5f);
	    
	    //sichtbare Flächen
	    flaechen = new QuadArray(12, QuadArray.COORDINATES);
	    flaechen.setCoordinate(0, ecke[0]);
	    flaechen.setCoordinate(1, ecke[1]);
	    flaechen.setCoordinate(2, ecke[5]);
	    flaechen.setCoordinate(3, ecke[4]);
	    flaechen.setCoordinate(4, ecke[0]);
	    flaechen.setCoordinate(5, ecke[4]);
	    flaechen.setCoordinate(6, ecke[7]);
	    flaechen.setCoordinate(7, ecke[3]);
	    flaechen.setCoordinate(8, ecke[4]);
	    flaechen.setCoordinate(9, ecke[5]);
	    flaechen.setCoordinate(10, ecke[6]);
	    flaechen.setCoordinate(11, ecke[7]);
	    
	    //transparente Flächen
	    transparente_flaechen = new QuadArray(12, QuadArray.COORDINATES);
	    transparente_flaechen.setCoordinate(0, ecke[0]);
	    transparente_flaechen.setCoordinate(1, ecke[1]);
	    transparente_flaechen.setCoordinate(2, ecke[2]);
	    transparente_flaechen.setCoordinate(3, ecke[3]);
	    transparente_flaechen.setCoordinate(4, ecke[1]);
	    transparente_flaechen.setCoordinate(5, ecke[5]);
	    transparente_flaechen.setCoordinate(6, ecke[6]);
	    transparente_flaechen.setCoordinate(7, ecke[2]);
	    transparente_flaechen.setCoordinate(8, ecke[3]);
	    transparente_flaechen.setCoordinate(9, ecke[2]);
	    transparente_flaechen.setCoordinate(10, ecke[6]);
	    transparente_flaechen.setCoordinate(11, ecke[7]);
	    
	    //Kanten der sichtbaren Flächen
	    kanten = new LineArray(18, IndexedLineArray.COORDINATES);
	    kanten.setCoordinate(0, ecke[0]);
	    kanten.setCoordinate(1, ecke[1]);
	    kanten.setCoordinate(2, ecke[1]);
	    kanten.setCoordinate(3, ecke[5]);
	    kanten.setCoordinate(4, ecke[0]);
	    kanten.setCoordinate(5, ecke[3]);
	    kanten.setCoordinate(6, ecke[5]);
	    kanten.setCoordinate(7, ecke[4]);
	    kanten.setCoordinate(8, ecke[0]);
	    kanten.setCoordinate(9, ecke[4]);
	    kanten.setCoordinate(10, ecke[3]);
	    kanten.setCoordinate(11, ecke[7]);
	    kanten.setCoordinate(12, ecke[4]);
	    kanten.setCoordinate(13, ecke[7]);
	    kanten.setCoordinate(14, ecke[6]);
	    kanten.setCoordinate(15, ecke[7]);
	    kanten.setCoordinate(16, ecke[5]);
	    kanten.setCoordinate(17, ecke[6]);
	    
            //appearance für die transparenten Flaechen
	    Appearance app_f = new Appearance();
	    TransparencyAttributes t_app = new TransparencyAttributes();
	    t_app.setTransparencyMode(TransparencyAttributes.BLENDED);
	    t_app.setTransparency(1.0f);
	    app_f.setTransparencyAttributes(t_app);
	    
            //appearance für die die Seiten des Wuerfels
	    Appearance app_l = new Appearance();
	    LineAttributes  l_att = new LineAttributes(2.0f,LineAttributes.PATTERN_SOLID, true);
	    PointAttributes p_att = new PointAttributes(1.0f, true);
	    ColoringAttributes c_att = new ColoringAttributes();
	    c_att.setColor(new Color3f(Color.BLACK));
	    app_l.setColoringAttributes(c_att);
	    app_l.setPointAttributes(p_att);
	    app_l.setLineAttributes(l_att);
	    
	    wuerfel.addChild(new Shape3D(flaechen));
	    wuerfel.addChild(new Shape3D(kanten, app_l));
	    wuerfel.addChild(new Shape3D(transparente_flaechen, app_f));
	    
            //Rotation
	    Transform3D drehung  = new Transform3D();
	    Transform3D drehung2 = new Transform3D();
	    drehung2.rotY(Math.PI / -5.0d);
	    drehung.rotX(Math.PI  / 5.0d);
	    drehung.mul(drehung2);
	    TransformGroup objDreh = new TransformGroup(drehung);
	    
	    objDreh.addChild(wuerfel);
	    objWurzel.addChild(objDreh);
	    
	    return objWurzel;
	}
	
	public static void main(String[] args)
	{
		Third3DProgram prog = new Third3DProgram("mal sehen");
		prog.setSize(800, 800);
		prog.setVisible (true);
	}
}
```


----------



## Marco13 (10. Mai 2012)

Meinst du mit "innerhalb...einfärben", dass die drei Wände auf der Innenseite eine andere Farbe haben sollen, als auf der Außenseite...?


----------



## cable545 (10. Mai 2012)

ups, hab mich ein bißchen undeutlich ausgedrückt. Ich möchte diverse Kanten des Würfels von innen einfärben. Von außen sind meine gefärbten Kanten sichtbar, aber nicht von innen.


----------



## Marco13 (10. Mai 2012)

Wie hast du denn das "innen" und "außen" überhaupt getestet? Irgendwie sieht man da im Moment IMHO nicht wirklich viel... also, ich erkenne da irgendwie gar nichts...:bahnhof:

Hab's mal ganz subjektiv gepimpt: Mausinteraktion (Mittlere Taste + Draggen zum zoomen, Linke zum Drehen, Rechte zum Verschieben), Beenden durch Fensterschließen, Normalen generieren, Licht einfügen, Material setzen... 
(Räum' das bei Gelegenheit mal ein bißchen auf...)


```
import java.awt.Color;
import java.awt.Frame;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

import javax.media.j3d.Appearance;
import javax.media.j3d.Background;
import javax.media.j3d.BoundingSphere;
import javax.media.j3d.Bounds;
import javax.media.j3d.BranchGroup;
import javax.media.j3d.Canvas3D;
import javax.media.j3d.ColoringAttributes;
import javax.media.j3d.GeometryArray;
import javax.media.j3d.IndexedLineArray;
import javax.media.j3d.LineArray;
import javax.media.j3d.LineAttributes;
import javax.media.j3d.Material;
import javax.media.j3d.Node;
import javax.media.j3d.PointAttributes;
import javax.media.j3d.PointLight;
import javax.media.j3d.PolygonAttributes;
import javax.media.j3d.QuadArray;
import javax.media.j3d.Shape3D;
import javax.media.j3d.Transform3D;
import javax.media.j3d.TransformGroup;
import javax.media.j3d.TransparencyAttributes;
import javax.vecmath.Color3f;
import javax.vecmath.Point3d;
import javax.vecmath.Point3f;

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.GeometryInfo;
import com.sun.j3d.utils.geometry.NormalGenerator;
import com.sun.j3d.utils.geometry.Sphere;
import com.sun.j3d.utils.universe.SimpleUniverse;
 
public class Third3DProgram extends Frame
{
    /**
     * 
     */
    private static final long serialVersionUID = 1L;
 
    public Third3DProgram(String title)
    {
        super(title);
        
        Canvas3D canvas3D = new Canvas3D(SimpleUniverse.getPreferredConfiguration());
        add(canvas3D);
        
        SimpleUniverse universe = new SimpleUniverse(canvas3D);
        universe.getViewingPlatform().setNominalViewingTransform();
        
        //Hintergrund setzen
        BoundingSphere riesenkugel = new BoundingSphere(new Point3d(0.0d, 0.0d, 0.0d),
                                                                                     Double.MAX_VALUE);
        Background hintergrund = new Background();
        hintergrund.setColor(new Color3f(Color.GRAY)/*new Color3f(0.8f, 0.7f, 1.0f)*/);
            hintergrund.setApplicationBounds(riesenkugel);
            
        BranchGroup scene1 = createSceneGraph();
        BranchGroup scene3 = new BranchGroup();
        
        scene3.addChild(hintergrund);
        
        scene1.compile();
        scene3.compile();
        
        universe.addBranchGraph(scene1);
        universe.addBranchGraph(scene3);
    }
    

    public BranchGroup createSceneGraph() 
    {
        BranchGroup objWurzel = new BranchGroup();
        BranchGroup wuerfel   = new BranchGroup();
        
        GeometryArray transparente_flaechen;
        GeometryArray flaechen;
        LineArray kanten;
        
        Point3f[] ecke = new Point3f[8];
        
        //Punkte des Würfels
        ecke[0] = new Point3f(-0.5f, 0.0f, 0.5f);
        ecke[1] = new Point3f( 0.5f, 0.0f, 0.5f);
        ecke[2] = new Point3f( 0.5f, 0.5f, 0.5f);
        ecke[3] = new Point3f(-0.5f, 0.5f, 0.5f);
        ecke[4] = new Point3f(-0.5f, 0.0f, -0.5f);
        ecke[5] = new Point3f( 0.5f, 0.0f, -0.5f);
        ecke[6] = new Point3f( 0.5f, 0.5f, -0.5f);
        ecke[7] = new Point3f(-0.5f, 0.5f, -0.5f);
        
        //sichtbare Flächen
        flaechen = new QuadArray(12, QuadArray.COORDINATES);
        flaechen.setCoordinate(0, ecke[0]);
        flaechen.setCoordinate(1, ecke[1]);
        flaechen.setCoordinate(2, ecke[5]);
        flaechen.setCoordinate(3, ecke[4]);
        flaechen.setCoordinate(4, ecke[0]);
        flaechen.setCoordinate(5, ecke[4]);
        flaechen.setCoordinate(6, ecke[7]);
        flaechen.setCoordinate(7, ecke[3]);
        flaechen.setCoordinate(8, ecke[4]);
        flaechen.setCoordinate(9, ecke[5]);
        flaechen.setCoordinate(10, ecke[6]);
        flaechen.setCoordinate(11, ecke[7]);
        
        // Normalen generieren
        GeometryInfo gi = new GeometryInfo(flaechen);
        NormalGenerator ng = new NormalGenerator();
        ng.generateNormals(gi);
        flaechen = gi.getGeometryArray();        
        
        //transparente Flächen
        transparente_flaechen = new QuadArray(12, QuadArray.COORDINATES);
        transparente_flaechen.setCoordinate(0, ecke[0]);
        transparente_flaechen.setCoordinate(1, ecke[1]);
        transparente_flaechen.setCoordinate(2, ecke[2]);
        transparente_flaechen.setCoordinate(3, ecke[3]);
        transparente_flaechen.setCoordinate(4, ecke[1]);
        transparente_flaechen.setCoordinate(5, ecke[5]);
        transparente_flaechen.setCoordinate(6, ecke[6]);
        transparente_flaechen.setCoordinate(7, ecke[2]);
        transparente_flaechen.setCoordinate(8, ecke[3]);
        transparente_flaechen.setCoordinate(9, ecke[2]);
        transparente_flaechen.setCoordinate(10, ecke[6]);
        transparente_flaechen.setCoordinate(11, ecke[7]);
        
        // Normalen generieren
        gi = new GeometryInfo(transparente_flaechen);
        ng = new NormalGenerator();
        ng.generateNormals(gi);
        transparente_flaechen = gi.getGeometryArray();        
        
        //Kanten der sichtbaren Flächen
        kanten = new LineArray(18, IndexedLineArray.COORDINATES);
        kanten.setCoordinate(0, ecke[0]);
        kanten.setCoordinate(1, ecke[1]);
        kanten.setCoordinate(2, ecke[1]);
        kanten.setCoordinate(3, ecke[5]);
        kanten.setCoordinate(4, ecke[0]);
        kanten.setCoordinate(5, ecke[3]);
        kanten.setCoordinate(6, ecke[5]);
        kanten.setCoordinate(7, ecke[4]);
        kanten.setCoordinate(8, ecke[0]);
        kanten.setCoordinate(9, ecke[4]);
        kanten.setCoordinate(10, ecke[3]);
        kanten.setCoordinate(11, ecke[7]);
        kanten.setCoordinate(12, ecke[4]);
        kanten.setCoordinate(13, ecke[7]);
        kanten.setCoordinate(14, ecke[6]);
        kanten.setCoordinate(15, ecke[7]);
        kanten.setCoordinate(16, ecke[5]);
        kanten.setCoordinate(17, ecke[6]);
        
        //appearance für die  Flaechen
        Appearance app_f = new Appearance();
        app_f.setMaterial(createMaterial());
        PolygonAttributes pa_f = new PolygonAttributes();
        pa_f.setCullFace(PolygonAttributes.CULL_NONE);
        app_f.setPolygonAttributes(pa_f);
        
        //appearance für die transparenten Flaechen
        Appearance app_t = new Appearance();
        TransparencyAttributes t_app = new TransparencyAttributes();
        t_app.setTransparencyMode(TransparencyAttributes.BLENDED);
        t_app.setTransparency(0.5f);
        app_t.setTransparencyAttributes(t_app);
        app_t.setMaterial(createMaterial());
        PolygonAttributes pa_t = new PolygonAttributes();
        pa_t.setCullFace(PolygonAttributes.CULL_NONE);
        app_t.setPolygonAttributes(pa_t);

        
        
        //appearance für die die Seiten des Wuerfels
        Appearance app_l = new Appearance();
        LineAttributes  l_att = new LineAttributes(2.0f,LineAttributes.PATTERN_SOLID, true);
        PointAttributes p_att = new PointAttributes(1.0f, true);
        ColoringAttributes c_att = new ColoringAttributes();
        c_att.setColor(new Color3f(Color.BLACK));
        app_l.setColoringAttributes(c_att);
        app_l.setPointAttributes(p_att);
        app_l.setLineAttributes(l_att);
        
        wuerfel.addChild(new Shape3D(flaechen, app_f));
        wuerfel.addChild(new Shape3D(kanten, app_l));
        wuerfel.addChild(new Shape3D(transparente_flaechen, app_t));
        
        //Rotation
        Transform3D drehung  = new Transform3D();
        Transform3D drehung2 = new Transform3D();
        drehung2.rotY(Math.PI / -5.0d);
        drehung.rotX(Math.PI  / 5.0d);
        drehung.mul(drehung2);
        TransformGroup objDreh = new TransformGroup(drehung);
        
        addMouseInteraction(objWurzel, objDreh);
        
        objDreh.addChild(wuerfel);
        objWurzel.addChild(objDreh);

        // Licht
        objDreh.addChild(createLight());
        
        objDreh.addChild(new Sphere(0.1f));
        
        return objWurzel;
    }

    
    private void addMouseInteraction(BranchGroup bg, TransformGroup tg)
    {
        tg.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
        
        Bounds bounds = new BoundingSphere(
            new Point3d(0.0d, 0.0d, 0.0d), Double.MAX_VALUE);
        
        MouseRotate mr = new MouseRotate();
        mr.setTransformGroup(tg);
        mr.setSchedulingBounds(bounds);
        bg.addChild(mr);
        
        MouseTranslate mt = new MouseTranslate();
        mt.setTransformGroup(tg);
        mt.setSchedulingBounds(bounds);
        bg.addChild(mt);
        
        MouseZoom mz = new MouseZoom();
        mz.setTransformGroup(tg);
        mz.setSchedulingBounds(bounds);
        bg.addChild(mz);
    }
    
    private Material createMaterial()
    {
        Color3f ambientColor = new Color3f(0.3f, 0.3f, 0.3f);
        Color3f emissiveColor = new Color3f(0.0f, 0.0f, 0.0f);
        Color3f specularColor = new Color3f(1.0f, 1.0f, 1.0f);
        Color3f diffuseColor = new Color3f(1.0f, 0.0f, 0.0f);
        float shininess = 20.0f;
        return new Material(ambientColor, emissiveColor,
            diffuseColor, specularColor, shininess);
    }
    
    private Node createLight()
    {
        Bounds bounds = new BoundingSphere(
            new Point3d(0.0d, 0.0d, 0.0d), Double.MAX_VALUE);
        Color3f pointColor= new Color3f(1.0f,1.0f,1.0f);
        Point3f pointPosition =new Point3f(1.0f,2.0f,1.0f);
        Point3f pointAtt = new Point3f(1.0f,0.0f,0.0f);
        PointLight pointLight = new PointLight(pointColor,pointPosition,pointAtt);
        pointLight.setInfluencingBounds(bounds);
        return pointLight;
    }
    

    public static void main(String[] args)
    {
        Third3DProgram prog = new Third3DProgram("mal sehen");
        prog.addWindowListener(new WindowAdapter()
        {
            @Override
            public void windowClosing(WindowEvent e)
            {
                System.exit(0);
            }
            
        });
        prog.setSize(800, 800);
        prog.setVisible (true);
    }
}
```


Und was war das jetzt mit den Linien...?


----------



## cable545 (10. Mai 2012)

Ähmm ja cool. Danke fürs "pimpen". Ich wollte einfach die Kanten im inneren des Körpers sichtbar machen. Aber durch die Beleuchtung sind die Kanten ja nun sichtbar. Schöne Ergänzungen. Ich danke Dir.


----------

