Question

Je suis un n00b complet en J3D (mais un expert en Java). Débutant, je suis en cours d'exécution dans un problème à jouer avec la transparence. J'ai un exemple simple qui dessine un quad plan de rotation (disparait en montrant la face arrière parce que je ne backface culling désactivé).

Avec les lignes Color3b et COLOR_3 décommentées (et les lignes correspondantes Color4b et COLOR_4 commenté), je vois le quad de rotation, de couleur rouge.

Cependant, quand je réagir à la couleur-3 lignes et décommenter la couleur-4 lignes, je vois un carré noir (sur fond blanc), alors que la valeur alpha est réglé sur 255 (complètement opaque).

Qu'est-ce que je fais mal? Google ne fonctionne pas, et même le forum Java3D sur au java.forums.net est moins utile. StackOverflow, sauve-moi! Vous pouvez copier et coller le programme ci-dessous, l'exécuter et de 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

Voici 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);
 }
} 
Était-ce utile?

La solution

Remplacement Color4b avec Color4f, 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 (), à savoir Color3b (), Color4b (), et Color4f (), etc. Vous pouvez utiliser des arguments de flotteur directement, si cela vous semble naturel. La solution réelle est l'utilisation de Color4f, pas le thingy AWT. Même en utilisant AWT couleur n'a pas résolu le problème avec Color4b. Il suffit d'aller avec Color4f, je ne vois pas de problème.

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top