JavaFX 3D Поворот камеры Y вокруг широты - PullRequest
0 голосов
/ 26 сентября 2019

Я определил камеру, которая вращается вокруг начала сцены, с осью вращения 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

1 Ответ

0 голосов
/ 26 сентября 2019

Я понял, что должен изменить ось камеры X (ту, которая идет вверх и вниз).Поскольку камера вращается вокруг оси Y, оси X и Z перемещаются, поэтому необходимо соответствующим образом адаптировать вращение.

Вместо этого я добавил Point3D, который я изменяю при каждом перемещении камеры Y:

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

А в мышке метод Dragged:

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();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...