سؤال

أنا n00b في j3d (ولكن خبير في جافا).بدأت للتو ، أنا الوقوع في مشكلة في اللعب مع الشفافية.لدي مثال بسيط الذي يستمد الدورية مستو رباعي (يختفي عندما تظهر مرة أخرى الوجه لأنني لم تعطيل backface اعدام).

مع Color3b و COLOR_3 خطوط uncommented (المقابلة Color4b و COLOR_4 خطوط علق) ، أرى الدورية رباعية الملونة الحمراء.

ومع ذلك ، عندما التعليق اللون-3 خطوط uncomment لون-4 خطوط أرى مربع أسود (ضد خلفية بيضاء) ، على الرغم ألفا تعيين القيمة إلى 255 (معتمة تماما).

ما الخطأ الذي فعلته ؟ جوجل لا تساعد ، وحتى Java3D في المنتدى java.forums.net هو أقل من مفيدة.ستاكوفيرفلوو, حفظ لي!يمكنك نسخ الماضي تحت برنامج تشغيل ونرى ما سيحدث.

هنا هي بلدي المواصفات:

جافا 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);
 }
} 
هل كانت مفيدة؟

المحلول

استبدال 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() إلخ.يمكنك استخدام تعويم الحجج مباشرة ، إذا كان ذلك يبدو طبيعيا بالنسبة لك.الفعلية الإصلاح هو استخدام Color4f لا AWT شئ.حتى باستخدام AWT اللون لم يحل المشكلة مع Color4b.مجرد الذهاب مع Color4f, أنا لا أرى أي مشكلة.

برنامجي: جافا الإصدار "1.6.0_10", Java 3D 1.5.2, Core2 Duo, OpenSUSE 11.0, Intel G33 الرسومات.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top