Créer un cube de dés 3d dans javafx et faire son animation de dés 3D


J'ai implémenté un cube de dés pour un jeu que je développe avec des partenaires et j'essaie de créer une animation pour le cube.

Jusqu'à présent, la seule chose que je suis capable de réaliser est de faire pivoter le cube de 360 degrés pendant une durée de 3000 mils que j'ai définie dans un motif d'axe que je crée aléatoirement.

Je ne suis cependant pas capable de faire une rotation sur un axe Y et j'atterris toujours sur la même face du cube(le nombre 4 pour une raison quelconque).

Voici le code qui traite du texte ci-dessus:

package test;
import javafx.application.Application;

import java.util.Random;
import javafx.animation.RotateTransition;
import javafx.scene.DepthTest;
import javafx.scene.Group;
import javafx.scene.PerspectiveCamera;
import javafx.scene.Scene;
import javafx.scene.input.MouseEvent;
import javafx.scene.paint.Color;
import javafx.scene.transform.Rotate;
import javafx.scene.transform.Translate;
import javafx.stage.Stage;
import javafx.util.Duration;

public class TrafoTest extends Application {

    final Group root = new Group();
    final XformWorld world1 = new XformWorld();
    final PerspectiveCamera camera = new PerspectiveCamera(true);
    final XformCamera cameraXform = new XformCamera();
    private static final double CAMERA_INITIAL_DISTANCE = -1000;
    private static final double CAMERA_NEAR_CLIP = 0.1;
    private static final double CAMERA_FAR_CLIP = 10000.0;
    double mousePosX, mousePosY, mouseOldX, mouseOldY, mouseDeltaX, mouseDeltaY;

    @Override
    public void start(Stage primaryStage) {
        root.getChildren().add(world1);
        CuboidMesh cuboid = new CuboidMesh(50f,50f,50f);
        cuboid.setTextureModeImage(getClass().getResource("/test/allFacesv2.png").toExternalForm());
        RotateTransition rt = new RotateTransition(Duration.millis(3000), cuboid);
        float number1;
        float number2;
        float number3;
        float minX = 1.0f;
        float maxX = 50.0f;
        Random rand = new Random();
        number1 = rand.nextFloat()* (maxX - minX) * minX;
        number2 = rand.nextFloat()* (maxX - minX) + minX;
        number3 = rand.nextFloat()* (maxX - minX) - minX;
        rt.setByAngle(360);
        rt.setAxis(new javafx.geometry.Point3D(number1,number2,number3));
       // rt.setCycleCount(2);
        //rt.setAutoReverse(true);
        rt.play();
        root.getChildren().addAll(cuboid);
        root.setDepthTest(DepthTest.ENABLE);
        buildCamera();
        Scene scene = new Scene(root, 800, 800, true);
        scene.setFill(Color.GREY);
        handleMouse(scene);
        primaryStage.setTitle("Transformationen");
        primaryStage.setScene(scene);
        primaryStage.show();
        scene.setCamera(camera);
    }

    private void buildCamera() {
        root.getChildren().add(cameraXform);
        cameraXform.getChildren().add(camera);
        camera.setNearClip(CAMERA_NEAR_CLIP);
        camera.setFarClip(CAMERA_FAR_CLIP);
        camera.setTranslateZ(CAMERA_INITIAL_DISTANCE);
    }

    private void handleMouse(Scene scene) {
        scene.setOnMousePressed((MouseEvent me) -> {
            mousePosX = me.getSceneX();
            mousePosY = me.getSceneY();
            mouseOldX = me.getSceneX();
            mouseOldY = me.getSceneY();
            // this is done after clicking and the rotations are apearently
            // performed in coordinates that are NOT rotated with the camera.
            // (pls activate the two lines below for clicking)
            //cameraXform.rx.setAngle(-90.0);
            //cameraXform.ry.setAngle(180.0);
        });
        scene.setOnMouseDragged((MouseEvent me) -> {
            mouseOldX = mousePosX;
            mouseOldY = mousePosY;
            mousePosX = me.getSceneX();
            mousePosY = me.getSceneY();
            mouseDeltaX = (mousePosX - mouseOldX);
            mouseDeltaY = (mousePosY - mouseOldY);
            if (me.isPrimaryButtonDown()) {
                // this is done when the mouse is dragged and each rotation is
                // performed in coordinates, that are rotated with the camera.            
                cameraXform.ry.setAngle(cameraXform.ry.getAngle() + mouseDeltaX * 0.2);
                cameraXform.rx.setAngle(cameraXform.rx.getAngle() - mouseDeltaY * 0.2);                
            }
        });
    }

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

}

class XformWorld extends Group {

    final Translate t = new Translate(0.0, 0.0, 0.0);
    final Rotate rx = new Rotate(0, 0, 0, 0, Rotate.X_AXIS);
    final Rotate ry = new Rotate(0, 0, 0, 0, Rotate.Y_AXIS);
    final Rotate rz = new Rotate(0, 0, 0, 0, Rotate.Z_AXIS);

    public XformWorld() {
        super();
        this.getTransforms().addAll(t, rx, ry, rz);
    }

}

class XformCamera extends Group {

    final Translate t = new Translate(0.0, 0.0, 0.0);
    final Rotate rx = new Rotate(0, 0, 0, 0, Rotate.X_AXIS);
    final Rotate ry = new Rotate(0, 0, 0, 0, Rotate.Y_AXIS);
    final Rotate rz = new Rotate(0, 0, 0, 0, Rotate.Z_AXIS);

    public XformCamera() {
        super();
        this.getTransforms().addAll(t, rx, ry, rz);
    }

}

L'image que j'ai utilisé est: entrez la description de l'image ici

Author: José Pereda, 2016-12-05