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

[Java3Djp:00242] Re: 形状のピッキング



えんどう様

返信ありがとうございます。

On Fri, 7 Jan 2005 15:52:30 +0900
yasuyuki <yasuyuki@xxxxxxxxxxxxx> wrote:
 
> > public class MyCanvas3D extends Canvas3D
> 
> Canvas3D を拡張したクラスの中でシーングラフ構築されている、
> ということでしょうか?

そうです。
全体のソースはご紹介できませんが、こんな感じです。
 
    SimpleUniverse    universe = new SimpleUniverse(this);
    BranchGroup       objRoot = new BranchGroup();
    Canvas3D canvas = this;
    MyMousePick picking = new MyMousePick(objRoot,canvas,boundsphere);
    picking.setTolerance(4.0f);
    picking.setupCallback(new PickingCallback() {
      public void picked(int type, Node node) {
        if (node != null) {
          //処理
        }
      }
    });
    objRoot.addChild(picking);

    universe.getViewingPlatform().setNominalViewingTransform();
    universe.getViewer().getView().setBackClipDistance((float)BOUNDS_SPHERE*100.0f);
    universe.addBranchGraph(objRoot);

あと、メソッド処理にて、
    Sphere sp = new Sphere(...);
    TransformGroup transSphere = new TransformGroup();
    transSphere.addChiled(sp);
    BranchGroup branchSphere = new BranchGroup();
    branchSphere.addChild(transSphere);
    objRoot.addChild(branchSphere);

なんてことをして、あとから球や点を追加してます。

> > #SphereとPointがBranchGroupでつなげているのは、形状を
> > #表示したりしなかったりするため。
> 
> 単なる表示/非表示であれば Switch が使えます。

あとから、Transform3Dを追加するといった形態をとるので、
Switchだとうまくいかないような気がしました。
まあ、特にこちらは動作上問題ないので、今回は省略させていただきます。

> > 視点を変更すると、球の裏に点が移動する感じになりますが、
> > ピッキングを可とすると、前面に見える球の裏側にある点が
> > 選択される場合があります。
> > 見かけ上見えなくても、そのピッキング位置に平面上、近い位置に
> > ある場合はピッキング対象となるようです。
> 
> PickClosest でピックされていますか?
> PickAll ですべてのノードを得て、Z座標を比較して選別する方法でしょうか。

最初構築したときに、
     pickCanvas.setShapeLocation(xpos,ypos);
     PickResult res = pickCanvas.pickClosest();
といった感じで、やってみたのですが、ちゃんと見えている点をクリック
しているのに、クリックされないといった現象が起きてまして、

      PickResult [] res = pickCanvas.pickAllSorted();
と変更し、
      Node node = res.getNode(PickResult.TRANSFORM_GROUP);
という風に、TransformGroupのnodeのみ取得するといった方法を
とってます。
何がピッキングされているのかがよくわかりません。
Picking Capabilityは、球と点にしか与えてません。

視点位置は、3次元上、あらゆる位置に変更することができるように
しているため、単純にZ軸上の距離で判別できません。
また、始点位置とその球及び点までの距離を比較する場合、点が遠くに
あっても、視点位置から見える場合(球の陰にならない)は、
ピッキング対象とするため、単純に遠いからという判断はできません。

> あと、動作が遅くなりますがジオメトリモードでピックするとどうでしょうか?

Capabilityの与え方がちょっとうまくいかなかったもので、
例外がでて、あきらめたような気がしますが、ちょっともう一度ためしてみます。

> > 球の陰に配置された点をピッキング対象から外す方法というのは
> > あるのでしょうか。
> 
> 思い付きですが、カリングやセンサーをうまく使って enablePicking フラグを
> 操作することができるかも知れません。

カリング、センサーとはどういった手法でしょうか。
ちょっとその当たりはよくわかりません。
具体例とか載っているサイトとかありますでしょうか。

以上、よろしくお願いいたします。

-- 
岩倉 隆裕 <iwakura.takahiro@xxxxxxxxx>
宇宙技術開発株式会社
衛星利用部 衛星利用G
Tel: 03-3319-6726 FAX: 03-5380-7069