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

[Java3Djp:00913] Re: マウスを使った視点移動



:::::::::::::::::::::::::::::::::::::::::::::::::::::::
     <<<<なかよしみんなで楽しいおしゃべり!>>>>
             大学・幼なじみ・同期入社
         DNSのMLならみんなずっと一緒!
          運用簡単・快適めーりんぐりすと
         http://www.dns-ml.co.jp/ml.html
:::::::::::::::::::::::::::::::::::::::::::::::::::::::

えんどうです。

> > 連続の質問ですがお願いします。
> > マウスのドラッグで物体ではなく視点を移動するにはどうすればいいのでしょう?
> 
> ずいぶん昔に試したのでうまく解説できませんが,適当なオブジェクトに対する
> マウスのドラッグの結果を視線ベクトルフィードバックしてやれば,実現できる
> と思います.
> 
> 適当なオブジェクトとして私は,avatarクラスを用いました.

Avatar を使わない安易なサンプルを書いてみました。

MouseBehavior (のサブクラス)のコンストラクターで INVERT_INPUT を指定すると、
マウスによる操作を逆転して適用できます。
好みの問題なので、INVERT_INPUT を指定しなくても良いかもしれません。

視点の前に物体を表示して、その物体の操作を視点に反映させる場合は
いしかわさんの書かれたような方法になると思います。

MouseBehavior (のサブクラス) での変換操作を取得するには
MouseBehaivorCallback インターフェースを実装したクラスを使用してください。

(視点への操作を物体に反映させてもいいです)

// Java 3D Test Applet
// MouseBehaviorTest.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.mouse.MouseBehavior;
import com.sun.j3d.utils.behaviors.mouse.MouseRotate;
import com.sun.j3d.utils.behaviors.mouse.MouseTranslate;
import com.sun.j3d.utils.behaviors.mouse.MouseZoom;

public class MouseBehaviorTest extends Applet {
  private SimpleUniverse universe_ = null;

  private boolean isStandalone = false;

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

  public void init() {
    GraphicsConfiguration config = SimpleUniverse.getPreferredConfiguration();
    Canvas3D canvas = new Canvas3D(config);
    this.setLayout(new BorderLayout());
    this.add(canvas, "Center");

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

  private BranchGroup createSceneGraph() {
    BranchGroup root = new BranchGroup();
    
    TransformGroup objTrans = new TransformGroup();

    TransformGroup viewtrans = universe_.getViewingPlatform().getViewPlatformTransform();

    BoundingSphere bounds = new BoundingSphere(new Point3d(), 100.0);
    
    MouseRotate rotator = new MouseRotate(MouseBehavior.INVERT_INPUT);
    rotator.setTransformGroup(viewtrans);
    rotator.setSchedulingBounds(bounds);
    root.addChild(rotator);
    
    MouseTranslate translator = new MouseTranslate(MouseBehavior.INVERT_INPUT);
    translator.setTransformGroup(viewtrans);
    translator.setSchedulingBounds(bounds);
    root.addChild(translator);
    
    MouseZoom zoomer = new MouseZoom(MouseBehavior.INVERT_INPUT);
    zoomer.setTransformGroup(viewtrans);
    zoomer.setSchedulingBounds(bounds);
    root.addChild(zoomer);
    
    Sphere earth = new Sphere( 0.4f,
                               Sphere.GENERATE_TEXTURE_COORDS,
                               createAppearance());
    objTrans.addChild(earth);
    
    root.addChild(objTrans);
    
    return root;
  }

  private Appearance createAppearance() {
    Appearance app = new Appearance();

    // Texture の生成
    Image image = null;
    if (this.isStandalone) {
      // アプリケーションとして実行されている
      Toolkit toolkit = Toolkit.getDefaultToolkit();
      image = toolkit.getImage("earth.jpg");
    } else {
      // アプレットとして実行されている
      image = getImage(getCodeBase(), "earth.jpg");
    }
    MediaTracker mt = new MediaTracker(this);
    mt.addImage(image, 0);
    mt.checkAll(true);
    try { mt.waitForID(0); } catch (InterruptedException e) { e.printStackTrace(); }
    Texture texture = new TextureLoader(image, this).getTexture();
    
    app.setTexture(texture);
    
    return app;
  }

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

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