3d - 如何在 JavaFX 中围绕自定义枢轴旋转对象?

标签 3d javafx-8

我想围绕一个自定义枢轴旋转一个对象,这是它的点,所以我有这样的代码:

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);  // -

                }
            }
        }
    };

camForm1camForm2XForm 类的例子。

    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) 进行的。我做错了什么?

最佳答案

刚刚自己处理了这个问题。

我不太明白你的代码,但是 Rotate class允许设置自定义枢轴点。

一个例子:

Box box = new Box(1, 1, 1); // can be any Node
box.getTransforms().add(new Rotate(angle, pivotX, pivotY, pivotZ, Rotate.Z_AXIS));

关于3d - 如何在 JavaFX 中围绕自定义枢轴旋转对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20457122/

相关文章:

3d - CSS3 3D 转换发生水平溢出

c++ - 为 3D 杯子创建圆柱体底座(现代 OpenGL、GLM)

c++ - VS2012使用3D模型的困境

java - 如何在 FXML 中为 javafx DatePicker 设置默认值?

java - 如何从后台定期任务修改模型属性?

java - 排序 ObservableList 理解比较器和谓词

c# - 以 3D 形式渲染点或平面

c++ - 如何将 RAW 文件(3D 图像)转换为 STL 格式?

java - 每分钟有两个节点淡入和淡出

listview - 如何以编程方式用户根据 JavaFX 中的字符串值定义 ListView 的颜色