문제

저는 J3D의 완전한 N00B입니다 (그러나 Java의 전문가). 방금 시작하여 투명성으로 연주하는 문제가 발생합니다. 회전 평면 쿼드를 그리는 간단한 예제가 있습니다 (뒷면 컬링을 비활성화하지 않았기 때문에 뒷면을 보여줄 때 사라집니다).

Color3b 및 Color_3 라인이 무의미한 상태에서 (그리고 해당 Color4B 및 Color_4 라인이 주석 됨) 회전 쿼드, 색상 빨간색이 보입니다.

그러나 색상 -3 선을 주석하고 색상 -4 라인을 무의미하게 할 때 알파 값이 255 (완전히 불투명)로 설정되어 있지만 검은 색 정사각형 (흰색 배경에 대한 검은 색 정사각형)이 보입니다.

내가 뭘 잘못하고 있죠? Google은 도움이되지 않으며 Java.forums.net의 Java3d 포럼조차 도움이되지 않습니다. stackoverflow, 저를 구하십시오! 아래 프로그램을 복사하고 지나서 실행하고 무슨 일이 일어나는지 확인할 수 있습니다.

내 사양은 다음과 같습니다.

OSX 10.5.5 J3d 1.5.2 Jogl 1.1.1의 Java 6

감사,

-로브

코드는 다음과 같습니다.

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);
 }
} 
도움이 되었습니까?

해결책

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 색상을 사용했는데 모든 colornx () 생성자, 즉 color3b (), color4b () 및 color4f () 등을 통과하기가 더 쉽다는 것을 알았습니다. 자연스럽게 느껴지면 플로트 인수를 직접 사용할 수 있습니다. 실제 수정은 AWT가 아닌 Color4F를 사용하는 것입니다. AWT 색상을 사용하더라도 Color4B에서 문제를 해결하지 못했습니다. 그냥 Color4F와 함께 가십시오. 문제가 없습니다.

내 플랫폼 : Java 버전 "1.6.0_10", Java 3D 1.5.2, Core2 Duo, OpenSuse 11.0, Intel G33 그래픽.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top