2008-12-13 6 views
5

Je suis un n00b complet en j3d (mais un expert en Java). Je commence à peine, je suis confronté à un problème de transparence. J'ai un exemple simple qui dessine un quad planaire en rotation (disparaît en montrant la face arrière parce que je n'ai pas désactivé la suppression de la face arrière). Avec les lignes Color3b et COLOR_3 non commentées (et les lignes Color4b et COLOR_4 correspondantes commentées), je vois le quad tournant, coloré en rouge. Cependant, lorsque je commente les lignes color-3 et décommentez les lignes de couleur-4, je vois un carré NOIR (sur le fond blanc), même si la valeur alpha est réglée sur 255 (entièrement opaque).Exemple de transparence simple ne fonctionnant pas en Java 3D

Qu'est-ce que je fais mal? Google n'aide pas, et même le forum Java3D sur java.forums.net est moins qu'utile. StackOverflow, sauve moi! Vous pouvez copier et dépasser le programme ci-dessous, l'exécuter et voir ce qui se passe.

Voici mes spécifications:

Java 6 sur Mac OS X 10.5.5 J3D 1.5.2 JOGL 1.1.1

Merci,

--Rob

est ici le 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); 
} 
} 

Répondre

1

Remplacement de Color4b par Co Lor4f, a travaillé pour moi. Remplacer les lignes correspondantes dans votre code avec les lignes ci-dessous,

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

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

je AWT couleur, trouvé plus facile de passer dans tous les constructeurs ColorNx(), c.-à-Color3b(), Color4b(), et Color4f() etc. Vous pouvez utiliser des arguments flottants directement, si cela vous semble naturel. Le correctif réel est l'utilisation de Color4f, pas le thingy AWT. Même en utilisant AWT Color n'a pas résolu le problème avec Color4b. Il suffit d'aller avec Color4f, je ne vois aucun problème.

Ma plate-forme: Version Java "1.6.0_10", Java 3D 1.5.2, Core2 Duo, OpenSUSE 11.0, Intel G33 Graphics.

+0

Cela a fonctionné. Cela implique pour moi qu'il y a probablement un bug dans j3d. Je vais le signaler. – user46028

Questions connexes