マウスで視点位置を移動する方法
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