настройка javafx 3d box или вращающейся панели стека

Моя цель — игра в кости. Я использую javafx.

Первый вопрос: есть ли простой способ настроить 3D-окно в javafx. Для меня не имеет значения, нужно ли мне добавить изображение на каждую сторону кубика или я использую только одно изображение, которое оборачивает коробку. (После долгих исследований я ничего не нашел об этом.)

В приведенном ниже коде я создал панель стека, которая представляет собой трехмерный куб. Он построен из 6 прямоугольников, каждый из которых заполнен одной гранью игральной кости (от 1 до 6). Если я поверну панель стека на 180 градусов, прямоугольник, который должен быть на переднем плане, окажется на заднем плане, а тот, который был раньше, снова станет видимым.

Второй вопрос: как это исправить?

Или есть лучший способ понять это? Сначала я думал об использовании TriangleMesh, но он показался мне таким же сложным, как и мой вариант.

@FXML
private StackPane stack;

@Override
public void initialize(URL url, ResourceBundle rb) {
...
//other code


for (int i = 1; i < 7; i++){   
            Rectangle rt = getRectangle(i);
            rt.setSmooth(true);
            stack.getChildren().add(rt);
            switch(i) {
                case 1:
                    rt.setTranslateZ(100);                        
                    break;
                case 2:
                    rt.getTransforms().add(new Rotate(270, 50,50,0,Rotate.X_AXIS));
                    rt.setTranslateZ(100*0.5);
                    rt.setHeight(100);
                    rt.setTranslateY(100*0.5);
                    break;
                case 3:
                    rt.setTranslateZ(100*0.5);
                    rt.getTransforms().add(new Rotate(90, 50, 50, 0, Rotate.Y_AXIS));
                    rt.setWidth(100);
                    rt.setTranslateX(-(100*0.5-1));
                    break;
                case 4:
                    rt.setTranslateZ(100*0.5);
                    rt.getTransforms().add(new Rotate(90,50,50,0,Rotate.Y_AXIS));
                    rt.setWidth(100);
                    rt.setTranslateX(100*0.5);
                    break;
                case 5:    
                    rt.setTranslateZ(100*0.5);
                    rt.setTranslateY(-(100*0.5));
                    rt.getTransforms().add(new Rotate(270,50,50,0, Rotate.X_AXIS));
                    rt.setHeight(100);
                    break;
                case 6:
                    rt.setTranslateZ(0);
                    break;
            }      

private Rectangle getRectangle(int number){
    Rectangle rt = new Rectangle(100, 100);
    rt.setFill(new ImagePattern(loadImage(number)));
    return rt;
}

person ThoFin    schedule 07.07.2015    source источник


Ответы (1)


Проблема с Box, как вы, возможно, уже заметили, заключается в том, что если вы применяете изображение в качестве диффузной карты, оно будет одинаково применяться ко всем его 6 граням.

Если вы посмотрите на проект FXyz, там есть реализация похожей трехмерной формы, CuboidMesh.

Имея полный доступ к 'TriangleMesh', легко настроить способ сопоставления текстуры с диффузным изображением. В этом случае способ его реализации заключается в использовании сети куба:

Cube net

Так что теперь вам просто нужно предоставить свою собственную сеть. Например, этот:

Dice net

из здесь

Просто поверните его на 180º и обрежьте до края, и с помощью этого короткого кода вы получите свои кости:

CuboidMesh cuboid = new CuboidMesh(10f,10f,10f);
cuboid.setTextureModeImage(getClass().getResource("rotated_image014.jpg").toExternalForm());

Dice

person José Pereda    schedule 07.07.2015