# Polygonfläche beleuchten



## CptKebap (16. Jul 2007)

Hallo,

Ich bin noch Anfänger und versuche eine etwas komplexere Fläche aus vielen Polygonen zu beleuchten, damit die körperlichlkeit zu sehen ist. Die Polygone erstelle ich mit einem TriangleStripArray. Als Lichtquelle habe ich ein PointLight über der Fläche gesetzt.
Mein Problem ist jetzt, dass die einzelnen Polygone nicht schattiert werden, sprich alle haben die gleiche Farbe. Wenn ich zum testen noch eine Sphere mit den selben Material usw Settings hinzufüge wird diese korrekt beleuchtet. Woran könnte das liegen? Für Hilfe wäre ich sehr dankbar!

Hier noch der relevante Quellcode:
In den Schleifen tu ich ein Punktraster Streifenweise dem Shape3D zuordnen, also für jeden Streifen ein TriangleStripArray anlegen.


```
PolygonAttributes polyatt = new PolygonAttributes();
        polyatt.setCullFace(PolygonAttributes.CULL_NONE);
        polyatt.setPolygonMode(PolygonAttributes.POLYGON_FILL);

        Appearance app2 = new Appearance();

        app2.setPolygonAttributes(polyatt);

        Material m = new Material(new Color3f(0.2f, 0.2f, 0.2f),
                                  new Color3f(0f, 0f, 0f),
                                  new Color3f(0.4f, 1f, 0.1f),
                                  new Color3f(1f, 0.2f, 0.7f),
                                  50f);

        m.setLightingEnable(true);
        app2.setMaterial(m);

        ColoringAttributes colorAttrib = new ColoringAttributes(0.5f, 0.2f,
                0.2f, ColoringAttributes.SHADE_GOURAUD);

        app2.setColoringAttributes(colorAttrib);

        Shape3D s3d2 = new Shape3D();
        s3d2.setAppearance(app2);

        for (int j = 0; j < (189 - 1); j++) {

            for (int k = 0; k < 2; k++) {
                Vector temp = new Vector();
                if (k == 0) {
                    for (int i = 0; i < (240 - 1); i++) {

                        temp.add(new Point3d(xKoor[i + j * 240],
                                             yKoor[i + j * 240],
                                             zKoor[i + j * 240]));
                        temp.add(new Point3d(xKoor[(i + 1) + j * 240],
                                             yKoor[(i + 1) + j * 240],
                                             zKoor[(i + 1) + j * 240]));
                        temp.add(new Point3d(xKoor[(i + 240) + j * 240],
                                             yKoor[(i + 240) + j * 240],
                                             zKoor[(i + 240) + j * 240]));

                    }
                } else if (k == 1) {
                    for (int i = 0; i < (240 - 1); i++) {

                        temp.add(new Point3d(xKoor[i + 1 + j * 240],
                                             yKoor[i + 1 + j * 240],
                                             zKoor[i + 1 + j * 240]));
                        temp.add(new Point3d(xKoor[i + 240 + 1 + j * 240],
                                             yKoor[i + 240 + 1 + j * 240],
                                             zKoor[i + 240 + 1 + j * 240]));
                        temp.add(new Point3d(xKoor[i + 240 + j * 240],
                                             yKoor[i + 240 + j * 240],
                                             zKoor[i + 240 + j * 240]));

                    }
                }

                Point3d[] reihe = new Point3d[temp.size()];
                for (int u = 0; u < temp.size(); u++) {
                    reihe[u] = (Point3d) temp.get(u);
                }

                int[] StripCount = {reihe.length};

                TriangleStripArray tsa = new TriangleStripArray(reihe.length,

                        TriangleStripArray.COORDINATES |
                        TriangleStripArray.COLOR_3 | TriangleStripArray.NORMALS,
                        StripCount);

                tsa.setCoordinates(0, reihe);

                s3d2.addGeometry(tsa);

            }
        }

        pointTG.addChild(s3d2);
```


----------



## merlin2 (17. Jul 2007)

Übersehe ich, dass du Normalen generierst oder fehlen die? ???:L


----------



## CptKebap (17. Jul 2007)

Da bin ich mir nicht so ganz sicher,

TriangleStripArray tsa = new TriangleStripArray(reihe.length, 
                        TriangleStripArray.COORDINATES | 
                        TriangleStripArray.COLOR_3 | TriangleStripArray.NORMALS, 
                        StripCount); 

im Konstruktor des TriangleStripArrays übergebe ich ja
TriangleStripArray.NORMALS, allerdings weis ich nicht genau ob es damit getan ist ?!


----------



## merlin2 (17. Jul 2007)

Ich wüsste wirklich nicht, woran es sonst liegen könnte, bin aber kein Java3D-Experte.
Kannst du mal compilierbaren, ausführbaren Code posten, damit man das Problem leichter erkennt?


----------



## CptKebap (17. Jul 2007)

Das ist der Code der gesamten Klasse:


```
import java.awt.*;
import javax.swing.*;
import javax.media.j3d.*;
import com.sun.j3d.utils.universe.*;
import com.sun.j3d.utils.behaviors.mouse.*;
import javax.vecmath.*;
import com.sun.j3d.utils.geometry.Text2D;
import java.util.Vector;
import com.sun.j3d.utils.geometry.Sphere;


public class Raeumlich extends JPanel {
    private SimpleUniverse u = null;
    private BranchGroup rootBG;
    private TransformGroup pointTG;
    private TransformGroup mainTG;
    private Transform3D mainT3D;
    private TransformGroup xTG;
    private TransformGroup yTG;
    private TransformGroup zTG;
    private Transform3D xT3D;
    private Transform3D yT3D;
    private Transform3D zT3D;
    private BoundingSphere bigBounds;
    private double[] xKoor, yKoor, zKoor;


    public Raeumlich(double[] xKoor, double[] yKoor, double[] zKoor) {

        this.xKoor = xKoor;
        this.yKoor = yKoor;
        this.zKoor = zKoor;

        init();
    }

    private BranchGroup createInv() {
        rootBG = new BranchGroup();
        mainTG = new TransformGroup();
        pointTG = new TransformGroup();
        mainT3D = new Transform3D();
        xT3D = new Transform3D();
        yT3D = new Transform3D();
        zT3D = new Transform3D();
        xTG = new TransformGroup();
        yTG = new TransformGroup();
        zTG = new TransformGroup();
        bigBounds = new BoundingSphere(new Point3d(), 100000);

        // Licht wird hinzugefügt
        AmbientLight ALgt = new AmbientLight(new Color3f(1f, 1f, 1f));
        ALgt.setInfluencingBounds(bigBounds);
        PointLight PLgt = new PointLight(new Color3f(1f, 0.5f, 1f),
                                         new Point3f(0f, 0f, 7f),
                                         new Point3f(1f, 0f, 0f));
        PLgt.setEnable(true);
        PLgt.setInfluencingBounds(bigBounds);


        rootBG.addChild(ALgt);
        pointTG.addChild(PLgt);

        //Die Farbe des Hintergrundes auf weiss setzten
        Background backg = new Background(1f, 1f, 1f);
        backg.setApplicationBounds(bigBounds);
        rootBG.addChild(backg);

        //Das Koordinatensystem zoomen und drehen
        mainT3D.setTranslation(new Vector3f( -6f, -6f, -22f));
        mainTG.setTransform(mainT3D);

        mainTG.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
        mainTG.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);
        mainTG.setCapability(TransformGroup.ALLOW_CHILDREN_EXTEND);
        mainTG.setCapability(TransformGroup.ALLOW_CHILDREN_READ);
        mainTG.setCapability(TransformGroup.ALLOW_CHILDREN_WRITE);

        //der Haupt TransformGroup werden die einzelnen Kinder zugeordnet
        mainTG.addChild(xTG);
        mainTG.addChild(yTG);
        mainTG.addChild(zTG);
        mainTG.addChild(pointTG);

        //Koordinatenachsen hinzufügen
        addAxis();

        //Achsenbeschriftung hinzufügen
        addAxisText();

        //MausBehavior hinzufügen
        MouseBehavior();

        //Fügt die Fläche hinzu
        convertPoints();

        rootBG.addChild(mainTG);

        return rootBG;
    }


    /**
     * Koordinatenachsen werden erstellt
     */
    private void addAxis() {
        Point3f x1 = new Point3f(12f, 0f, 0f);
        Point3f x2 = new Point3f( -12f, 0f, 0f);
        Point3f y1 = new Point3f(0f, 13f, 0f);
        Point3f y2 = new Point3f(0f, -13f, 0f);
        Point3f z1 = new Point3f(0f, 0f, 10f);
        Point3f z2 = new Point3f(0f, 0f, -10f);

        LineArray la = new LineArray(2,
                                     LineArray.COORDINATES | LineArray.COLOR_3);
        la.setCoordinate(0, x1);
        la.setCoordinate(1, x2);
        la.setColor(0, new Color3f(1f, 0f, 0f));
        la.setColor(1, new Color3f(1f, 0f, 0f));

        LineArray la2 = new LineArray(2,
                                      LineArray.COORDINATES | LineArray.COLOR_3);
        la2.setCoordinate(0, y1);
        la2.setCoordinate(1, y2);
        la2.setColor(0, new Color3f(1f, 0f, 0f));
        la2.setColor(1, new Color3f(1f, 0f, 0f));

        LineArray la3 = new LineArray(2,
                                      LineArray.COORDINATES | LineArray.COLOR_3);
        la3.setCoordinate(0, z1);
        la3.setCoordinate(1, z2);
        la3.setColor(0, new Color3f(1f, 0f, 0f));
        la3.setColor(1, new Color3f(1f, 0f, 0f));

        mainTG.addChild(new Shape3D(la));
        mainTG.addChild(new Shape3D(la2));
        mainTG.addChild(new Shape3D(la3));
    }

    /**
     * Koordinatenachsenbeschriftungen werden erstellt
     */
    private void addAxisText() {
        Text2D X = new Text2D("Z", new Color3f(0f, 0f, 0f), "Helvetica", 70, 0);
        Text2D Y = new Text2D("X", new Color3f(0f, 0f, 0f), "Helvetica", 70, 0);
        Text2D Z = new Text2D("Y", new Color3f(0f, 0f, 0f), "Helvetica", 70, 0);

        //Koordinatenachsenbeschriftung an die richtige Stelle verschieben und hinzufügen
        xT3D.setTranslation(new Vector3f(0f, 0f, 10f));
        xTG.setTransform(xT3D);

        yT3D.setTranslation(new Vector3f(12f, 0f, 0f));
        yTG.setTransform(yT3D);

        zT3D.setTranslation(new Vector3f(0f, 13f, 0f));
        zTG.setTransform(zT3D);

        //Koordinatenbeschriftung mitdrehen lassen
        OrientedShape3D oshape1 = new OrientedShape3D();
        OrientedShape3D oshape2 = new OrientedShape3D();
        OrientedShape3D oshape3 = new OrientedShape3D();
        oshape1.setGeometry(X.getGeometry());
        oshape1.setAppearance(X.getAppearance());
        oshape2.setGeometry(Y.getGeometry());
        oshape2.setAppearance(Y.getAppearance());
        oshape3.setGeometry(Z.getGeometry());
        oshape3.setAppearance(Z.getAppearance());
        xTG.addChild(oshape1);
        yTG.addChild(oshape2);
        zTG.addChild(oshape3);
    }

    /**
     * Das Übergebene Punktraster wird Vermascht und daraus eine Polygonfläche generiert
     *
     */
    private void convertPoints() {
        PolygonAttributes polyatt = new PolygonAttributes();
        polyatt.setCullFace(PolygonAttributes.CULL_NONE);
        polyatt.setPolygonMode(PolygonAttributes.POLYGON_LINE);

        Appearance app2 = new Appearance();

        app2.setPolygonAttributes(polyatt);

        Material m = new Material(new Color3f(0.2f, 0.2f, 0.2f),
                                  new Color3f(0f, 0f, 0f),
                                  new Color3f(0.4f, 1f, 0.1f),
                                  new Color3f(1f, 0.2f, 0.7f),
                                  50f);

       // m.setLightingEnable(true);
        app2.setMaterial(m);
        int colorShademodel = ColoringAttributes.SHADE_GOURAUD;
        float coRed = 0.5f, coGreen = 0.2f, coBlue = 0.2f;

        ColoringAttributes colorAttrib = new ColoringAttributes(coRed, coGreen,
                coBlue, colorShademodel);

        app2.setColoringAttributes(colorAttrib);

        Shape3D s3d2 = new Shape3D();
        s3d2.setAppearance(app2);

        for (int j = 0; j < (189 - 1); j++) {

            for (int k = 0; k < 2; k++) {
                Vector temp = new Vector();
                if (k == 0) {
                    for (int i = 0; i < (240 - 1); i++) {

                        temp.add(new Point3d(xKoor[i + j * 240],
                                             yKoor[i + j * 240],
                                             zKoor[i + j * 240]));
                        temp.add(new Point3d(xKoor[(i + 1) + j * 240],
                                             yKoor[(i + 1) + j * 240],
                                             zKoor[(i + 1) + j * 240]));
                        temp.add(new Point3d(xKoor[(i + 240) + j * 240],
                                             yKoor[(i + 240) + j * 240],
                                             zKoor[(i + 240) + j * 240]));

                    }
                } else if (k == 1) {
                    for (int i = 0; i < (240 - 1); i++) {

                        temp.add(new Point3d(xKoor[i + 1 + j * 240],
                                             yKoor[i + 1 + j * 240],
                                             zKoor[i + 1 + j * 240]));
                        temp.add(new Point3d(xKoor[i + 240 + 1 + j * 240],
                                             yKoor[i + 240 + 1 + j * 240],
                                             zKoor[i + 240 + 1 + j * 240]));
                        temp.add(new Point3d(xKoor[i + 240 + j * 240],
                                             yKoor[i + 240 + j * 240],
                                             zKoor[i + 240 + j * 240]));

                    }
                }

                Point3d[] reihe = new Point3d[temp.size()];
                for (int u = 0; u < temp.size(); u++) {
                    reihe[u] = (Point3d) temp.get(u);
                }

                int[] StripCount = {reihe.length};

                TriangleStripArray tsa = new TriangleStripArray(reihe.length,

                        TriangleStripArray.COORDINATES |
                        TriangleStripArray.COLOR_3 | TriangleStripArray.NORMALS,
                        StripCount);

                tsa.setCoordinates(0, reihe);

                s3d2.addGeometry(tsa);

            }
        }
        Sphere sph = new Sphere(1.0f,
                                Sphere.GENERATE_NORMALS | Sphere.GENERATE_TEXTURE_COORDS,
                                100, app2);
        pointTG.addChild(s3d2);
        pointTG.addChild(sph);
    }

    /**
     * Möglichkeit das System zu drehen zu zoomen und zu verschieben wird realisiert
     */
    private void MouseBehavior() {
        MouseRotate myMouseRotate = new MouseRotate();
        myMouseRotate.setTransformGroup(mainTG);
        myMouseRotate.setSchedulingBounds(bigBounds);
        rootBG.addChild(myMouseRotate);

        MouseZoom myMouseZoom = new MouseZoom();
        myMouseZoom.setTransformGroup(mainTG);
        myMouseZoom.setSchedulingBounds(bigBounds);
        rootBG.addChild(myMouseZoom);

        MouseTranslate myMouseTranslate = new MouseTranslate();
        myMouseTranslate.setTransformGroup(mainTG);
        myMouseTranslate.setSchedulingBounds(bigBounds);
        rootBG.addChild(myMouseTranslate);
    }

    /**
     * Erzeugt den "3D-Raum"
     */
    private void init() {

        setLayout(new BorderLayout());
        Canvas3D c = new Canvas3D(SimpleUniverse.getPreferredConfiguration());
        add("Center", c);
        u = new SimpleUniverse(c);
        u.getViewingPlatform().setNominalViewingTransform();
        u.addBranchGraph(createInv());
    }

}
```

Aber schonmal vielen Dank das du dir Gedanken gemacht hast


----------



## CptKebap (17. Jul 2007)

Is jetzt nur ein JPanel, falls du was ausführbares bräuchtest müsst ich glaube das ganze Programm dir irgendwie zukommen lassen.


----------



## merlin2 (17. Jul 2007)

Wenn ich jetzt noch einen Hinweis auf den Konstruktoraufruf hätte, würde es reichen.
Ich schaffe es nicht, die Klasse korrekt zu instanzieren.


----------



## CptKebap (17. Jul 2007)

Es müssen 3 double-Arrays übergeben werden, in denen sich Koordinaten befinden, im 1. Array X-Koordinaten, im 2. Y und im 3. Z. 
War es das was du meintest?


----------



## CptKebap (17. Jul 2007)

Ich hab grad noch gesehn das folgende Zeile geändert werden muss,
sonst wird nur das Gittermodell dargestellt:

Zeile 180 in polyatt.setPolygonMode(PolygonAttributes.POLYGON_FILL);


----------



## merlin2 (17. Jul 2007)

Rufe ich den Konstruktor mit double-Arrays auf, wird eine Exception geworfen.
Bedeutet letzterer Post, dass es jetzt funktioniert?


----------



## CptKebap (17. Jul 2007)

Nein der letzte Post war nur eine Anmerkung.
An welcher Stelle wird die Exception geworfen ? Spontan würde ich vermuten in der Methode convertPoints, da in den For-Schleifen von einer ganz bestimmten Größe der Arrays ausgegangen wird...


----------



## CptKebap (17. Jul 2007)

Falls das das Problem war, so müsste es gehen:

diese Arrays übergeben:

```
double[] testx = {0,0,0,0,0,1,1,1,1,1,2,2,2,2,2,3,3,3,3,3,4,4,4,4,4};
 double[] testy = {0,1,2,3,4,0,1,2,3,4,0,1,2,3,4,0,1,2,3,4,0,1,2,3,4};
 double[] testz = {1,2,1,1,3,2,3,2,2,3,1,1,2,3,2,2,2,3,1,2,3,3,2,3,2};

 Raeumlich r = new Raeumlich(testx, testy, testz);
```

und dann in der Klasse Raeumlich die ConvertPointsmethode hiermit ersetzen:

```
private void convertPoints() {
        PolygonAttributes polyatt = new PolygonAttributes();
        polyatt.setCullFace(PolygonAttributes.CULL_NONE);
        polyatt.setPolygonMode(PolygonAttributes.POLYGON_FILL);

        Appearance app2 = new Appearance();

        app2.setPolygonAttributes(polyatt);

        Material m = new Material(new Color3f(0.2f, 0.2f, 0.2f),
                                  new Color3f(0f, 0f, 0f),
                                  new Color3f(0.4f, 1f, 0.1f),
                                  new Color3f(1f, 0.2f, 0.7f),
                                  50f);

        m.setLightingEnable(true);
        app2.setMaterial(m);
        int colorShademodel = ColoringAttributes.SHADE_GOURAUD;
        float coRed = 0.5f, coGreen = 0.2f, coBlue = 0.2f;

        ColoringAttributes colorAttrib = new ColoringAttributes(coRed, coGreen,
                coBlue, colorShademodel);

        app2.setColoringAttributes(colorAttrib);

        Shape3D s3d2 = new Shape3D();
        s3d2.setAppearance(app2);

        
        for (int j = 0; j < (5 - 1); j++) {

            for (int k = 0; k < 2; k++) {
                Vector temp = new Vector();
                if (k == 0) {
                    for (int i = 0; i < (5 - 1); i++) {

                        temp.add(new Point3d(xKoor[i + j * 5],
                                             yKoor[i + j * 5],
                                             zKoor[i + j * 5]));
                        temp.add(new Point3d(xKoor[(i + 1) + j * 5],
                                             yKoor[(i + 1) + j * 5],
                                             zKoor[(i + 1) + j * 5]));
                        temp.add(new Point3d(xKoor[(i + 5) + j * 5],
                                             yKoor[(i + 5) + j * 5],
                                             zKoor[(i + 5) + j * 5]));

                    }
                } else if (k == 1) {
                    for (int i = 0; i < (5 - 1); i++) {

                        temp.add(new Point3d(xKoor[i + 1 + j * 5],
                                             yKoor[i + 1 + j * 5],
                                             zKoor[i + 1 + j * 5]));
                        temp.add(new Point3d(xKoor[i + 5 + 1 + j * 5],
                                             yKoor[i + 5 + 1 + j * 5],
                                             zKoor[i + 5 + 1 + j * 5]));
                        temp.add(new Point3d(xKoor[i + 5 + j * 5],
                                             yKoor[i + 5 + j * 5],
                                             zKoor[i + 5 + j * 5]));

                    }
                }
        

                Point3d[] reihe = new Point3d[temp.size()];
                for (int u = 0; u < temp.size(); u++) {
                    reihe[u] = (Point3d) temp.get(u);
                }

                int[] StripCount = {reihe.length};

                TriangleStripArray tsa = new TriangleStripArray(reihe.length,

                        TriangleStripArray.COORDINATES |
                        TriangleStripArray.COLOR_3 | TriangleStripArray.NORMALS,
                        StripCount);

                tsa.setCoordinates(0, reihe);

                s3d2.addGeometry(tsa);

            }
        }

        Sphere sph = new Sphere(1.0f,
                                Sphere.GENERATE_NORMALS | Sphere.GENERATE_TEXTURE_COORDS,
                                100, app2);
        pointTG.addChild(s3d2);
        pointTG.addChild(sph);
    }
```


----------



## merlin2 (17. Jul 2007)

So hat nicht mehr alles die gleiche Farbe:

```
import java.awt.*;
import javax.swing.*;
import javax.media.j3d.*;
import com.sun.j3d.utils.universe.*;
import com.sun.j3d.utils.behaviors.mouse.*;
import javax.vecmath.*;
import com.sun.j3d.utils.geometry.Text2D;
import com.sun.j3d.utils.geometry.*;
import java.util.Vector;
import com.sun.j3d.utils.geometry.Sphere;


public class Raeumlich extends JPanel {
    private SimpleUniverse u = null;
    private BranchGroup rootBG;
    private TransformGroup pointTG;
    private TransformGroup mainTG;
    private Transform3D mainT3D;
    private TransformGroup xTG;
    private TransformGroup yTG;
    private TransformGroup zTG;
    private Transform3D xT3D;
    private Transform3D yT3D;
    private Transform3D zT3D;
    private BoundingSphere bigBounds;
    private double[] xKoor, yKoor, zKoor;


    public Raeumlich(double[] xKoor, double[] yKoor, double[] zKoor) {

        this.xKoor = xKoor;
        this.yKoor = yKoor;
        this.zKoor = zKoor;

        init();
    }

    private BranchGroup createInv() {
        rootBG = new BranchGroup();
        mainTG = new TransformGroup();
        pointTG = new TransformGroup();
        mainT3D = new Transform3D();
        xT3D = new Transform3D();
        yT3D = new Transform3D();
        zT3D = new Transform3D();
        xTG = new TransformGroup();
        yTG = new TransformGroup();
        zTG = new TransformGroup();
        bigBounds = new BoundingSphere(new Point3d(), 100000);

        // Licht wird hinzugefügt
        AmbientLight ALgt = new AmbientLight(new Color3f(1f, 1f, 1f));
        ALgt.setInfluencingBounds(bigBounds);
        PointLight PLgt = new PointLight(new Color3f(1f, 0.5f, 1f),
                                         new Point3f(0f, 0f, 7f),
                                         new Point3f(1f, 0f, 0f));
        PLgt.setEnable(true);
        PLgt.setInfluencingBounds(bigBounds);


        rootBG.addChild(ALgt);
        pointTG.addChild(PLgt);

        //Die Farbe des Hintergrundes auf weiss setzten
        Background backg = new Background(1f, 1f, 1f);
        backg.setApplicationBounds(bigBounds);
        rootBG.addChild(backg);

        //Das Koordinatensystem zoomen und drehen
        mainT3D.setTranslation(new Vector3f( -6f, -6f, -22f));
        mainTG.setTransform(mainT3D);

        mainTG.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
        mainTG.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);
        mainTG.setCapability(TransformGroup.ALLOW_CHILDREN_EXTEND);
        mainTG.setCapability(TransformGroup.ALLOW_CHILDREN_READ);
        mainTG.setCapability(TransformGroup.ALLOW_CHILDREN_WRITE);

        //der Haupt TransformGroup werden die einzelnen Kinder zugeordnet
        mainTG.addChild(xTG);
        mainTG.addChild(yTG);
        mainTG.addChild(zTG);
        mainTG.addChild(pointTG);

        //Koordinatenachsen hinzufügen
        addAxis();

        //Achsenbeschriftung hinzufügen
        addAxisText();

        //MausBehavior hinzufügen
        MouseBehavior();

        //Fügt die Fläche hinzu
        convertPoints();

        rootBG.addChild(mainTG);

        return rootBG;
    }


    /**
     * Koordinatenachsen werden erstellt
     */
    private void addAxis() {
        Point3f x1 = new Point3f(12f, 0f, 0f);
        Point3f x2 = new Point3f( -12f, 0f, 0f);
        Point3f y1 = new Point3f(0f, 13f, 0f);
        Point3f y2 = new Point3f(0f, -13f, 0f);
        Point3f z1 = new Point3f(0f, 0f, 10f);
        Point3f z2 = new Point3f(0f, 0f, -10f);

        LineArray la = new LineArray(2,
                                     LineArray.COORDINATES | LineArray.COLOR_3);
        la.setCoordinate(0, x1);
        la.setCoordinate(1, x2);
        la.setColor(0, new Color3f(1f, 0f, 0f));
        la.setColor(1, new Color3f(1f, 0f, 0f));

        LineArray la2 = new LineArray(2,
                                      LineArray.COORDINATES | LineArray.COLOR_3);
        la2.setCoordinate(0, y1);
        la2.setCoordinate(1, y2);
        la2.setColor(0, new Color3f(1f, 0f, 0f));
        la2.setColor(1, new Color3f(1f, 0f, 0f));

        LineArray la3 = new LineArray(2,
                                      LineArray.COORDINATES | LineArray.COLOR_3);
        la3.setCoordinate(0, z1);
        la3.setCoordinate(1, z2);
        la3.setColor(0, new Color3f(1f, 0f, 0f));
        la3.setColor(1, new Color3f(1f, 0f, 0f));

        mainTG.addChild(new Shape3D(la));
        mainTG.addChild(new Shape3D(la2));
        mainTG.addChild(new Shape3D(la3));
    }

    /**
     * Koordinatenachsenbeschriftungen werden erstellt
     */
    private void addAxisText() {
        Text2D X = new Text2D("Z", new Color3f(0f, 0f, 0f), "Helvetica", 70, 0);
        Text2D Y = new Text2D("X", new Color3f(0f, 0f, 0f), "Helvetica", 70, 0);
        Text2D Z = new Text2D("Y", new Color3f(0f, 0f, 0f), "Helvetica", 70, 0);

        //Koordinatenachsenbeschriftung an die richtige Stelle verschieben und hinzufügen
        xT3D.setTranslation(new Vector3f(0f, 0f, 10f));
        xTG.setTransform(xT3D);

        yT3D.setTranslation(new Vector3f(12f, 0f, 0f));
        yTG.setTransform(yT3D);

        zT3D.setTranslation(new Vector3f(0f, 13f, 0f));
        zTG.setTransform(zT3D);

        //Koordinatenbeschriftung mitdrehen lassen
        OrientedShape3D oshape1 = new OrientedShape3D();
        OrientedShape3D oshape2 = new OrientedShape3D();
        OrientedShape3D oshape3 = new OrientedShape3D();
        oshape1.setGeometry(X.getGeometry());
        oshape1.setAppearance(X.getAppearance());
        oshape2.setGeometry(Y.getGeometry());
        oshape2.setAppearance(Y.getAppearance());
        oshape3.setGeometry(Z.getGeometry());
        oshape3.setAppearance(Z.getAppearance());
        xTG.addChild(oshape1);
        yTG.addChild(oshape2);
        zTG.addChild(oshape3);
    }

    /**
     * Das Übergebene Punktraster wird Vermascht und daraus eine Polygonfläche generiert
     *
     */
    private void convertPoints() {
        PolygonAttributes polyatt = new PolygonAttributes();
        polyatt.setCullFace(PolygonAttributes.CULL_NONE);
        polyatt.setPolygonMode(PolygonAttributes.POLYGON_FILL);

        Appearance app2 = new Appearance();

        app2.setPolygonAttributes(polyatt);

        Material m = new Material(new Color3f(0.2f, 0.2f, 0.2f),
                                  new Color3f(0f, 0f, 0f),
                                  new Color3f(0.4f, 1f, 0.1f),
                                  new Color3f(1f, 0.2f, 0.7f),
                                  50f);

        m.setLightingEnable(true);
        app2.setMaterial(m);
        int colorShademodel = ColoringAttributes.SHADE_GOURAUD;
        float coRed = 0.5f, coGreen = 0.2f, coBlue = 0.2f;

        ColoringAttributes colorAttrib = new ColoringAttributes(coRed, coGreen,
                coBlue, colorShademodel);

        app2.setColoringAttributes(colorAttrib);

        Shape3D s3d2 = new Shape3D();
        s3d2.setAppearance(app2);


        for (int j = 0; j < (5 - 1); j++) {

            for (int k = 0; k < 2; k++) {
                Vector temp = new Vector();
                if (k == 0) {
                    for (int i = 0; i < (5 - 1); i++) {

                        temp.add(new Point3d(xKoor[i + j * 5],
                                             yKoor[i + j * 5],
                                             zKoor[i + j * 5]));
                        temp.add(new Point3d(xKoor[(i + 1) + j * 5],
                                             yKoor[(i + 1) + j * 5],
                                             zKoor[(i + 1) + j * 5]));
                        temp.add(new Point3d(xKoor[(i + 5) + j * 5],
                                             yKoor[(i + 5) + j * 5],
                                             zKoor[(i + 5) + j * 5]));

                    }
                } else if (k == 1) {
                    for (int i = 0; i < (5 - 1); i++) {

                        temp.add(new Point3d(xKoor[i + 1 + j * 5],
                                             yKoor[i + 1 + j * 5],
                                             zKoor[i + 1 + j * 5]));
                        temp.add(new Point3d(xKoor[i + 5 + 1 + j * 5],
                                             yKoor[i + 5 + 1 + j * 5],
                                             zKoor[i + 5 + 1 + j * 5]));
                        temp.add(new Point3d(xKoor[i + 5 + j * 5],
                                             yKoor[i + 5 + j * 5],
                                             zKoor[i + 5 + j * 5]));

                    }
                }


                Point3d[] reihe = new Point3d[temp.size()];
                for (int u = 0; u < temp.size(); u++) {
                    reihe[u] = (Point3d) temp.get(u);
                }

                int[] StripCount = {reihe.length};

                TriangleStripArray tsa = new TriangleStripArray(reihe.length,

                        TriangleStripArray.COORDINATES |
                        TriangleStripArray.COLOR_3 | TriangleStripArray.NORMALS,
                        StripCount);

                tsa.setCoordinates(0, reihe);

                GeometryInfo gi = new GeometryInfo(tsa);

                NormalGenerator ng = new NormalGenerator();
                ng.generateNormals(gi);


                s3d2.addGeometry(gi.getGeometryArray());

            }
        }

        Sphere sph = new Sphere(1.0f,
                                Sphere.GENERATE_NORMALS | Sphere.GENERATE_TEXTURE_COORDS,
                                100, app2);
        pointTG.addChild(s3d2);
        pointTG.addChild(sph);
    }

    /**
     * Möglichkeit das System zu drehen zu zoomen und zu verschieben wird realisiert
     */
    private void MouseBehavior() {
        MouseRotate myMouseRotate = new MouseRotate();
        myMouseRotate.setTransformGroup(mainTG);
        myMouseRotate.setSchedulingBounds(bigBounds);
        rootBG.addChild(myMouseRotate);

        MouseZoom myMouseZoom = new MouseZoom();
        myMouseZoom.setTransformGroup(mainTG);
        myMouseZoom.setSchedulingBounds(bigBounds);
        rootBG.addChild(myMouseZoom);

        MouseTranslate myMouseTranslate = new MouseTranslate();
        myMouseTranslate.setTransformGroup(mainTG);
        myMouseTranslate.setSchedulingBounds(bigBounds);
        rootBG.addChild(myMouseTranslate);
    }

    /**
     * Erzeugt den "3D-Raum"
     */
    private void init() {

        setLayout(new BorderLayout());
        Canvas3D c = new Canvas3D(SimpleUniverse.getPreferredConfiguration());
        add("Center", c);
        u = new SimpleUniverse(c);
        u.getViewingPlatform().setNominalViewingTransform();
        u.addBranchGraph(createInv());
    }
    public static void main(String args[]) {
      JFrame f = new JFrame();
      double[] testx = {0,0,0,0,0,1,1,1,1,1,2,2,2,2,2,3,3,3,3,3,4,4,4,4,4};
      double[] testy = {0,1,2,3,4,0,1,2,3,4,0,1,2,3,4,0,1,2,3,4,0,1,2,3,4};
      double[] testz = {1,2,1,1,3,2,3,2,2,3,1,1,2,3,2,2,2,3,1,2,3,3,2,3,2};
      Raeumlich r = new Raeumlich(testx, testy, testz);
      f.add(r);
      f.setSize(700, 700);
      f.setVisible(true);
    }
}
```
Anmerkung:
Es ist vermutlich umständlicher als nötig.  :wink:
Von Körperlichkeit kann man auch nicht sprechen. :cry:
Aber die Polygone haben verschiedene Farben.
Fazit: Es lag an den Normalen! :lol: 
Relevante Änderungen (73-81 deiner aktuellen convertPoints):
	
	
	
	





```
TriangleStripArray tsa = new TriangleStripArray(reihe.length,

                        TriangleStripArray.COORDINATES |
                        TriangleStripArray.COLOR_3 | TriangleStripArray.NORMALS,
                        StripCount);

                tsa.setCoordinates(0, reihe);

                GeometryInfo gi = new GeometryInfo(tsa);

                NormalGenerator ng = new NormalGenerator();
                ng.generateNormals(gi);


                s3d2.addGeometry(gi.getGeometryArray());
```


----------



## CptKebap (17. Jul 2007)

Vielen Dank! Jetzt kann ich die Beleuchtung noch optimieren, und mit den Richtigen Koordinaten sieht das ganze auch "körperlicher" aus .  
Das es so umständlicher ist als es wahrscheinlich nötig ist dachte ich mir schon, aber ich bin froh das es überhaupt irgendwie geht 

Also nochmal vielen Dank für deine Hilfe !


----------

