【问题标题】:customizing javafx 3d box or rotating stackpane自定义 javafx 3d 框或旋转堆栈窗格
【发布时间】:2015-07-07 16:26:15
【问题描述】:

我的目标是玩骰子游戏。我正在使用 javafx。

第一个问题:有没有一种简单的方法可以在 javafx 中自定义 3d 框。如果我必须在模具的每一面都添加一个图像,或者我只使用一个环绕盒子的图像,这对我来说并不重要。 (经过大量研究,我没有找到任何关于它的信息。)

在下面的代码中,我创建了一个堆栈窗格,它是一个 3d 立方体。它由 6 个矩形组成,每个矩形都填充有模具的一侧(1 到 6)。如果我将堆栈窗格旋转 180 度,则应该在前景中的 Rectangle 在背景中,而之前在前面的 Rectangle 将再次可见。

第二个问题:如何解决这个问题?

或者有没有更好的方法来实现这一点?首先我在考虑使用 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;
}

【问题讨论】:

    标签: javafx 3d javafx-3d


    【解决方案1】:

    您可能已经注意到,Box 的问题在于,如果您将图像应用为漫反射贴图,它将平等地应用到其所有 6 个面。

    如果您查看 FXyz 项目,有一个类似 3D 形状的实现,CuboidMesh

    拥有对其“TriangleMesh”的完全访问权限,可以轻松自定义纹理映射到漫反射图像的方式。在这种情况下,它的实现方式是使用立方体的网络:

    所以现在您只需要提供自己的网络。比如这个:

    来自here

    只需将其旋转 180º 并将其裁剪到其边框,使用此短代码即可获得骰子:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-27
      • 1970-01-01
      • 1970-01-01
      • 2012-09-24
      • 1970-01-01
      相关资源
      最近更新 更多