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

[Java3Djp:00876] Pickingの別解(1/2) (Re: [Q]PickでObjectの認識について。。)



☆★☆★☆★☆ホームページスペースのことならAKB NETWORKへ★☆★☆★☆★
★☆  http://あなたのID.miffy.toでHPを作るなら→\890/月から!  ★☆
☆ 50Mの大容量!!!独自ドメインでのホスティングなら→\3,980/月から! ★
★ サーバー丸ごとレンタル。Webレンタル業務も簡単→\20,000/月から! ☆
☆★   ただいまキャンペーン中!更にお安く提供しています!!   ☆★
★☆★☆★☆★業界屈指の低料金!!http://www.akb-net.com/☆★☆★☆★☆

えんどう@執筆中 です。

> com.sun.j3d.utils.behaviors.picking.PickMouseBehavior を継承したクラスを
> 書いてください。
> やることは多分、
> processStimulus() の中で PickingCallback を呼ぶことだけになると思います。

うそでした。ピック時に呼ばれるのは updateScene() でした。

> 次に、現在の Behavior に加えて、上記の Behavior を addChild() して
> ください。このときに PickingCallback をこの Behavior にセットします。
> 
> これで、回転や移動の Behavior とは別個に Pick 時の PickingCallback が
> 呼ばれると思います。
> 
> # このような Behavior を書きたいとずっと思っているのですが、
> # 作業がなかなか進みません... 

書きました。まず、Callback のための interface です。

// Java 3Dテスト用プログラム
// SimplePickingCallback.java
//   Copyright (c) 1999 ENDO Yasuyuki
//                      mailto:yasuyuki@xxxxxxxxxx
//                      http://www.javaopen.org/j3dbook/index.html

import javax.media.j3d.Node;

interface SimplePickingCallback {
  void picked(int nodeType, Node node);
}

つぎに、PickMouseBehavior を継承したクラスです。

// Java 3Dテスト用プログラム
// SimplePicking.java
//   Copyright (c) 1999 ENDO Yasuyuki
//                      mailto:yasuyuki@xxxxxxxxxx
//                      http://www.javaopen.org/j3dbook/index.html

import javax.media.j3d.*;
import com.sun.j3d.utils.behaviors.picking.*;

public class SimplePicking extends PickMouseBehavior {
  protected SimplePickingCallback callback = null;
  protected int pickMode = PickObject.USE_BOUNDS;
  protected int nodeType = PickObject.SHAPE3D;

  public SimplePicking(BranchGroup root, Canvas3D canvas, Bounds bounds) {
    super(canvas, root, bounds);

    this.setSchedulingBounds(bounds);
  }

  public SimplePicking( BranchGroup root, Canvas3D canvas, Bounds bounds,
		        int mode )
  {
    super(canvas, root, bounds);
    pickMode = mode;

    this.setSchedulingBounds(bounds);
  }

  public SimplePicking( BranchGroup root, Canvas3D canvas, Bounds bounds,
		        int mode, int type)
  {
    super(canvas, root, bounds);
    pickMode = mode;
    nodeType = type;

    this.setSchedulingBounds(bounds);
  }

  public void setPickMode(int mode) { pickMode = mode; }
  public int getPickMode() { return pickMode; }

  public void setNodeType(int type) { nodeType = type; }
  public int getNodeType() { return nodeType; }

  public void setupCallback(SimplePickingCallback callback) { this.callback = callback; }

  public void updateScene(int x, int y) {
    Node node = pickScene.pickNode(pickScene.pickClosest(x, y), nodeType);
    callback.picked(nodeType, node);
  }
}

利用例は後ほど...

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