Frage

Ich bin ein komplettes n00b in J3D (aber ein Experte in Java). Gerade erst anfangen, ich bin in ein Problem mit der Transparenz spielen laufe. Ich habe ein einfaches Beispiel bekam, die eine rotierende ebene Quad zieht (verschwindet, wenn die Rückseite zeigt, weil ich nicht deaktiviert Backface-Culling haben).

mit der Color3b und COLOR_3 Linien uncommented (und die entsprechende Color4b und COLOR_4 Linien kommentiert), ich sehe den rotierenden quad, rot gefärbt.

Allerdings, wenn ich die Farbe-3-Leitungen und Kommentar- der farb 4 Zeilen kommentieren, sehe ich ein schwarzes Quadrat (gegen den weißen Hintergrund), auch wenn der Alpha-Wert auf 255 (völlig undurchsichtig) eingestellt ist.

Was mache ich falsch? Google hilft nicht, und auch das Java3D Forum über bei java.forums.net weniger als hilfreich. Stackoverflow, rettet mich! Sie können die unten Programm kopieren und führen Sie es aus 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);
 }
} 
War es hilfreich?

Lösung

Ersetzen Color4b mit Color4f 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);

Ich habe AWT Farbe, fand es einfacher, in allen ColorNx () Konstrukteurs passieren, das heißt Color3b (), Color4b () und Color4f () etc. Sie float Argumente direkt verwenden kann, wenn das für Sie natürlich anfühlt. Die eigentliche Lösung ist die Verwendung von Color4f, nicht das AWT Dingen. Selbst mit AWT Farbe das Problem nicht mit Color4b lösen. Gehen Sie 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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top