Affine
类作为 JavaFX
中的 Transform
类的扩展。
这让人产生一种错觉,除了仿射之外,还可以有一些类型的变换。
更新
在 JavaFX 2.x
中 Transform
类仅包含特定矩阵元素的 getter,其中包括用于 3D 仿射变换的 3x4 矩阵的 12 个元素。任何类的使用都只能依赖于这些元素,因此任何表示的转换都是仿射的。
这意味着 2.x 版本的设计很糟糕,因为基本类只能表示仿射变换,而 Affine
是它的子类。这是错误的,因为 Affine
应该成为基本类。
在 JavaFX 8
中 Transform
类有更好的设计。除了 getter 之外,它还具有对矩阵元素的索引访问和对 matrix type 的确定。 .它还有 transform()
方法,可以进行实际的转换。
这意味着,该用法既可以依赖于 transform()
方法,也可以依赖于矩阵元素 getter 。
如果能保证JavaFX
的所有内部部分都依赖于transform()
方法,那么就可以扩展这个类,实现透视变换。它甚至可以在 JavaFX8
的发行版中实现。
问题是:能否保证 JavaFX
仅依赖于 transform()
方法?
最佳答案
是的,数学中有非仿射变换。
不,JavaFX 2.2 Transform 不支持这些非仿射变换类,它们也不受 JavaFX 8 Transform 支持类(class)。在 Transform 类或其任何子类中无法设置执行非仿射变换所需的变换矩阵元素。
您可以申请 PerspectiveTransform到二维节点。有关使用示例,请参阅我对 Stretching Polygon to other Polygon with Java 的回答.
要了解非仿射变换的数学,请参阅 Petzold's explanation .您可以对 2d transforms 使用类似的数学运算.是的,我知道 Petzold 的示例不是 JavaFX 示例。然而,数学仍然成立,您可以通过 PerspectiveTransform 或通过修改 TriangleMesh 中的点将其应用于 JavaFX。使用自定义矩阵定义。
请注意,PerspectiveTransform 的一个限制是拾取(鼠标选择)不起作用。拾取适用于转换后的 TriangleMesh,但网格本身不是一般的 JavaFX 节点,只是阴影面的集合。
关于java - 是否可以在 JavaFX 中实现透视变换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20108005/