2008-12-13 33 views
5

Tôi là một n00b hoàn chỉnh trong j3d (nhưng là một chuyên gia về Java). Chỉ mới bắt đầu, tôi đang gặp vấn đề với tính minh bạch. Tôi đã có một ví dụ đơn giản mà vẽ một quad planar xoay (biến mất khi hiển thị mặt sau bởi vì tôi đã không vô hiệu hóa culling backface).Ví dụ minh bạch đơn giản không hoạt động trong Java 3D

Với các dòng Color3b và COLOR_3 chưa được chú giải (và các dòng Color4b và COLOR_4 tương ứng đã nhận xét), tôi thấy tứ quay, màu đỏ.

Tuy nhiên, khi tôi nhận xét đường màu-3 và bỏ ghi chú dòng màu-4, tôi thấy một hình vuông màu đen (so với nền trắng), mặc dù giá trị alpha được đặt thành 255 (hoàn toàn mờ).

Tôi đang làm gì sai? Google không giúp đỡ và thậm chí cả diễn đàn Java3D trên java.forums.net cũng không hữu ích. StackOverflow, cứu tôi! Bạn có thể sao chép và qua chương trình dưới đây, chạy chương trình đó và xem điều gì xảy ra.

Dưới đây là thông số kỹ thuật của tôi:

Java 6 trên OSX 10.5.5 J3D 1.5.2 JOGL 1.1.1

Cảm ơn,

--Rob

Dưới đây là đoạn 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); 
} 
} 

Trả lời

1

Thay thế Color4b bằng Co lor4f, đã làm việc cho tôi. Thay thế dòng tương ứng trong mã của bạn với các dòng dưới đây,

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

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

tôi đã sử dụng AWT màu, tìm thấy nó dễ dàng hơn để vượt qua trong tất cả() constructor ColorNx, tức là Color3b(), Color4b(), và Color4f() vv Bạn có thể sử dụng các đối số float trực tiếp, nếu điều đó cảm thấy tự nhiên đối với bạn. Việc sửa chữa thực tế là việc sử dụng Color4f, không phải là AWT thingy. Ngay cả khi sử dụng màu AWT cũng không giải quyết được vấn đề với Color4b. Chỉ cần đi với Color4f, tôi không thấy bất kỳ vấn đề gì.

Nền tảng của tôi: Phiên bản Java "1.6.0_10", Java 3D 1.5.2, Core2 Duo, OpenSUSE 11.0, Đồ họa Intel G33.

+0

Điều đó có hiệu quả. Điều này hàm ý với tôi rằng có lẽ có lỗi trong j3d. Tôi sẽ báo cáo. – user46028

Các vấn đề liên quan