[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Java3Djp:00850] Re: Raster



□□□--NTT最新情報-----------▼▼▼---------------------------□□□
●NTTのISDNで快適インターネット。ご相談・お申込み好評受付中!
●ISDNのもう一つの電話番号『 i・ナンバー』月定額300円。新登場!
●かかってきた電話を逃がさない『マジックボックス』月定額800円。新登場
−−−−−−−−−>お申し込みは http://www.teleway.ne.jp/~fax-sendai
□□□---------------------------▲▲▲---------------FAX仙台--□□□

えんどうです。

> Text2Dのソースを参考にして文字を描画したImageComponent2Dを作って、
> それをRasterに貼り付けて、表示させようとしています。
> つまり、Java3DのRasterはアルファ値を認識してくれるのか?ということです。
> RasterのパラメータにあるDepthComponentというのが気になりますが、
> 使い方がよくわかりません。

com.sun.j3d.utils.geometry.Text2D のソースを読んでみました。
Raster ではなく QuadArray にテクスチャーとして張り付けていますね。

Raster は Geometry のサブクラスなので、外見に関する属性は無いだろうと
思って、Shape3D の方に TransparencyAttributes を適用したら透過しました。

以下のサンプルでは物体が一つなので問題が顕在化しませんが、
複数の物体がある場合は奥から順に描画する必要があるかも知れません。

なお、テスト環境は Vine Linux 1.0beta + Mesa 3.0.2 + Java 3D 1.1.1 pre-v1
です。

P.S. アルファチャネルのある .gif ですが、GIMP で普通に作ったもので
     オーケーでした。お騒がせしましたm(_ _)m>各位

// Java 3D Test Applet
// EarthApplet.java
//   Copyright (c) 1999 ENDO Yasuyuki
//                      mailto:yasuyuki@xxxxxxxxxx
//                      http://www.javaopen.org/j3dbook/index.html

import java.applet.*;
import java.awt.*;
import javax.media.j3d.*;
import javax.vecmath.*;
import com.sun.j3d.utils.applet.MainFrame;
import com.sun.j3d.utils.universe.SimpleUniverse;
import com.sun.j3d.utils.geometry.Sphere;
import com.sun.j3d.utils.image.TextureLoader;
import com.sun.j3d.utils.behaviors.picking.PickRotateBehavior;
import com.sun.j3d.utils.behaviors.picking.PickTranslateBehavior;
import com.sun.j3d.utils.behaviors.picking.PickZoomBehavior;

public class RasterTest extends Applet {
  private Canvas3D canvas = null;
  private Texture texture = null;

  private boolean isStandalone = false;

  public RasterTest() {
    this(false);
  }
  
  public RasterTest(boolean isStandalone) {
    this.isStandalone = isStandalone;
  }

  public void init() {
    this.canvas = new Canvas3D(null);
    this.setLayout(new BorderLayout());
    this.add("Center", this.canvas);

    SimpleUniverse universe = new SimpleUniverse(canvas);
    universe.getViewingPlatform().setNominalViewingTransform();
  
    universe.addBranchGraph(createSceneGraph());
  }

  private BranchGroup createSceneGraph() {
    BranchGroup root = new BranchGroup();
    
    TransformGroup objTrans = new TransformGroup();
    objTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);
    objTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
    objTrans.setCapability(TransformGroup.ENABLE_PICK_REPORTING);

    BoundingSphere bounds = new BoundingSphere(new Point3d(), 100.0);
    
    PickRotateBehavior rotater =
      new PickRotateBehavior(root, this.canvas, bounds);
    root.addChild(rotater);
    
    PickTranslateBehavior translater =
      new PickTranslateBehavior(root, this.canvas, bounds);
    root.addChild(translater);
    
    PickZoomBehavior zoomer =
      new PickZoomBehavior(root, this.canvas, bounds);
    root.addChild(zoomer);
    
    ImageComponent2D image = readImage();

    Raster raster = new Raster( new Point3f(),
				Raster.RASTER_COLOR,
				0, 0, 256, 256,
				image, null );
    Appearance app = createAppearance();
    Shape3D shape = new Shape3D(raster, app);
    shape.setCapability(Shape3D.ENABLE_PICK_REPORTING);
    shape.setBounds(new BoundingSphere(new Point3d(), 0.5));
    objTrans.addChild(shape);
    
    root.addChild(objTrans);
    
    return root;
  }

  private ImageComponent2D readImage() {
    TextureLoader tr = null;
    if (this.isStandalone) {
      tr = new TextureLoader("o2.gif", ImageComponent.FORMAT_RGBA, this);
    } else {
      // アプレットとして実行されている
      Image image = getImage(getCodeBase(), "o2.gif");
      MediaTracker mt = new MediaTracker(this);
      mt.addImage(image, 0);
      mt.checkAll(true);
      try { mt.waitForID(0); } catch (InterruptedException e) { e.printStackTrace(); }
      tr = new TextureLoader(image, this);
    }
    
    return tr.getImage();
  }

  private Appearance createAppearance() {
    Appearance app = new Appearance();
    TransparencyAttributes ta =
       new TransparencyAttributes(TransparencyAttributes.BLENDED, 1.0f);
    app.setTransparencyAttributes(ta);
				  
    return app;
  }

  public static void main(String[] args) {
    RasterTest applet = new RasterTest(true); // isStandalone = true;
    Frame frame = new MainFrame(applet, 500, 500);
  }
}

---
ENDO Yasuyuki <yasuyuki@xxxxxxxxxx>
http://www.javaopen.org/jfriends/index.html (Japanese Only)