[英]Is it possible to implement perspective transform in JavaFX?
Affine
类在JavaFX
作为扩展Transform
类而制作。
这是一种幻觉,除了仿射之外,还有一些类型的变换。
UPDATE
在JavaFX 2.x
Transform
类仅包含特定矩阵元素的getter,其中包括用于3D仿射变换的12x3x4矩阵元素。 任何类使用都只能依赖于这些元素,因此任何表示的转换都是仿射的。
这意味着2.x版本的设计很糟糕,因为基本类只能代表仿射变换,而Affine
则是它的子类。 这是错误的,因为Affine
应该成为基础课。
在JavaFX 8
Transform
类有更好的设计。 除了吸气剂之外,它还具有对矩阵元素的索引访问和矩阵类型的确定。 它还有transform()
方法,它们进行实际转换。
这意味着,该用法可以依赖于transform()
方法,也可以依赖于矩阵元素getter。
如果可以保证, JavaFX
所有内部部分都依赖于transform()
方法,那么可以扩展此类并实现透视转换。 甚至可以在JavaFX8
发布版本中JavaFX8
。
问题是:可以保证, JavaFX
仅依赖于transform()
方法吗?
是的,数学中存在非仿射变换。
不, JavaFX 2.2 Transform类不支持这些非仿射变换, JavaFX 8 Transform类也不支持这些非仿射变换。 在Transform类或其任何子类中无法设置执行非仿射变换所需的变换矩阵元素。
您可以将PerspectiveTransform应用于2D节点。 有关用法示例,请参阅我使用Java将多边形拉伸到其他多边形的答案。
要了解非仿射变换的数学,请参阅Petzold的解释 。 您可以使用类似的数学进行2D变换 。 是的,我意识到Petzold的例子不是JavaFX的例子。 但是,数学仍然成立,您可以通过PerspectiveTransform或使用自定义矩阵定义修改TriangleMesh中的点,将其应用于JavaFX。
注意,PerspectiveTransform的一个限制是拾取(鼠标选择)不起作用。 拾取将适用于已转换的TriangleMesh,但网格本身不是一般的JavaFX节点,只是一组阴影面。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.