当前位置: 首页 > 知识库问答 >
问题:

MeshView scalafx/javafx 的剪裁

李兴为
2023-03-14

我有以下测试代码,我尝试用圆圈剪辑MeshView。我还尝试将MeshView放入一个组中,然后剪切它,但这会导致黑色圆圈。

有没有办法剪辑一个MeshView,最好不要放到一个组里?

import scalafx.application.JFXApp
import scalafx.application.JFXApp.PrimaryStage
import scalafx.scene.image.Image
import scalafx.scene.paint.{Color, PhongMaterial}
import scalafx.scene.shape.{TriangleMesh, Circle, MeshView}
import scalafx.scene.{Group, PerspectiveCamera, Scene, SceneAntialiasing}

object Test4 extends JFXApp {
  stage = new PrimaryStage {
    scene = new Scene(500, 500, true, SceneAntialiasing.Balanced) {
      fill = Color.LightGray
      val clipCircle = Circle(150.0)
      val meshView = new MeshView(new RectangleMesh(500,500)) {
        // takes a while to load
        material = new PhongMaterial(Color.White, new Image("https://peach.blender.org/wp-content/uploads/bbb-splash.png"), null, null, null)
      }
    //  val meshGroup = new Group(meshView)
      meshView.setClip(clipCircle)
      root = new Group {children = meshView; translateX = 250.0; translateY = 250.0; translateZ = 560.0}
      camera = new PerspectiveCamera(false)
    }
  }
}

class RectangleMesh(Width: Float, Height: Float) extends TriangleMesh {
  points = Array(
    -Width / 2, Height / 2, 0,
    -Width / 2, -Height / 2, 0,
    Width / 2, Height / 2, 0,
    Width / 2, -Height / 2, 0
  )
  texCoords = Array(
    1, 1,
    1, 0,
    0, 1,
    0, 0
  )
  faces = Array(
    2, 2, 1, 1, 0, 0,
    2, 2, 3, 3, 1, 1
  )

共有1个答案

漆雕稳
2023-03-14

剪裁实际上可以在围绕GroupMeshView上正常工作。

如果您检查JavaDoc的setClip()

将剪辑与3D变换混合存在已知的限制。剪辑本质上是一种2D图像操作。具有3D转换子节点的组节点上的剪辑集的结果将导致其子节点按顺序呈现,而无需在这些子节点之间应用Z缓冲。

因此:

Group meshGroup = new Group(meshView);
meshGroup.setClip(clipCircle);

您将获得一个二维图像,并且似乎未应用材质。但是,通过设置以下项,可以检查是否存在网格:

meshView.setDrawMode(DrawMode.LINE);

所以在你的情况下,调整尺寸:

@Override
public void start(Stage primaryStage) {
    Circle clipCircle = new Circle(220.0);
    MeshView meshView = new MeshView(new RectangleMesh(400,400));
    meshView.setDrawMode(DrawMode.LINE);
    Group meshGroup = new Group(meshView);
    meshGroup.setClip(clipCircle);
    PerspectiveCamera camera = new PerspectiveCamera(false);

    StackPane root = new StackPane();
    final Circle circle = new Circle(220.0);
    circle.setFill(Color.TRANSPARENT);
    circle.setStroke(Color.RED);
    root.getChildren().addAll(meshGroup, circle);

    Scene scene = new Scene(root, 500, 500, true, SceneAntialiasing.BALANCED);
    scene.setCamera(camera);

    primaryStage.setTitle("Hello World!");
    primaryStage.setScene(scene);
    primaryStage.show();
}

会给这个:

最后,剪裁对3D形状没有意义。为此,您可以仅使用2D形状来获得所需的结果。

如果您想要 3D 裁剪,请查看 CSG 操作。检查此问题以获取基于 JavaFX 的解决方案。

 类似资料:
  • 问题内容: 如何使用JavaFX 完成Android ? 我有图像视图: 问题答案: 感谢@TravisF的发布,我实现了最后一个解决方案,以使图像始终具有相同的高度,宽度和位置(中心)。

  • 我试图在JavaFX画布上显示非常大的图像。单个图像的分辨率为11980x8365。每个图像都有一个相应的世界文件,我可以用它来正确定位图像。我的画布尺寸是800x600。有时我需要把整个图像写在画布上,有时只是其中的一部分。 以下是我到目前为止所做的: 将文件中的全尺寸图像加载到Image对象中。 计算要显示图像的哪一部分,并计算缩放参数以正确地将其放入800x600画布中。 所以基本上我想使用

  • 我在javafx上工作,要求是当任何按钮在屏幕上被点击时,屏蔽/剪辑特定的屏幕。当按钮被点击时,在我们收到响应之前,我应该限制用户访问页面中的其他选项/按钮。用户需要等待,直到请求得到处理。当请求得到处理时,我需要禁用/屏蔽/剪辑我的主窗口(我不确定确切的术语)。我怎么能这样做? 我用的是java 1.7_25

  • 我在javafx Grouping中遇到问题。我的程序是在ImageView上绘制一个矩形来裁剪图像。坐标是从鼠标按下和鼠标释放中获得的。当我将组放在GridPane布局中时,矩形没有画在正确的位置。 我的程序是 我的输出屏幕截图是 但矩形应该在图像中查看

  • 本文向大家介绍JavaFX实现石头剪刀布小游戏,包括了JavaFX实现石头剪刀布小游戏的使用技巧和注意事项,需要的朋友参考一下 用JavaFX写一个石头剪刀布的小游戏,供大家参考,具体内容如下 课程上布置的作业,其实java很少用来写这种程序的 - GUI界面部分 - 石头剪刀布的逻辑部分 书上教的是JavaFX,其实还有很多方法,书上说AWT和Swing基本上淘汰了,但事实上… 代码 MyJav

  • GraphicsContext的clearRect方法的文档说明它使用了当前的剪辑,但这对我来说目前不起作用。考虑: 上面的代码正确地设置了剪辑掩码,fillOval正确地工作,而clearRect却什么也不做(尽管它在没有context.clip()的情况下正常工作),这就证明了这一点。这是为什么? --编辑-- 说清楚点,clearRect什么都不做,甚至连椭圆都不擦除。我意识到它不会抹去画的