自定义 javafx 3d 框或旋转堆栈窗格
customizing javafx 3d box or rotating stackpane
我的目标是玩骰子游戏。我正在使用 javafx。
第一个问题:有没有简单的方法在javafx中自定义3d框。这对我来说无关紧要,如果我必须在骰子的每一面添加一个图像,或者我是否只使用一个环绕盒子的图像。 (经过大量研究,我没有找到任何相关信息。)
在下面的代码中,我创建了一个堆栈窗格,它是一个 3d 立方体。它由 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;
}
您可能已经注意到,Box
的问题是,如果您将图像应用为漫反射贴图,它将同样应用于其所有 6 个面。
如果您查看 FXyz 项目,那里有一个类似 3D 形状的实现,CuboidMesh
。
拥有对其“TriangleMesh”的完全访问权限,可以轻松自定义纹理映射到漫反射图像的方式。在这种情况下,它的实现方式是使用立方体的网络:
所以现在你只需要提供你自己的网络。例如,这个:
来自 here
只需将它旋转 180º 并将其裁剪到边框,使用这个简短的代码,您将获得您的骰子:
CuboidMesh cuboid = new CuboidMesh(10f,10f,10f);
cuboid.setTextureModeImage(getClass().getResource("rotated_image014.jpg").toExternalForm());
我的目标是玩骰子游戏。我正在使用 javafx。
第一个问题:有没有简单的方法在javafx中自定义3d框。这对我来说无关紧要,如果我必须在骰子的每一面添加一个图像,或者我是否只使用一个环绕盒子的图像。 (经过大量研究,我没有找到任何相关信息。)
在下面的代码中,我创建了一个堆栈窗格,它是一个 3d 立方体。它由 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;
}
您可能已经注意到,Box
的问题是,如果您将图像应用为漫反射贴图,它将同样应用于其所有 6 个面。
如果您查看 FXyz 项目,那里有一个类似 3D 形状的实现,CuboidMesh
。
拥有对其“TriangleMesh”的完全访问权限,可以轻松自定义纹理映射到漫反射图像的方式。在这种情况下,它的实现方式是使用立方体的网络:
所以现在你只需要提供你自己的网络。例如,这个:
来自 here
只需将它旋转 180º 并将其裁剪到边框,使用这个简短的代码,您将获得您的骰子:
CuboidMesh cuboid = new CuboidMesh(10f,10f,10f);
cuboid.setTextureModeImage(getClass().getResource("rotated_image014.jpg").toExternalForm());