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

[Java3Djp:02031] 視点移動後の PickTranslateBehavior



------------------------- infoseek ML Sponsor --------------------------
┏━┳━┳━┳≪資格の大原 合格Web 税理士講座 ≫━┳━┳━┳━┳━┓
┃大┃原┃税┃理┃士┃講┃座┃!┃合┃格┃者┃の┃84┃%┃が┃受┃講┃
┗━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┛
★パソコンさえあれば自宅で学べるのが合格Web!24時間いつでも何度でも受講
┗ http://www1.ibc.ne.jp/ad/ibc0088.html 
------------------------------------------------------------------------


古川です。

視点をキーボードで移動させた後、
物体をPickTranslateBehaviorでマウス移動させたいと
思っています。

それぞれの実装はできたのですが、
以下の症状で悩んでいます。
サンプルプログラムを添付させていただきました。

視点を移動する前(赤色の面が見える位置)ならば、
物体上でマウスの右クリック+上下左右で物体を
上下左右に移動できるのですが、視点が移動し、
たとえば物体の裏側(サンプルプログラムでは
緑色の面が見える位置)に移動した後に物体を右クリックで移動させようと
すると、左右が逆に移動してしまいます。

さらに物体の左右(青、黄色の面が見える位置)で
移動させようとすると、Zoomしてしまいます。

PickTranslateBehavior はワールド座標を変更しているようですが、
視点から見た移動方向へ移動させる何かよい方法は
無いでしょうか?

------------- begin of Sample3D.java ----------

import javax.swing.*;
import java.awt.event.*;
import java.awt.BorderLayout;
import java.awt.GraphicsConfiguration;
import com.sun.j3d.utils.universe.*;
import javax.media.j3d.*;
import com.sun.j3d.utils.geometry.ColorCube;
import com.sun.j3d.utils.behaviors.keyboard.*;
import javax.vecmath.*;
import com.sun.j3d.utils.picking.behaviors.*;

public class Sample3D extends JFrame {

        public Sample3D() {
                getContentPane().setLayout(new BorderLayout());

                GraphicsConfiguration config =
SimpleUniverse.getPreferredConfiguration();

                Canvas3D canvas = new Canvas3D(config);
                getContentPane().add("Center", canvas);

                BranchGroup scene = new BranchGroup();

                SimpleUniverse universe = new SimpleUniverse(canvas);

                //TransformGroup 初期化
                TransformGroup tg = new TransformGroup();
                tg.setCapability(TransformGroup.ENABLE_PICK_REPORTING);
                tg.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);
                tg.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
                scene.addChild(tg);

                ColorCube colorCube = new ColorCube(0.5d);
                tg.addChild(colorCube);

                // キーボードで視点移動
                universe.getViewingPlatform().setNominalViewingTransform();

                BoundingSphere bounds = new BoundingSphere(new Point3d(),
1000.0);
                TransformGroup viewtrans =
universe.getViewingPlatform().getViewPlatformTransform();
                KeyNavigatorBehavior keybehavior = new
KeyNavigatorBehavior(viewtrans);
                keybehavior.setSchedulingBounds(bounds);
                PlatformGeometry vp = new PlatformGeometry();
                vp.addChild(keybehavior);
                universe.getViewingPlatform().setPlatformGeometry(vp);

                //マウスで物体移動
                PickRotateBehavior rotate = new PickRotateBehavior(scene,
canvas, bounds);
                PickTranslateBehavior translate = new
PickTranslateBehavior(scene, canvas, bounds);
                PickZoomBehavior zoom = new PickZoomBehavior(scene, canvas,
bounds);
                tg.addChild(rotate);
                tg.addChild(translate);
                tg.addChild(zoom);

                universe.addBranchGraph(scene);
        }

        public static void main(String[] args) {
                Sample3D sample = new Sample3D();

                /* サイズ指定 */
                sample.setBounds( 10, 10, 240, 240);

                /* 終了処理を追加 */
                sample.addWindowListener(new WindowAdapter(){
                        public void windowClosing(WindowEvent
e){System.exit(0);}
                });

                /* 実際に表示する */
                sample.setVisible(true);
        }
}

----
古川


------------------------------------------------------------------------
       ★今なら登録するだけで現金50万円が当たる!?
  http://research.infoseek.co.jp/research/index.phtml/mail?svx=971122