シンプルな透明の例では、Java 3Dで動作しません
-
21-08-2019 - |
質問
私はJ3Dで完全N00B(が、Javaの専門家)です。ちょうど私が透明で遊んで問題に実行しているよ、出始め。私は回転平面クワッドを描画する簡単な例を持っている(私がいない無効になっバックフェースカリングを持っているので、背面を示すとき消える)。
Color3bとCOLOR_3線でコメント解除(および対応するColor4bとCOLOR_4線はコメント)、Iは赤色、回転クワッドを参照。
私は色3行コメント、色4行のコメントを外したときに、は、しかし、私は、アルファ値が255(完全に不透明)に設定されているにもかかわらず、(白背景)黒四角を参照。
私が間違って何をしているのですか? Googleは助けにはならない、とさえjava.forums.netでオーバーJava3Dのフォーラムは便利未満です。 StackOverflowのは、私を救います!あなたがコピーして、以下のプログラムを過ぎて、それを実行し、何が起こるかを見ることができます。
ここに私の仕様は次のとおりです:
OSX 10.5.5上のJava 6の 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);
}
}
解決
Color4fでColor4bの交換、私のために働きました。以下の行を使用してコードに対応する行を置き換え、
Color color = new Color(255, 0, 0, 50);
Color4f c = new Color4f(color);
QuadArray quads = new QuadArray(4,
GeometryArray.COORDINATES | GeometryArray.COLOR_4);
私はそれが簡単にすべてのColorNx()コンストラクタに渡すことが見いださ、AWTの色を使用し、すなわちColor3b()、Color4b()、およびColor4f()などそれはあなたに自然に感じる場合は、直接フロート引数を使用することができます。実際の修正はColor4fの使用ではなく、AWTブツです。でもColor4bの問題を解決していなかったAWTの色を使用。ただ、Color4fで行く、私は何の問題が表示されません。
のマイプラットフォーム:のJavaのバージョン "1.6.0_10" はJava 3D 1.5.2、Core2のデュオ、openSUSEの11.0、インテルG33グラフィックス
。