Как повернуть объект вокруг пользовательского поворота в JavaFX?

Я хочу повернуть объект вокруг пользовательской оси, которая является его точкой, поэтому у меня есть такой код:

private final EventHandler<MouseEvent> mouseEventHandler = new EventHandler<MouseEvent>() {
        @Override
        public void handle(MouseEvent mouseEvent) {
            if (mouseEvent.getEventType() == MouseEvent.MOUSE_PRESSED) {
                dragStartX = mouseEvent.getSceneX();
                dragStartY = mouseEvent.getSceneY();
                mousePosX = mouseEvent.getSceneX();
                mousePosY = mouseEvent.getSceneY();
                mouseOldX = mouseEvent.getSceneX();
                mouseOldY = mouseEvent.getSceneY();

                if (mouseEvent.isMiddleButtonDown()) {
                    pivot = mouseEvent.getPickResult().getIntersectedPoint();
                    camForm1.rx.setPivotX(pivot.getX());
                    camForm1.ry.setPivotY(pivot.getY());
                    camForm1.rz.setPivotZ(pivot.getZ());
                    System.out.println(pivot);
                }

            } else if (mouseEvent.getEventType() == MouseEvent.MOUSE_DRAGGED) {

                double modifier = 1.0;
                double modifierFactor = 0.3;

                if (mouseEvent.isControlDown()) {
                    modifier = 0.1;
                }
                if (mouseEvent.isShiftDown()) {
                    modifier = 10.0;
                }

                mouseOldX = mousePosX;
                mouseOldY = mousePosY;
                mousePosX = mouseEvent.getSceneX();
                mousePosY = mouseEvent.getSceneY();
                mouseDeltaX = (mousePosX - mouseOldX); //*DELTA_MULTIPLIER;
                mouseDeltaY = (mousePosY - mouseOldY); //*DELTA_MULTIPLIER;

                double flip = -1.0;

                if (mouseEvent.isPrimaryButtonDown() && mouseEvent.isSecondaryButtonDown()) {
                    camForm2.t.setX(camForm2.t.getX() + flip * mouseDeltaX * modifierFactor * modifier * 0.3);  // -
                    camForm2.t.setY(camForm2.t.getY() + mouseDeltaY * modifierFactor * modifier * 0.3);  // -  yFlip*
                } else if (mouseEvent.isSecondaryButtonDown()) {
                    camForm1.ry.setAngle(camForm1.ry.getAngle() - mouseDeltaX * modifierFactor * modifier * 2.0);  // + yFlip*
                    camForm1.rx.setAngle(camForm1.rx.getAngle() + flip * mouseDeltaY * modifierFactor * modifier * 2.0);  // -

                }
            }
        }
    };

camForm1 и camForm2 являются примерами класса XForm.

    public class XForm extends Group {

        public enum RotateOrder {
            XYZ, XZY, YXZ, YZX, ZXY, ZYX
        }

        public Translate t  = new Translate();
        public Translate p  = new Translate();
        public Translate ip = new Translate();
        public Rotate rx = new Rotate(0.0, 0.0, 0.0, 0.0, Rotate.X_AXIS);
        public Rotate ry = new Rotate(0.0, 0.0, 0.0, 0.0, Rotate.Y_AXIS);
        public Rotate rz = new Rotate(0.0, 0.0, 0.0, 0.0, Rotate.Z_AXIS);
        public Scale s = new Scale();

        public XForm() {
            super();
            getTransforms().addAll(t, rz, ry, rx, s);
        }
...
}

Но вращение происходит вокруг точки O (0, 0, 0). Что я делаю не так?


person Eugene    schedule 08.12.2013    source источник


Ответы (2)


Только что сам занимался этой проблемой.

Я не совсем понимаю ваш код, но класс Rotate позволяет установить пользовательскую точку разворота.

Пример:

Box box = new Box(1, 1, 1); // can be any Node
box.getTransforms().add(new Rotate(angle, pivotX, pivotY, pivotZ, Rotate.Z_AXIS));
person John Zeringue    schedule 02.01.2014
comment
Я попытался изменить точку поворота с (0, 0, 0), которая была установлена ​​в конструкторе, на какую-то новую с помощью setPivotX(pivot.getX()) и так далее с осями Y и Z. Вы предлагаете добавить новый Transform, но не означает ли это, что каждый раз, когда я буду менять точку опоры, будет добавляться новый Transform. А набор преобразований может быть невероятно огромным. - person Eugene; 02.01.2014
comment
Если вам нужно изменить поворот, получите к нему доступ с помощью getTransforms().get(rotationIndex). В конце концов, getTransforms() возвращает список, а преобразования JavaFX изменяемы. - person John Zeringue; 03.01.2014
comment
Это сработало как волшебство, спасибо, что закончили длинную серию все более беспокоящих запросов Google. - person Dennis; 08.09.2019

Создать вращающийся объект

Rotate x = new Rotate(1,2,7,134); 

Принудительное расположение точки поворота с помощью свойства поворота

x.pivotXProperty().set(2);
x.pivotYProperty().set(7);
x.pivotZProperty().set(134);

Добавить ось вращения

x.axisProperty().setValue(Rotate.Y_AXIS);

Используйте получение преобразований

meshViews[14].getTransforms().add(x);
meshViews[9].getTransforms().add(x);                      
person Belmendo    schedule 23.03.2016