JavaFX 3D 可视化编程四
前面的例子介绍过缩放,但是采用的键盘交互的方式,不太方便,这里介绍基于鼠标中键的物体缩放显示。
主要是添加了鼠标缩放的事件。
代码如下:
package chapt5;
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.input.ScrollEvent;
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 Zoom3D extends Application {
private static final float WIDTH=1400;
private static final float 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);
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, Stage stage) {
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()));
});
stage.addEventHandler(ScrollEvent.SCROLL, scrollEvent -> {
double delta = scrollEvent.getDeltaY();
group.translateZProperty().set(group.getTranslateZ()+delta);
});
}
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);
}
}
}
效果如下: