2011-01-11 4 views
1

Codierung seit über 20 Jahren. Ich bin neu bei Java3d, aber ich bin wirklich beeindruckt davon - beibehaltener Modus ist so viel einfacher als Direktmodus!Java3d Beleuchtungsproblem

Wie auch immer, ich habe ein Problem mit der Beleuchtung. Wenn ich meine eigene Geometrie erstelle, kann ich keine Beleuchtung zum Arbeiten bekommen; Wenn ich Geometrie verwende, die von java3d utils (z. B. Sphere()) erstellt wurde, funktioniert die Beleuchtung einwandfrei. Das Problem, das ich sehe, ist, dass mein Objekt von allen Seiten weiß ist. Ich habe versucht, Umgebungs- und Richtungslichter hinzuzufügen, und meine Objekte sind immer weiß.

Die Dokumente sagen, dass ich keine Farbdarstellung Attribute auf meine Objekte liefern soll, wenn ich Beleuchtung verwenden möchte und ich mache das nicht. Es sagt auch, ich sollte Normale liefern und das mache ich. Ich habe versucht, beide Normalen von Hand zu erstellen und mit NormalGenerator. Ich habe Java3d 1.5.1 und die Pre-Version 1.6.0 ohne Erfolg versucht. Ich benutze Java 1.6.0_18 auf Windows 7 64 Bit.

Es gibt nicht viel zu diesem Code. Das Problem muss etwas wirklich Grundlegendes sein, aber ich kann es nicht sehen. Ich habe hier zwei meiner Geometriefunktionen eingefügt, wo die Beleuchtung nicht funktioniert. Bitte werfen Sie einen Blick und lassen Sie mich wissen, was ich falsch mache:

protected BranchGroup createTriangle() { 
    Point3f[] vertices = { new Point3f(-1, 0, 0), new Point3f(1, 0, 0), 
    new Point3f(0, 1, 0), }; 
    int indices[] = { 0, 1, 2, }; 

    GeometryInfo geometryInfo = new GeometryInfo(
    GeometryInfo.TRIANGLE_ARRAY); 
    geometryInfo.setCoordinates(vertices); 
    geometryInfo.setCoordinateIndices(indices); 

// NormalGenerator normalGenerator = new NormalGenerator(); 
// normalGenerator.generateNormals(geometryInfo); 

    Vector3f[] normals = { new Vector3f(0.0f, 0.0f, 1.0f), }; 
    int normalIndices[] = { 0, 0, 0, }; 
    geometryInfo.setNormals(normals); 
    geometryInfo.setNormalIndices(normalIndices); 

    Shape3D shape = new Shape3D(geometryInfo.getIndexedGeometryArray()); 

    BranchGroup group = new BranchGroup(); 
    group.addChild(shape); 

    return group; 
} 

protected BranchGroup createBox() { 

    Point3d[] vertices = { new Point3d(-1, 1, -1), new Point3d(1, 1, -1), 
    new Point3d(1, 1, 1), new Point3d(-1, 1, 1), 
    new Point3d(-1, -1, -1), new Point3d(1, -1, -1), 
    new Point3d(1, -1, 1), new Point3d(-1, -1, 1), }; 

    int[] indices = { 0, 1, 5, 0, 5, 4, 1, 2, 6, 1, 6, 5, 2, 3, 7, 2, 7, 6, 
    3, 0, 4, 3, 4, 7, 0, 3, 2, 0, 2, 1, 4, 5, 3, 2, 3, 5, }; 

    GeometryInfo geometryInfo = new GeometryInfo(
    GeometryInfo.TRIANGLE_ARRAY); 
    geometryInfo.setCoordinates(vertices); 
    geometryInfo.setCoordinateIndices(indices); 

    NormalGenerator normalGenerator = new NormalGenerator(); 
    normalGenerator.generateNormals(geometryInfo); 

    // Vector3f[] normals = { new Vector3f(0, 0, -1), new Vector3f(1, 0, 0), 
    // new Vector3f(0, 0, 1), new Vector3f(-1, 0, 0), 
    // new Vector3f(0, 1, 0), new Vector3f(0, -1, 0), }; 
    // int[] normalIndices = { 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 2, 2, 2, 
    // 2, 
    // 2, 2, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, }; 
    // geometryInfo.setNormals(normals); 
    // geometryInfo.setNormalIndices(normalIndices); 

    Shape3D shape = new Shape3D(geometryInfo.getIndexedGeometryArray()); 

    BranchGroup group = new BranchGroup(); 
    group.addChild(shape); 

    return group; 
} 

Antwort

4

immer im Schatten Beleuchtung in Java 3D zu arbeiten, muss mindestens Normalen und einem Knoten Material-Komponente. Sie haben vergessen, ein Erscheinungsbild für Ihre Shape3D-Instanzen festzulegen. Also, der Standard wird genommen. Dies führt zu einer nicht schattierten weißen Geometrie.

In folgenden Aussehen zu Ihrem Shap3Ds' Konstruktor und sie werden/sollen in roter Farbe wiedergegeben werden:

Appearance appearance = new Appearance(); 
Material material = new Material(); 
material.setDiffuseColor(1.0f, 0.0f, 0.0f); // red 
material.setSpecularColor(0.2f, 0.2f, 0.2f); // reduce default values 
appearance.setMaterial(material); 

Die empfohlene stabile Version von Java 3D ist 1.5.2 und kann hier heruntergeladen werden: https://java3d.dev.java.net/binary-builds.html

August

Verwandte Themen