Простой пример прозрачности, не работающий в Java 3D

Я полный n00b в j3d (но эксперт по Java). Только начинаю, у меня проблема с прозрачностью. У меня есть простой пример, который рисует вращающийся плоский четырехугольник (исчезает при отображении задней грани, потому что я не отключал отбраковку задней поверхности).

С раскомментированными строками Color3b и COLOR_3 (и прокомментированными соответствующими строками Color4b и COLOR_4) я вижу вращающийся четырехугольник, окрашенный в красный цвет.

Однако, когда я комментирую строки цвета 3 и раскомментирую строки цвета 4, я вижу ЧЕРНЫЙ квадрат (на белом фоне), хотя альфа-значение установлено на 255 (полностью непрозрачно).

Что я делаю неправильно? Google не помогает, и даже форум Java3D на java.forums.net менее чем полезен. StackOverflow, спаси меня! Вы можете скопировать и вставить приведенную ниже программу, запустить ее и посмотреть, что произойдет.

Вот мои характеристики:

Java 6 в OSX 10.5.5 J3D 1.5.2 JOGL 1.1.1

Спасибо,

- Роб

Вот код:

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);
 }
} 
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
5
0
3 413
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Замена Color4b на Color4f сработала для меня. Замените соответствующие строки в своем коде на следующие строки,

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

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

Я использовал AWT Color, мне было легче передать все конструкторы ColorNx (), то есть Color3b (), Color4b () и Color4f () и т. д. Вы можете напрямую использовать аргументы типа float, если это кажется вам естественным. Фактическое исправление - использование Color4f, а не AWT. Даже использование AWT Color не решило проблему с Color4b. Просто используйте Color4f, я не вижу никаких проблем.

Моя платформа: Версия Java "1.6.0_10", Java 3D 1.5.2, Core2 Duo, OpenSUSE 11.0, Intel G33 Graphics.

Это сработало. Это означает, что, вероятно, в j3d есть ошибка. Я сообщу об этом.

user46028 15.12.2008 17:14

Другие вопросы по теме