在javafx中创建一个3D骰子立方体并进行3D骰子动画

时间:2016-12-04 22:52:36

标签: java animation javafx 3d javafx-3d

我为一些正在与一些合作伙伴开发的游戏实现了一个骰子立方体,我正在尝试为该多维数据集创建一个动画。

到目前为止,我唯一能够实现的是将立方体旋转360度,持续时间为3000密耳,我在随机创建的轴模式中设置。

但是我无法在Y轴上进行旋转,而且我总是落在立方体的同一面上(由于某种原因,数字为4)。

这是处理上述文本的代码:

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

}

我使用的图片是:enter image description here

0 个答案:

没有答案
相关问题