繁体   English   中英

是否可以在JavaFX中实现透视变换?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM