我有以下测试代码,我尝试用圆圈剪辑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
)
剪裁实际上可以在围绕Group
的MeshView
上正常工作。
如果您检查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什么都不做,甚至连椭圆都不擦除。我意识到它不会抹去画的