JavaFX能否实现透视变换?

3

Affine类是作为JavaFXTransform类的扩展而创建的。

这使人产生一种错觉,认为除了仿射变换之外还可能有其他类型的变换。

更新

JavaFX 2.x中,Transform类仅包含特定矩阵元素的getter,其中包括3D仿射变换的3x4矩阵的12个元素。任何类的使用都只能依赖这些元素,因此任何表示的变换都是仿射的。

这意味着2.x版本的设计有缺陷,因为基本类只能表示仿射变换,而Affine是它的子类。这是错误的,因为Affine应该成为基本类。

在JavaFX 8中,Transform类的设计更加优秀。除了getter之外,它还可以访问矩阵元素的索引和确定矩阵类型。此外,它还有transform()方法,可以进行实际的转换。
这意味着,使用可以依赖于transform()方法或矩阵元素的getter。
如果可以保证JavaFX的所有内部部件都依赖于transform()方法,那么可以扩展此类并实现透视变换。甚至可以在JavaFX8的发布版本中实现它。
问题是:可以保证JavaFX仅依赖于transform()方法吗?
1个回答

3
是的,在数学中有非仿射变换。
不,这些非仿射变换不受JavaFX 2.2 Transform类支持,也不受JavaFX 8 Transform类支持。在Transform类或其任何子类中,没有设置所需的变换矩阵元素来执行非仿射变换的方法。
您可以将PerspectiveTransform应用于2D节点。有一个使用示例,请参见我对Stretching Polygon to other Polygon with Java的答案。
了解非仿射变换的数学,请参阅Petzold的说明。您可以使用类似的数学方法进行2D变换。是的,我意识到Petzold的示例不是JavaFX示例。然而,数学仍然成立,您可以通过透视变换或通过使用自定义矩阵定义修改TriangleMesh中的点来将其应用于JavaFX。
请注意,透视变换的一个限制是选择(鼠标选择)无法正常工作。对于经过变换的TriangleMesh,选择将起作用,但网格本身不是通用的JavaFX节点,而只是一组着色面。

1
如果我无法扩展Transform以获得非仿射变换,那么在JavaFX中类层次结构就是错误的,对吗?他们应该将Affine作为基类,其他类作为子类。 - Suzan Cioc
我认为这个层次结构是正确的。以Transform作为基础,未来(例如Java 9)的版本可以使用NonAffineTransform子类扩展Transform,但如果Affine是根,则这没有意义。 - jewelsea
那么,将“Transform”扩展到某些非仿射变换是可能的吗? - Suzan Cioc
您可以将Transform扩展到非仿射变换,但是,除非重新编码,其他JavaFX组件(例如渲染引擎)将不知道在自定义变换中公开的额外非仿射元素,并因此不使用它们。 - jewelsea
那么,其他JavaFX库部分与“Transform”类的一般性质不一致?它们期望它是仿射的吗? - Suzan Cioc
JavaFX 2.2中的Transform类没有提供API(getter)来获取非仿射矩阵元素 - 无法编写现有组件以使用它们无法获取的元素。您可以扩展Transform以添加非仿射元素的getter,但是没有任何东西知道调用您的额外getter,因此它们将被忽略。 - jewelsea

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接