JavaFX 3D绕纬度旋转相机Y

标签 java javafx 3d

我定义了一个围绕场景原点旋转的相机,具有旋转 X 轴和旋转 Y 轴。

我希望 X 轴定义 Y 轴相机的“高度”,以便它围绕球体上的给定纬度旋转。

sphere

我已经这样定义了旋转:

    _cameraTranslate = new Translate(0, 0, -10);
    _cameraRotateX = new MyRotate(0, 0, 0, 10, Rotate.X_AXIS);
    _cameraRotateY = new MyRotate(0, 0, 0, 10, Rotate.Y_AXIS);
    _camera.getTransforms().addAll(_cameraTranslate, _cameraRotateX, _cameraRotateY);

并按如下方式旋转它们:

private void onMouseDragged(MouseEvent e) {
    _cameraRotateX.setAngle360(_cameraRotateX.getAngle() - (-e.getSceneY() + _mouseOldY));
    _cameraRotateY.setAngle360(_cameraRotateY.getAngle() - (e.getSceneX() - _mouseOldX));

    _mouseOldX = e.getSceneX();
    _mouseOldY = e.getSceneY();
}

这就是我旋转时所做的事情,移动世界而不是保持 X 轴线与框架平行(如果有意义的话)。

enter image description here

最佳答案

我意识到我必须修改 X 相机的轴(上下轴)。当相机绕 Y 轴旋转时,X 轴和 Z 轴会移动,因此需要相应地调整旋转。

相反,我添加了一个 Point3D,每次移动 Y 相机时都会修改它:

_cameraRotateXAxis = new Point3D(1, 0, 0);
_cameraRotateX = new MyRotate(0, 0, 0, 10, _cameraRotateXAxis);

在 mouseDragged 方法中:

private void onMouseDragged(MouseEvent e) {
    _cameraRotateX.setAngle360(_cameraRotateX.getAngle() - (-e.getSceneY() + _mouseOldY));
    _cameraRotateY.setAngle360(_cameraRotateY.getAngle() - (e.getSceneX() - _mouseOldX));

    _cameraRotateXAxis = _cameraRotateXAxis.add(-_cameraRotateXAxis.getX(), -_cameraRotateXAxis.getY(), -_cameraRotateXAxis.getZ());

    double angle = _cameraRotateY.getAngle();
    double newDelta = _cameraRotateY.getAngle()%90 / 90d;
    if (angle >= 0 && angle < 90) {
        _cameraRotateXAxis = _cameraRotateXAxis.add(-(1 - newDelta), 0, newDelta);
    }
    else if (angle >= 90 && angle < 180) {
        _cameraRotateXAxis = _cameraRotateXAxis.add(newDelta, 0, 1 -newDelta);
    }
    else if (angle >= 180 && angle < 270) {
        _cameraRotateXAxis = _cameraRotateXAxis.add(1 - newDelta, 0, -newDelta);
    }
    else {
        _cameraRotateXAxis = _cameraRotateXAxis.add(-newDelta, 0, -(1 - newDelta));
    }

    _mouseOldX = e.getSceneX();
    _mouseOldY = e.getSceneY();
}

关于JavaFX 3D绕纬度旋转相机Y,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58107201/

相关文章:

java - 如何在场景生成器的舞台上显示不同的 fxml 文件?切换场景?

JavaFX 制作自定义组件的可滚动列表

c++ - 玛雅编程 : Separating attributes into sections in the attribute editor

c++ - 检查框内是否有 3D 点

algorithm - 可接受的共识集,RANSAC?

java - 如何声明数组元素为空?

java - 使用 JDK 1.6 从 .mp3 读取数据的最佳插件

java - 逻辑电路仿真

javafx-2 - 如何检测按键

FileWriter和BufferedWriter之间的Java区别