我们有很多Swing代码依赖于绘画的图形语义,因此迁移到JavaFX的层次结构不是一个选择(将其重写为本地代码/ OpenGL会更简单)。我们希望获得对PerspectiveTransform的支持,新的Canvas类看起来很有趣。

是否可以将Canvas类使用PerspectiveTransform效果并将其应用于其中的元素?

我知道我可能可以将透视图应用于整个画布,但是我只想将其应用于我正在绘制的一些元素(类似于在Java2D中应用仿射变换的方式)。

最佳答案

PerspectiveTransform只能整体应用于画布,而不能应用于Canvas内部的元素。

PerspectiveTransform效果在节点上起作用。虽然画布本身是一个节点,但是绘制到画布本身的指令不是节点。

画布允许您set an affine transform,这将应用于画布的后续绘制说明,但是透视变换是非仿射变换,因此对您没有帮助。

某些替代选项(可能适合您的情况,也可能不行):


将多个画布元素彼此叠加,并在每层上应用不同的透视变换效果(这是不方便的)。 Oracle提供canvas layering sample
在实际将它们发送到画布之前,将math for the perspective transform应用于要在画布中绘制的每个坐标。
使用true 3D surface and co-ordinates代替PerspectiveTransform提供的伪3D,然后JavaFX会为您执行正确的透视变换计算。如有必要,可以将3D表面放置在画布或其他节点顶部的SubScene图层中。


如果您有兴趣将代码从AWT / Swing Graphics2D移植到JavaFX GraphicsContext,则以下问题可能会有用:Interoperability between Graphics2D and GraphicsContext

09-28 09:29