在Javafx中围绕中心旋转对象

在Javafx中围绕中心旋转对象,javafx,3d,javafx-8,javafx-3d,Javafx,3d,Javafx 8,Javafx 3d,我的应用程序使用交互式网格库读取obj文件,并将其保存在meshview中。我想要的是围绕对象的中心旋转对象 现在,我的代码显示对象,但当我旋转它时,它会围绕某个点旋转,从而导致对象超出窗口。我想绕着物体的中心旋转。我知道我必须将物体平移到原点,然后旋转,然后再平移,但我不知道怎么做 这是我的代码: public class JavaFx3DObj extends Application { private static final String Filename = "mode

我的应用程序使用交互式网格库读取obj文件,并将其保存在meshview中。我想要的是围绕对象的中心旋转对象

现在,我的代码显示对象,但当我旋转它时,它会围绕某个点旋转,从而导致对象超出窗口。我想绕着物体的中心旋转。我知道我必须将物体平移到原点,然后旋转,然后再平移,但我不知道怎么做

这是我的代码:

    public class JavaFx3DObj extends Application
{
    private static final String Filename = "model/bunny.obj";
    private static final double MODEL_SCALE_FACTOR = 10;
    private static final double MODEL_X_OFFSET = 0; // standard
    private static final double MODEL_Y_OFFSET = 0; // standard
    private static final int VIEWPORT_SIZE = 800;

    private double mouseOldX, mouseOldY = 0;
    private Rotate rotateX = new Rotate(0, Rotate.X_AXIS);
    private Rotate rotateY = new Rotate(0, Rotate.Y_AXIS);
    private Rotate rotateZ = new Rotate(0, Rotate.Z_AXIS);

    private Group root;
    private Group buildScene()
    {
        File file = new File(Filename);
        ObjModelImporter importer = new ObjModelImporter();
        importer.read(file);
        MeshView[] meshViews = importer.getImport();
        importer.close();

        // To make the object appear in the middle of the scene
        for (MeshView meshView : meshViews)
        {
            meshView.setTranslateX(VIEWPORT_SIZE / 2 + MODEL_X_OFFSET);
            meshView.setTranslateY(VIEWPORT_SIZE / 2 + MODEL_Y_OFFSET);
            meshView.setTranslateZ(VIEWPORT_SIZE / 2);
            meshView.setScaleX(MODEL_SCALE_FACTOR);
            meshView.setScaleY(MODEL_SCALE_FACTOR);
            meshView.setScaleZ(MODEL_SCALE_FACTOR);
        }
        root = new Group(meshViews);

        return root;
    }

    @Override
    public void start(Stage stage) throws Exception 
    {
        Group root = buildScene();

        PerspectiveCamera camera = new PerspectiveCamera(false);
        camera.setTranslateX(100);
        camera.setTranslateY(0);
        camera.setTranslateZ(100);
        camera.getTransforms().addAll (rotateX, rotateY, new Translate(0, 0, 400));

        root.setRotationAxis(Rotate.Y_AXIS);
        root.setRotate(200);

        Scene scene = new Scene(root, 900, 500, true);
        scene.setFill(Color.rgb(10, 10, 40));
        scene.setCamera(camera);


        scene.setOnMousePressed(event -> 
        {
            mouseOldX = event.getSceneX();
            mouseOldY = event.getSceneY();
        });

        scene.setOnMouseDragged(event -> 
        {
            rotateX.setAngle(rotateX.getAngle() - (event.getSceneY() - mouseOldY));
            rotateY.setAngle(rotateY.getAngle() + (event.getSceneX() - mouseOldX));
            mouseOldX = event.getSceneX();
            mouseOldY = event.getSceneY();

        });
        stage.setTitle("JavaFx3DObj");
        stage.setScene(scene);
        stage.show();
    }

    public static void main(String[] args)
    {
        launch(args);
    }

}

您需要做的是在应用旋转之前设置旋转轴。 因此,您的代码如下所示:

public class JavaFx3DObj extends Application {
    private static final String Filename = "model/bunny.obj";
    private static final double MODEL_SCALE_FACTOR = 10;
    private static final double MODEL_X_OFFSET = 0; // standard
    private static final double MODEL_Y_OFFSET = 0; // standard
    private static final int VIEWPORT_SIZE = 800;

    private double mouseOldX, mouseOldY = 0;
    private Rotate rotateX = new Rotate(0, Rotate.X_AXIS);
    private Rotate rotateY = new Rotate(0, Rotate.Y_AXIS);
    private Rotate rotateZ = new Rotate(0, Rotate.Z_AXIS);

    private Group root;
    private Group buildScene() {
        File file = new File(Filename);
        ObjModelImporter importer = new ObjModelImporter();
        importer.read(file);
        MeshView[] meshViews = importer.getImport();
        importer.close();

        // To make the object appear in the middle of the scene
        for (MeshView meshView : meshViews) {
            meshView.setTranslateX(VIEWPORT_SIZE / 2 + MODEL_X_OFFSET);
            meshView.setTranslateY(VIEWPORT_SIZE / 2 + MODEL_Y_OFFSET);
            meshView.setTranslateZ(VIEWPORT_SIZE / 2);
            meshView.setScaleX(MODEL_SCALE_FACTOR);
            meshView.setScaleY(MODEL_SCALE_FACTOR);
            meshView.setScaleZ(MODEL_SCALE_FACTOR);
        }
        root = new Group(meshViews);

        return root;
    }

    @Override
    public void start(Stage stage) throws Exception {
        Group root = buildScene();

        PerspectiveCamera camera = new PerspectiveCamera(false);
        camera.setTranslateX(100);
        camera.setTranslateY(0);
        camera.setTranslateZ(100);
        camera.getTransforms().addAll (rotateX, rotateY, new Translate(0, 0, 400));

        root.setRotationAxis(Rotate.Y_AXIS);
        root.setRotate(200);

        Scene scene = new Scene(root, 900, 500, true);
        scene.setFill(Color.rgb(10, 10, 40));
        scene.setCamera(camera);

        //################ Set pivot points ################\\
        rotateX.setPivotX(VIEWPORT_SIZE / 2 + MODEL_X_OFFSET);
        rotateX.setPivotY(VIEWPORT_SIZE / 2 + MODEL_Y_OFFSET);
        rotateX.setPivotZ(VIEWPORT_SIZE / 2);

        rotateY.setPivotX(VIEWPORT_SIZE / 2 + MODEL_X_OFFSET);
        rotateY.setPivotY(VIEWPORT_SIZE / 2 + MODEL_Y_OFFSET);
        rotateY.setPivotZ(VIEWPORT_SIZE / 2);

        rotateZ.setPivotX(VIEWPORT_SIZE / 2 + MODEL_X_OFFSET);
        rotateZ.setPivotY(VIEWPORT_SIZE / 2 + MODEL_Y_OFFSET);
        rotateZ.setPivotZ(VIEWPORT_SIZE / 2);
        //################ End pivot points ################\\

        scene.setOnMousePressed(event -> {
            mouseOldX = event.getSceneX();
            mouseOldY = event.getSceneY();
        });

        scene.setOnMouseDragged(event -> {
            rotateX.setAngle(rotateX.getAngle() - (event.getSceneY() - mouseOldY));
            rotateY.setAngle(rotateY.getAngle() + (event.getSceneX() - mouseOldX));
            mouseOldX = event.getSceneX();
            mouseOldY = event.getSceneY();

        });
        stage.setTitle("JavaFx3DObj");
        stage.setScene(scene);
        stage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }
}
我只能用一个立方体来测试它,因为我没有ObjLoader/ObjFile,但这应该允许你围绕一个点旋转


小心。如果平移对象,必须将轴点设置到新位置。

需要做的是在应用旋转之前设置旋转轴。 因此,您的代码如下所示:

public class JavaFx3DObj extends Application {
    private static final String Filename = "model/bunny.obj";
    private static final double MODEL_SCALE_FACTOR = 10;
    private static final double MODEL_X_OFFSET = 0; // standard
    private static final double MODEL_Y_OFFSET = 0; // standard
    private static final int VIEWPORT_SIZE = 800;

    private double mouseOldX, mouseOldY = 0;
    private Rotate rotateX = new Rotate(0, Rotate.X_AXIS);
    private Rotate rotateY = new Rotate(0, Rotate.Y_AXIS);
    private Rotate rotateZ = new Rotate(0, Rotate.Z_AXIS);

    private Group root;
    private Group buildScene() {
        File file = new File(Filename);
        ObjModelImporter importer = new ObjModelImporter();
        importer.read(file);
        MeshView[] meshViews = importer.getImport();
        importer.close();

        // To make the object appear in the middle of the scene
        for (MeshView meshView : meshViews) {
            meshView.setTranslateX(VIEWPORT_SIZE / 2 + MODEL_X_OFFSET);
            meshView.setTranslateY(VIEWPORT_SIZE / 2 + MODEL_Y_OFFSET);
            meshView.setTranslateZ(VIEWPORT_SIZE / 2);
            meshView.setScaleX(MODEL_SCALE_FACTOR);
            meshView.setScaleY(MODEL_SCALE_FACTOR);
            meshView.setScaleZ(MODEL_SCALE_FACTOR);
        }
        root = new Group(meshViews);

        return root;
    }

    @Override
    public void start(Stage stage) throws Exception {
        Group root = buildScene();

        PerspectiveCamera camera = new PerspectiveCamera(false);
        camera.setTranslateX(100);
        camera.setTranslateY(0);
        camera.setTranslateZ(100);
        camera.getTransforms().addAll (rotateX, rotateY, new Translate(0, 0, 400));

        root.setRotationAxis(Rotate.Y_AXIS);
        root.setRotate(200);

        Scene scene = new Scene(root, 900, 500, true);
        scene.setFill(Color.rgb(10, 10, 40));
        scene.setCamera(camera);

        //################ Set pivot points ################\\
        rotateX.setPivotX(VIEWPORT_SIZE / 2 + MODEL_X_OFFSET);
        rotateX.setPivotY(VIEWPORT_SIZE / 2 + MODEL_Y_OFFSET);
        rotateX.setPivotZ(VIEWPORT_SIZE / 2);

        rotateY.setPivotX(VIEWPORT_SIZE / 2 + MODEL_X_OFFSET);
        rotateY.setPivotY(VIEWPORT_SIZE / 2 + MODEL_Y_OFFSET);
        rotateY.setPivotZ(VIEWPORT_SIZE / 2);

        rotateZ.setPivotX(VIEWPORT_SIZE / 2 + MODEL_X_OFFSET);
        rotateZ.setPivotY(VIEWPORT_SIZE / 2 + MODEL_Y_OFFSET);
        rotateZ.setPivotZ(VIEWPORT_SIZE / 2);
        //################ End pivot points ################\\

        scene.setOnMousePressed(event -> {
            mouseOldX = event.getSceneX();
            mouseOldY = event.getSceneY();
        });

        scene.setOnMouseDragged(event -> {
            rotateX.setAngle(rotateX.getAngle() - (event.getSceneY() - mouseOldY));
            rotateY.setAngle(rotateY.getAngle() + (event.getSceneX() - mouseOldX));
            mouseOldX = event.getSceneX();
            mouseOldY = event.getSceneY();

        });
        stage.setTitle("JavaFx3DObj");
        stage.setScene(scene);
        stage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }
}
我只能用一个立方体来测试它,因为我没有ObjLoader/ObjFile,但这应该允许你围绕一个点旋转


小心。如果平移对象,则必须将轴点设置到新位置。

请提供一个示例,您可以在
旋转
对象上设置轴坐标,从而定义要围绕哪个点旋转。您应该将对象中心设置为轴心。@Jhonny007您可以编写一个简单的代码吗?请看下面。您可以在
Rotate
对象上设置轴心坐标,从而定义您要围绕哪个点旋转。您应该将对象中心设置为轴心。@Jhonny007您能写一个简单的代码吗?请看下面的内容。我非常感谢您的回答和回复。非常感谢您的回复。我非常感谢您的回答和回复。非常感谢您的回复。