[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