Polygonfläche beleuchten

Status
Nicht offen für weitere Antworten.
C

CptKebap

Gast
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.

Code:
        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);
 
C

CptKebap

Gast
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

Top Contributor
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?
 
C

CptKebap

Gast
Das ist der Code der gesamten Klasse:

Code:
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 :)
 
C

CptKebap

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

merlin2

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

CptKebap

Gast
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?
 
C

CptKebap

Gast
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

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

CptKebap

Gast
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...
 
C

CptKebap

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

diese Arrays übergeben:
Code:
 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:
Code:
    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

Top Contributor
So hat nicht mehr alles die gleiche Farbe:
Code:
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):
Code:
                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());
 
C

CptKebap

Gast
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 !
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen

Ähnliche Java Themen

Neue Themen


Oben