2008-12-13 14 views
5

Ich bin eine komplette N00B in J3D (aber ein Experte in Java). Anfangs stoße ich auf ein Problem mit der Transparenz. Ich habe ein einfaches Beispiel, das ein rotierendes planares Quad zeichnet (verschwindet, wenn ich die Rückseite zeige, weil ich das Rückseiten-Culling nicht deaktiviert habe).Einfaches Beispiel der Transparenz funktioniert nicht in Java 3D

Mit den Zeilen Color3b und COLOR_3 unkommentiert (und die entsprechenden Color4b und COLOR_4 Zeilen kommentiert), sehe ich das rotierende Quad, rot gefärbt.

Wenn ich jedoch die Farbe-3 Linien kommentiere und die Farbe-4 Linien auskommentiere, sehe ich ein SCHWARZES Quadrat (gegen den weißen Hintergrund), obwohl der Alpha-Wert auf 255 (vollständig undurchsichtig) eingestellt ist.

Was mache ich falsch? Google hilft nicht, und sogar das Java3D-Forum auf java.forums.net ist weniger als hilfreich. StackOverflow, rette mich! Sie können das folgende Programm kopieren und ausführen, es ausführen und sehen, was passiert.

Hier sind meine Daten:

Java 6 auf OSX 10.5.5 J3D 1.5.2 JOGL 1.1.1

Danke,

--Rob

Hier ist der Code :

import com.sun.j3d.utils.applet.MainFrame; 
import com.sun.j3d.utils.geometry.ColorCube; 
import com.sun.j3d.utils.universe.SimpleUniverse; 
import java.applet.Applet; 
import java.awt.*; 
import javax.media.j3d.*; 
import javax.vecmath.*; 

public class Hello extends Applet 
{ 
public Hello() throws Exception 
{ 
    setLayout(new BorderLayout()); 
    GraphicsConfiguration config = SimpleUniverse.getPreferredConfiguration(); 
    Canvas3D canvas3D = new Canvas3D(config); 

    add("Center", canvas3D); 

    BranchGroup scene = createSceneGraph(); 
    scene.compile(); 

    SimpleUniverse univ = new SimpleUniverse(canvas3D); 

    univ.getViewingPlatform().setNominalViewingTransform(); 

    univ.addBranchGraph(scene); 
} 

public BranchGroup createSceneGraph() throws Exception 
{ 
    BranchGroup root = new BranchGroup(); 

    // A white background. 

    Background bgd = new Background(1.0f, 1.0f, 1.0f); 
    root.addChild(bgd); 

    // This will spin the quad around 

    TransformGroup spin = new TransformGroup(); 
    spin.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE); 
    root.addChild(spin); 

    // define the quad: 

    Point3d p1 = new Point3d(-0.5, -0.5, 0); 
    Point3d p2 = new Point3d(0.5, -0.5, 0); 
    Point3d p3 = new Point3d(0.5, 0.5, 0); 
    Point3d p4 = new Point3d(-0.5, 0.5, 0); 

    // colors 

    Color4b c = new Color4b((byte)255, (byte)0, (byte)0, (byte)255); 
    //Color3b c = new Color3b((byte)255, (byte)0, (byte)0); 

    QuadArray quads = new QuadArray(4, 
    GeometryArray.COORDINATES | GeometryArray.COLOR_4); 
    // GeometryArray.COORDINATES | GeometryArray.COLOR_3); 

    quads.setCoordinate(0, p1); 
    quads.setCoordinate(1, p2); 
    quads.setCoordinate(2, p3); 
    quads.setCoordinate(3, p4); 
    quads.setColor(0, c); 
    quads.setColor(1, c); 
    quads.setColor(2, c); 
    quads.setColor(3, c); 

    // Not sure if I need this. Doesn't seem to make a difference. 

    Appearance appearance = new Appearance(); 
    TransparencyAttributes trans = new TransparencyAttributes(); 
    trans.setTransparencyMode(TransparencyAttributes.BLENDED); 
    appearance.setTransparencyAttributes(trans); 

    // Create the shape... 

    Shape3D shape = new Shape3D(); 
    shape.setGeometry(quads); 
    shape.setAppearance(appearance); 

    spin.addChild(shape); 

    Alpha rotationAlpha = new Alpha(-1, 4000); 
    RotationInterpolator rotator = new RotationInterpolator(rotationAlpha, spin); 
    BoundingSphere bounds = new BoundingSphere(); 
    rotator.setSchedulingBounds(bounds); 
    spin.addChild(rotator); 

    return root; 
} 

public static void main(String[] args) throws Exception 
{ 
    Frame frame = new MainFrame(new Hello(), 256, 256); 
} 
} 

Antwort

1

Austauschen von Color4b mit Co Lor4f, arbeitete für mich. Ersetzen entsprechende Zeilen im Code mit den folgenden Zeilen,

Color color = new Color(255, 0, 0, 50); 

Color4f c = new Color4f(color); 
QuadArray quads = new QuadArray(4, 
      GeometryArray.COORDINATES | GeometryArray.COLOR_4); 

benutzen ich AWT Farbe, fand es einfacher, in allen ColorNx() Konstrukteuren passieren, dh Color3b(), Color4b() und Color4f() usw. Sie können Float-Argumente direkt verwenden, wenn Ihnen das natürlich erscheint. Der eigentliche Fix ist die Verwendung von Color4f, nicht das AWT-Dings. Selbst die Verwendung von AWT Color hat das Problem mit Color4b nicht gelöst. Geh einfach mit Color4f, ich sehe kein Problem.

Meine Plattform: Java Version "1.6.0_10", Java 3D 1.5.2, Core2 Duo, OpenSUSE 11.0, Intel G33 Grafik.

+0

Das hat funktioniert. Dies bedeutet für mich, dass es wahrscheinlich einen Fehler in j3d gibt. Ich werde es melden. – user46028