Domanda

Sono un n00b completo in J3D (ma un esperto in Java). Appena agli inizi, sto correndo in un problema a giocare con la trasparenza. Ho un semplice esempio, che disegna una planare quad rotante (scompare quando mostra il volto indietro perché non ho disabile Ignora lato posteriore).

Con le linee Color3b e COLOR_3 decommentato (e le corrispondenti linee Color4b e COLOR_4 commentati), vedo il quad rotante, di colore rosso.

Tuttavia, quando commento il colore-3 linee e rimuovere il colore-4 linee, vedo un quadrato nero (contro il fondo bianco), anche se il valore alfa è impostato a 255 (completamente opaco).

Che cosa sto facendo di sbagliato? Google non aiuta, e anche il forum Java3D sopra a java.forums.net è meno disponibile. StackOverflow, salvami! È possibile copiare e incollare il seguente programma, eseguirlo e vedere cosa succede.

Ecco le mie specifiche:

Java 6 su OSX 10.5.5 J3D 1.5.2 JOGL 1.1.1

Grazie,

- Rob

Ecco il codice:

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);
 }
} 
È stato utile?

Soluzione

La sostituzione Color4b con Color4f, ha lavorato per me. Sostituire linee corrispondenti nel codice con le righe sotto,

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

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

Ho usato AWT a colori, ha trovato più facile per passare a tutti i costruttori ColorNx (), vale a dire Color3b (), Color4b (), e Color4f (), ecc È possibile utilizzare argomenti float direttamente, se ci si sente naturale per te. La correzione attuale è l'uso di Color4f, non il thingy AWT. Anche usando AWT colori non ha risolto il problema con Color4b. Basta andare con Color4f, non vedo alcun problema.

La mia piattaforma:. Java versione "1.6.0_10", Java 3D 1.5.2, Core2 Duo, OpenSUSE 11.0, Intel G33 Grafica

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top