我使用Zydar的公式创建了一个可直接运行的示例。
testBox 是被旋转的3D对象。
如果这不是您想要的行为,请详细说明您的问题。
重要部分:
private void handleMouseEvents() {
scene.setOnMousePressed((MouseEvent me) -> {
mousePosX = me.getSceneX();
mousePosY = me.getSceneY();
});
scene.setOnMouseDragged((MouseEvent me) -> {
double dx = (mousePosX - me.getSceneX()) ;
double dy = (mousePosY - me.getSceneY());
if (me.isPrimaryButtonDown()) {
rotateX.setAngle(rotateX.getAngle() -
(dy / testBox.getHeight() * 360) * (Math.PI / 180));
rotateY.setAngle(rotateY.getAngle() -
(dx / testBox.getWidth() * -360) * (Math.PI / 180));
}
mousePosX = me.getSceneX();
mousePosY = me.getSceneY();
});
}
整个SSCCE:
import javafx.application.Application;
import javafx.scene.Group;
import javafx.scene.Parent;
import javafx.scene.PerspectiveCamera;
import javafx.scene.Scene;
import javafx.scene.SceneAntialiasing;
import javafx.scene.SubScene;
import javafx.scene.input.MouseEvent;
import javafx.scene.paint.Color;
import javafx.scene.shape.Box;
import javafx.scene.transform.Rotate;
import javafx.scene.transform.Translate;
import javafx.stage.Stage;
public class SampleApp extends Application {
private Box testBox;
private Scene scene;
private Rotate rotateX = new Rotate(0, Rotate.X_AXIS);
private Rotate rotateY = new Rotate(0, Rotate.Y_AXIS);
private Rotate rotateZ = new Rotate(0, Rotate.Z_AXIS);
private final double TURN_FACTOR = 0.5;
public Parent createContent() throws Exception {
testBox = new Box(5, 5, 5);
testBox.getTransforms().addAll(rotateZ, rotateY, rotateX);
PerspectiveCamera camera = new PerspectiveCamera(true);
camera.getTransforms().addAll(
new Rotate(-20, Rotate.Y_AXIS),
new Rotate(-20, Rotate.X_AXIS),
new Translate(0, 0, -50));
Group root = new Group();
root.getChildren().add(camera);
root.getChildren().add(testBox);
SubScene subScene = new SubScene(root, 300, 300, true,
SceneAntialiasing.BALANCED);
subScene.setFill(Color.TRANSPARENT);
subScene.setCamera(camera);
return new Group(subScene);
}
private double mousePosX, mousePosY = 0;
private void handleMouseEvents() {
scene.setOnMousePressed((MouseEvent me) -> {
mousePosX = me.getSceneX();
mousePosY = me.getSceneY();
});
scene.setOnMouseDragged((MouseEvent me) -> {
double dx = (mousePosX - me.getSceneX()) ;
double dy = (mousePosY - me.getSceneY());
if (me.isPrimaryButtonDown()) {
rotateX.setAngle(rotateX.getAngle() -
(dy / testBox.getHeight() * 360) * (Math.PI / 180));
rotateY.setAngle(rotateY.getAngle() -
(dx / testBox.getWidth() * -360) * (Math.PI / 180));
}
mousePosX = me.getSceneX();
mousePosY = me.getSceneY();
});
}
@Override
public void start(Stage primaryStage) throws Exception {
primaryStage.setResizable(false);
scene = new Scene(createContent());
handleMouseEvents();
primaryStage.setScene(scene);
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
}