Pergunta

Eu sou um n00b completo em J3D (mas um especialista em Java). Apenas começando, eu estou correndo em um problema de jogo com transparência. Eu tenho um exemplo simples que desenha um quad planar rotativo (desaparece quando mostrando o rosto para trás porque não tenho desativado backface abate).

Com as linhas Color3b e COLOR_3 descomentamos (e as correspondentes linhas Color4b e COLOR_4 comentou), eu ver o quadrilátero rotativo, de cor vermelha.

No entanto, quando eu comentar as cores-3 linhas e descomente as linhas de cor-4, vejo um quadrado preto (contra o fundo branco), mesmo que o valor alfa é definido para 255 (totalmente opaco).

O que estou fazendo de errado? Google não ajuda, e até mesmo o fórum Java3D em cima da java.forums.net é menos do que útil. StackOverflow, salva-me! Você pode copiar e colar o abaixo programa, executá-lo e ver o que acontece.

Aqui estão minhas especificações:

Java 6 no OSX 10.5.5 J3D 1.5.2 JOGL 1.1.1

Obrigado,

- Rob

Aqui está o código:

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);
 }
} 
Foi útil?

Solução

Substituir Color4b com Color4f, trabalhou para mim. Substitua as linhas correspondentes em seu código com as linhas abaixo,

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

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

Eu usei AWT cores, achei mais fácil de passar em todos os construtores ColorNx (), ou seja, Color3b (), Color4b () e Color4f () etc. Você pode usar argumentos flutuador diretamente, se isso se sente natural para você. A correção real é o uso de Color4f, não a coisinha AWT. Mesmo usando AWT cores não resolveu o problema com Color4b. Basta ir com Color4f, não vejo qualquer problema.

Minha plataforma:. Java Version "1.6.0_10", Java 3D 1.5.2, Core2 Duo, OpenSUSE 11.0, Intel G33 Gráficos

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top