2008-12-13 17 views
5

Soy un n00b completo en j3d (pero un experto en Java). Al comenzar, me encuentro con un problema jugando con transparencia. Tengo un ejemplo simple que dibuja un cuadrante plano rotativo (desaparece al mostrar la cara posterior porque no he desactivado el sacrificio de la cara posterior).Ejemplo de transparencia simple que no funciona en Java 3D

Con las líneas Color3b y COLOR_3 sin comentar (y las líneas correspondientes de Color4b y COLOR_4 comentadas), veo el quad giratorio, de color rojo.

Sin embargo, cuando comento las líneas color-3 y elimino el comentario de las líneas color-4, veo un cuadrado NEGRO (contra el fondo blanco), aunque el valor alfa se establece en 255 (totalmente opaco).

¿Qué estoy haciendo mal? Google no ayuda, e incluso el foro de Java3D en java.forums.net no es útil. StackOverflow, ¡sálvame! Puede copiar y pasar el siguiente programa, ejecutarlo y ver qué pasa.

Estas son las especificaciones de mi:

Java 6 en OSX 10.5.5 J3D 1.5.2 JOGL 1.1.1

, gracias,

--Rob

Aquí está el código :

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); 
} 
} 

Respuesta

1

Reemplazo de Color4b con Co lor4f, funcionó para mí. Reemplazar las líneas correspondientes en el código con las siguientes líneas,

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

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

Solía ​​AWT color, encontró más fácil pasar en todos los constructores ColorNx(), es decir Color3b(), Color4b(), y Color4f() etc. Puede usar argumentos flotantes directamente, si eso le parece natural. La solución real es el uso de Color4f, no de AWT. Incluso el uso de AWT Color no resolvió el problema con Color4b. Solo ve con Color4f, no veo ningún problema.

Mi plataforma: Versión Java "1.6.0_10", Java 3D 1.5.2, Core2 Duo, OpenSUSE 11.0, Intel G33 Graphics.

+0

Eso funcionó. Esto implica para mí que probablemente haya un error en j3d. Lo reportaré. – user46028