javafx 3d相机抖动

javafx 3d相机抖动,java,javafx,javafx-3d,Java,Javafx,Javafx 3d,我试图制作一个立方体,你可以通过拖动来旋转你的相机。 大部分都能正常工作,但当我在X轴上旋转到低于-60度或高于-60度时,我的相机开始抖动到不同的位置。 我假设这与我如何计算相机的X轴旋转有关,或者与我如何设置JavaFX3D有关 这是我的密码 public class Program extends Application { double startX, startY; double startPosX, startPosY; @Override public void start(S

我试图制作一个立方体,你可以通过拖动来旋转你的相机。 大部分都能正常工作,但当我在X轴上旋转到低于-60度或高于-60度时,我的相机开始抖动到不同的位置。 我假设这与我如何计算相机的X轴旋转有关,或者与我如何设置JavaFX3D有关

这是我的密码

public class Program extends Application {

double startX, startY;
double startPosX, startPosY;

@Override
public void start(Stage primaryStage) throws Exception {
    Box box = new Box(50,50,50);
    Group group = new Group();
    group.getChildren().add(box);

    Camera camera = new PerspectiveCamera(true);
    camera.setNearClip(1);
    camera.setFarClip(1000);

    Scene scene = new Scene(group,250,250,true);
    scene.setFill(Color.SILVER);
    scene.setCamera(camera);

    camera.translateXProperty().setValue(0);
    camera.translateYProperty().setValue(0);
    camera.translateZProperty().setValue(-200);

    Rotate camRotX = new Rotate(0,0,0,200,Rotate.X_AXIS);
    Rotate camRotY = new Rotate(0,0,0,200,Rotate.Y_AXIS);
    camera.getTransforms().addAll(camRotX,camRotY);

    scene.setOnMousePressed(mouseEvent -> {
        startX = mouseEvent.getSceneX();
        startY = mouseEvent.getSceneY();
        startPosX = camRotX.angleProperty().get();
        startPosY = camRotY.angleProperty().get();
    });

    scene.setOnMouseDragged(mouseEvent -> {
        double angleX = startPosX-(mouseEvent.getSceneY()-startY)/4;
        double angleY = startPosY+(mouseEvent.getSceneX()-startX)/4;

        //angleX = angleX > 45 ? 45 : angleX < -45 ? -45 : angleX;

        Bounds boundsInScene = camera.localToScene(camera.getBoundsInLocal());

        double x = (0-boundsInScene.getCenterX())/200;
        //double y = (0-boundsInScene.getCenterY())/200;
        double z = (0-boundsInScene.getCenterZ())/200;
        
        camRotX.setAxis(new Point3D(z,0,-1*x));


        camRotY.setAngle(angleY);
        camRotX.setAngle(angleX);
    });

    primaryStage.setTitle("Testing");
    primaryStage.setScene(scene);
    primaryStage.show();
}

public static void main(String[] args) {
    Program.launch(args);
}
}
公共类程序扩展应用程序{
双星型,星型;
双startPosX,startPosY;
@凌驾
public void start(Stage primaryStage)引发异常{
盒子=新盒子(50,50,50);
组=新组();
group.getChildren().add(框);
摄像头=新透视摄像头(真);
摄像机。设置近夹(1);
摄像机。setFarClip(1000);
场景=新场景(组,250250,真);
场景。设置填充(颜色。银色);
场景。设置摄像机(摄像机);
camera.translateProperty().setValue(0);
camera.translateYProperty().setValue(0);
camera.translateZProperty().setValue(-200);
旋转凸轮轴X=新旋转(0,0,0200,旋转X_轴);
旋转凸轮Y=新旋转(0,0,0200,旋转Y_轴);
camera.getTransforms().addAll(camRotX,camRotY);
scene.setOnMousePressed(mouseEvent->{
startX=mouseEvent.getSceneX();
startY=mouseEvent.getSceneY();
startPosX=camRotX.angleProperty().get();
startPosY=camRotY.angleProperty().get();
});
scene.setonmousedrable(mouseEvent->{
双角度x=startPosX-(mouseEvent.getSceneY()-startY)/4;
双角度=startPosY+(mouseEvent.getSceneX()-startX)/4;
//angleX=angleX>45?45:angleX<-45?-45:angleX;
Bounds boundsInScene=camera.localToScene(camera.getBoundsInLocal());
双x=(0-boundsInScene.getCenterX())/200;
//双y=(0-boundsInScene.getCenterY())/200;
双z=(0-boundsInScene.getCenterZ())/200;
设置轴(新的点3D(z,0,-1*x));
凸轮设置角度(角度);
camRotX.设定角(角度x);
});
初级阶段。设置标题(“测试”);
初级阶段。场景(场景);
primaryStage.show();
}
公共静态void main(字符串[]args){
项目启动(args);
}
}