ともさんのHP >プロブラミング >JavaFX >JavaFXマウスで視界移動

マウスで視点位置を移動する方法

JavaFXの3DSceneでは表示する範囲をCameraの設定で操作しますが、このカメラの位置をマウスで操作するサンプルプログラムです。
カメラ 楽天 の設定方法はこちらをお読みください。

広告

マウスの左ボタンを押しながらドラッグすると、カメラの位置が表示対象物を中心にして移動します。
ホイールを回すと、表示対象物とカメラの距離が変わります。

実行結果

マウスで回転


サンプルプログラム

package tomojavalib.fx;

import javafx.application.Application;
import javafx.event.EventHandler;
import javafx.geometry.*;
import javafx.scene.*;
import javafx.scene.input.MouseButton;
import javafx.scene.input.MouseEvent;
import javafx.scene.input.ScrollEvent;
import javafx.scene.paint.Color;
import javafx.scene.shape.Box;
import javafx.scene.transform.*;
import javafx.stage.Stage;
import tomojavalib.javaFx3D.test1;


/**単純なJavaFX楽天 プログラム
 *マウスによるカメラの移動、回転
 * */
public class App16 extends Application {
Scene scene = null;
//カメラ方向操作用
//カメラと視点間の距離
double cl =-50.;
//カメラのXY角度
double cx =45.;
double cdx =0.;
double cy =45.;
double cdy =0.;
static Rotate camerarotateX = null;
static Rotate camerarotateY = null;
Translate cameratranslate = null;

 public static void main(String[] args) {
  Application.launch(args);
 }
 
 @Override
 public void start(Stage stage) throws Exception {
  scene = make3dScene();
  stage.setScene(scene);
  setEvent();
  //タイトルの表示
  stage.setTitle("カメラ試験");
  stage.show();
 }

private Scene make3dScene(){
 Group group = new Group();
 //箱を置く
 Box box = new Box( 10 , 10 , 10 );
 Translate boxtranslate = new Translate(100,100,100);
 box.getTransforms().add( boxtranslate );
 group.getChildren().add( box );
 // カメラを置く
 PerspectiveCamera camera = new PerspectiveCamera( true );
 //方向と位置
 cameratranslate = new Translate(0,0,-50);
 camerarotateX = new Rotate( cx , new Point3D( 1 , 0 , 0 ) );
 camerarotateY = new Rotate( cy , new Point3D( 0 , 1 , 0 ) );
 camera.getTransforms().add( boxtranslate );
 camera.getTransforms().add( camerarotateX );
 camera.getTransforms().add( camerarotateY );
 camera.getTransforms().add( cameratranslate ); 
 //視界の角度
 camera.setFieldOfView( 30. );
 //可視距離の設定
 //camera.setFarClip( 50. );
 //camera.setNearClip( 45. );
 group.getChildren().add( camera ); 
 //点光源を置く
 LightBase light = new PointLight();
 light.setTranslateX(  30.0 );
 light.setTranslateY( -30.0 );
 light.setTranslateZ( -30.0 );
 group.getChildren().add( light );
 //Sceneの設定
 Scene s3d = new Scene(group, 320, 240);
 s3d.setFill(Color.ALICEBLUE);
 s3d.setCamera( camera );

return s3d;
}


private void setEvent(){
//マウスがドラッグされたときのイベント
 scene.setOnMouseDragged(new EventHandler<MouseEvent>() {
 @Override
 public void handle(MouseEvent event) {
  //ボタン楽天 が左なら視線変更
  if( event.getButton() == MouseButton.PRIMARY ){
   //カメラの視線方向をマウスドラッグに合わせて変更する
   double vddx = event.getSceneY() - App16.this.cdx ;
   App16.this.cx = App16.this.cx - vddx/2. ;
   double vddy = event.getSceneX() - App16.this.cdy ;
   App16.this.cy = App16.this.cy + vddy/2. ;              
   App16.camerarotateX.setAngle( cx );
   App16.camerarotateY.setAngle( cy );
   App16.this.cdx = event.getSceneY();
   App16.this.cdy = event.getSceneX();
  }
 }
});
//マウスが押されたときのイベント
scene.setOnMousePressed(new EventHandler<MouseEvent>() {
@Override
 public void handle(MouseEvent event) {
  App16.this.cdx = event.getSceneY();
  App16.this.cdy = event.getSceneX();
 }
});
//マウスホイールが回った時のイベント
scene.setOnScroll( new EventHandler<ScrollEvent>() {
 @Override
 public void handle(ScrollEvent event) {
  App16.this.cl = App16.this.cl + event.getDeltaY()/2. ;
  App16.this.cameratranslate.setZ( App16.this.cl );
 }
});
return;
}

}


3Dモデルが転倒するのを抑える

アバターを表示して、マウスで見る方向を変えるプログラムを作ったのですが、上の方法で始点を変えると、アバターが転倒してしまい、具合がよくありません。
カメラのX,Y2軸を操作するとこうなってしまいます。
カメラの代わりにローカルグループを置き、その上にカメラを置いて、カメラ、ローカルグループそれぞれ1軸ずつ回転するように変更したら、転がらずに視点移動ができるようになりました。

広告


対象を回転させない場合のサンプルプログラム

package tomojavalib.fx;

import javafx.application.Application;
import javafx.event.EventHandler;
import javafx.geometry.*;
import javafx.scene.*;
import javafx.scene.input.MouseButton;
import javafx.scene.input.MouseEvent;
import javafx.scene.input.ScrollEvent;
import javafx.scene.paint.Color;
import javafx.scene.shape.Box;
import javafx.scene.transform.*;
import javafx.stage.Stage;



/**単純な Java 楽天 FXプログラム
 *マウスによるカメラの移動、回転
 * */
public class CameraMouseMove extends Application {
Scene scene = null;
//カメラ方向操作用
//カメラと視点間の距離
double cl =-50.;
//カメラのXY角度
double cx =0.;
double cdx =0.;
double cy =0.;
double cdy =0.;
static Rotate camerarotateX = null;
static Rotate camerarotateY = null;
Translate cameratranslate = null;
Group cameraDai = new Group();
 
 public static void main(String[] args) {
  Application.launch(args);
 }
 
 @Override
 public void start(Stage stage) throws Exception {
  scene = make3dScene();
  stage.setScene(scene);
  setEvent();
  //タイトルの表示
  stage.setTitle("カメラ試験");
  stage.show();
 }

private Scene make3dScene(){
 Group group = new Group();
 //箱を置く
 Box box = new Box( 3 , 10 , 3 );
 //Translate boxtranslate = new Translate(100,100,100);
 //box.getTransforms().add( boxtranslate );
 group.getChildren().add( box );
 //カメラ台を置く
 group.getChildren().add( cameraDai );
 // カメラを置く
 PerspectiveCamera camera = new PerspectiveCamera( true );
 //方向と位置
 cameratranslate = new Translate(0,0,-50);
 camerarotateX = new Rotate( cx , new Point3D( 1 , 0 , 0 ) );
 camerarotateY = new Rotate( cy , new Point3D( 0 , 1 , 0 ) );
 //camera.getTransforms().add( boxtranslate );
 camera.getTransforms().add( camerarotateX );
 cameraDai.getTransforms().add( camerarotateY );
 camera.getTransforms().add( cameratranslate ); 
 //視界の角度
 camera.setFieldOfView( 30. );
 //可視距離の設定
 //camera.setFarClip( 50. );
 //camera.setNearClip( 45. );
 //group.getChildren().add( camera );
 cameraDai.getChildren().add( camera );
 //点光源を置く
 LightBase light = new PointLight();
 light.setTranslateX(  30.0 );
 light.setTranslateY( -30.0 );
 light.setTranslateZ( -30.0 );
 group.getChildren().add( light );
 //Sceneの設定
 Scene s3d = new Scene(group, 320, 240);
 s3d.setFill(Color.ALICEBLUE);
 s3d.setCamera( camera );

return s3d;
}


private void setEvent(){
//マウスがドラッグされたときのイベント
 scene.setOnMouseDragged(new EventHandler<MouseEvent>() {
 @Override
 public void handle(MouseEvent event) {
  //ボタンが左なら視線変更
  if( event.getButton() == MouseButton.PRIMARY ){
   //カメラの視線方向をマウスドラッグに合わせて変更する
   double vddx = event.getSceneY() - cdx ;
   cx = cx - vddx/2. ;
   double vddy = event.getSceneX() - cdy ;
   cy = cy + vddy/2. ;              
   camerarotateX.setAngle( cx );
   camerarotateY.setAngle( cy );
   cdx = event.getSceneY();
   cdy = event.getSceneX();
  }
 }
});
//マウスが押されたときのイベント
scene.setOnMousePressed(new EventHandler<MouseEvent>() {
@Override
 public void handle(MouseEvent event) {
  CameraMouseMove.this.cdx = event.getSceneY();
  CameraMouseMove.this.cdy = event.getSceneX();
 }
});
//マウスホイールが回った時のイベント
scene.setOnScroll( new EventHandler<ScrollEvent>() {
 @Override
 public void handle(ScrollEvent event) {
  CameraMouseMove.this.cl = CameraMouseMove.this.cl + event.getDeltaY()/2. ;
  CameraMouseMove.this.cameratranslate.setZ( CameraMouseMove.this.cl );
 }
});
return;
}
}

最終更新日: 2018-06-15 14:07:17

ともさんのHP >プロブラミング >JavaFX >JavaFXマウスで視界移動

このエントリーをはてなブックマークに追加
広告
おすすめ記事
新着ページ

ヤーリー梨  
竹の節抜き方法  
ボタンやラベルの修飾方法  
薪ストーブの構造  
メニューバー  
歴代衣装  
ダイアログ  
薪ストーブの点火  
薪ストーブに必要な薪の量  
RaspberryPiOSインストール  
伐木のしかた  

私の他のサイト

ともさんの箱庭(ブログ)
家庭菜園
3D-CAD
洋裁CAD

いいねなど

 RSS 

Author: Tomoyuki Ito

このサイトの文章・写真の無断転載を禁じます