2008-12-13 28 views
5

Jestem kompletnym n00b w j3d (ale ekspertem w Javie). Właśnie zaczynałem, mam problem z przejrzystością. Mam prosty przykład, który rysuje obracanie planarnego kwadratu (znika, gdy pokazuję tylną ścianę, ponieważ nie wyłączyłem uśpienia tylnej powierzchni).Prosty przykład przezroczystości nie działa w Javie 3D

Po odkomentowaniu wierszy Color3b i COLOR_3 (oraz odpowiednich linii Color4b i COLOR_4) widzę obracający się kwadrat, w kolorze czerwonym.

Jednak, gdy komentuję linie koloru-3 i odkreślam linie koloru-4, widzę kwadrat CZARNY (na białym tle), mimo że wartość alfa jest ustawiona na 255 (całkowicie nieprzezroczysty).

Co robię źle? Google nie pomaga, a nawet forum Java3D na java.forums.net jest mniej niż pomocne. StackOverflow, ratuj mnie! Możesz skopiować i minąć poniższy program, uruchomić go i zobaczyć, co się stanie.

Oto moje specyfikacje:

Java 6 na OSX 10.5.5 J3D 1.5.2 Jogl 1.1.1

Dzięki,

--Rob

Oto kod :

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

Odpowiedz

1

Wymiana Color4b z Co lor4f, pracował dla mnie. Wymień odpowiednie linie w kodzie z poniższych linii,

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

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

użyłem AWT kolor, łatwiej zdać we wszystkich() konstruktorów ColorNx, tj Color3b(), Color4b() i Color4f() itp Możesz użyć argumentów pływowych bezpośrednio, jeśli uważasz to za naturalne. Rzeczywistą poprawką jest użycie Color4f, a nie AWT. Nawet użycie AWT Color nie rozwiązało problemu z Color4b. Po prostu idź z Color4f, nie widzę żadnego problemu.

Moja platforma: Wersja Java "1.6.0_10", Java 3D 1.5.2, Core2 Duo, OpenSUSE 11.0, Grafika Intel G33.

+0

To działało. To sugeruje mi, że prawdopodobnie istnieje błąd w j3d. Zgłosić to. – user46028