JavaFX 3D 可视化编程三
上一篇介绍了基于键盘交互的物体旋转,这篇介绍基于鼠标的物体旋转。
主要是写了相应鼠标拖动的方法。
整体代码如下:
package chapt4;
import javafx.application.Application;
import javafx.beans.property.DoubleProperty;
import javafx.beans.property.SimpleDoubleProperty;
import javafx.scene.Camera;
import javafx.scene.Group;
import javafx.scene.PerspectiveCamera;
import javafx.scene.Scene;
import javafx.scene.input.KeyEvent;
import javafx.scene.paint.Color;
import javafx.scene.shape.Box;
import javafx.scene.transform.Rotate;
import javafx.scene.transform.Transform;
import javafx.stage.Stage;
public class Mouse3D extends Application {
private static final int WIDTH=1400;
private static final int HEIGHT=800;
private double anchorX, anchorY;
private double anchorAngleX=0;
private double anchorAngleY=0;
private final DoubleProperty angleX = new SimpleDoubleProperty(0);
private final DoubleProperty angleY = new SimpleDoubleProperty(0);
@Override
public void start(Stage primaryStage) throws Exception{
Box box = new Box( 100, 20, 50);
SmartGroup group = new SmartGroup();
group.getChildren().add(box);
Camera camera = new PerspectiveCamera();
Scene scene =new Scene(group, WIDTH, HEIGHT);
scene.setFill(Color.SILVER);
scene.setCamera(camera);
group.translateXProperty().set(WIDTH/2);
group.translateYProperty().set(HEIGHT/2);
group.translateZProperty().set(-1200);
initMouseControl(group, scene);
primaryStage.addEventHandler(KeyEvent.KEY_PRESSED, event->{
switch (event.getCode()){
case W:
group.translateZProperty().set(group.getTranslateZ()+50);
break;
case S:
group.translateZProperty().set(group.getTranslateZ()-50);
break;
case Q:
group.rotateByX(10);
break;
case E:
group.rotateByX(-10);
break;
case A:
group.rotateByY(10);
break;
case D:
group.rotateByY(-10);
break;
}
});
primaryStage.setTitle("Camera3D");
primaryStage.setScene(scene);
primaryStage.show();
}
private void initMouseControl(SmartGroup group, Scene scene) {
Rotate xRotate;
Rotate yRotate;
group.getTransforms().addAll(
xRotate = new Rotate(0, Rotate.X_AXIS),
yRotate = new Rotate(0, Rotate.Y_AXIS)
);
xRotate.angleProperty().bind(angleX);
yRotate.angleProperty().bind(angleY);
scene.setOnMousePressed(mouseEvent -> {
anchorX = mouseEvent.getSceneX();
anchorY = mouseEvent.getScreenY();
anchorAngleX = angleX.get();
anchorAngleY = angleY.get();
});
scene.setOnMouseDragged(mouseEvent -> {
angleX.set(anchorAngleX - (anchorY - mouseEvent.getSceneY()));
angleY.set(anchorAngleY - (anchorX- mouseEvent.getSceneX()));
});
}
public static void main(String[] args) {
launch(args);
}
class SmartGroup extends Group{
Rotate r;
Transform t = new Rotate();
void rotateByX(int ang){
r=new Rotate(ang, Rotate.X_AXIS);
t = t.createConcatenation(r);
this.getTransforms().clear();
this.getTransforms().addAll(t);
}
void rotateByY(int ang){
r=new Rotate(ang, Rotate.Y_AXIS);
t = t.createConcatenation(r);
this.getTransforms().clear();
this.getTransforms().addAll(t);
}
}
}
效果如下