简体   繁体   English

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

[英]Is it possible to implement perspective transform in JavaFX?

Affine class made as extending Transform class in JavaFX . Affine类在JavaFX作为扩展Transform类而制作。

This makes an illusion, that there can be some types of transforms, other than affine. 这是一种幻觉,除了仿射之外,还有一些类型的变换。

UPDATE UPDATE

In JavaFX 2.x Transform class contains only getters for specific matrix elements, which includes 12 elements of 3x4 matrix for 3D affine transform. JavaFX 2.x Transform类仅包含特定矩阵元素的getter,其中包括用于3D仿射变换的12x3x4矩阵元素。 Any class usage can rely only on these elements, so any represented transformation is affine. 任何类使用都只能依赖于这些元素,因此任何表示的转换都是仿射的。

This means that 2.x version has bad design, because basic class can represent only affine transforms, while Affine is made it's subclass. 这意味着2.x版本的设计很糟糕,因为基本类只能代表仿射变换,而Affine则是它的子类。 This is wrong, since Affine should be made basic class. 这是错误的,因为Affine应该成为基础课。

In JavaFX 8 Transform class has better design. JavaFX 8 Transform类有更好的设计。 Additionally to getters, it has indexed access to matrix elements and determination of matrix type . 除了吸气剂之外,它还具有对矩阵元素的索引访问和矩阵类型的确定。 Also it has transform() methods, which do actual transformation. 它还有transform()方法,它们进行实际转换。

This means, that usage can rely both on transform() methods, or on matrix element getters. 这意味着,该用法可以依赖于transform()方法,也可以依赖于矩阵元素getter。

If it can be guaranteed, that all internal parts of JavaFX rely on transform() methods, then this class can be extended and perspective transformation can be implemented. 如果可以保证, JavaFX所有内部部分都依赖于transform()方法,那么可以扩展此类并实现透视转换。 May be it even can be implemented in release version of JavaFX8 . 甚至可以在JavaFX8发布版本中JavaFX8

The question is: can it be guaranteed, that JavaFX relies only on transform() methods? 问题是:可以保证, JavaFX仅依赖于transform()方法吗?

Yes, there are non-affine transforms in Mathematics. 是的,数学中存在非仿射变换。

No, these non-affine transforms are not supported by the JavaFX 2.2 Transform class, nor are they supported by the JavaFX 8 Transform class. 不, JavaFX 2.2 Transform类不支持这些非仿射变换, JavaFX 8 Transform类也不支持这些非仿射变换。 There is no way in the Transform class or any of it's subclasses to set the transform matrix elements required to perform a non-affine transform. 在Transform类或其任何子类中无法设置执行非仿射变换所需的变换矩阵元素。

You can apply a PerspectiveTransform to 2D nodes. 您可以将PerspectiveTransform应用于2D节点。 For a usage sample, see my answer to Stretching Polygon to other Polygon with Java . 有关用法示例,请参阅我使用Java将多边形拉伸到其他多边形的答案。

To understand the math of non-affine transforms, see Petzold's explanation . 要了解非仿射变换的数学,请参阅Petzold的解释 You can use similar math for 2d transforms . 您可以使用类似的数学进行2D变换 Yes, I realize Petzold's examples are not JavaFX examples. 是的,我意识到Petzold的例子不是JavaFX的例子。 However, the math still holds and you can apply it to JavaFX through either a PerspectiveTransform or by modifying the points in a TriangleMesh using a custom matrix definition. 但是,数学仍然成立,您可以通过PerspectiveTransform或使用自定义矩阵定义修改TriangleMesh中的点,将其应用于JavaFX。

Note, a limitation of PerspectiveTransform is picking (mouse selection) doesn't work. 注意,PerspectiveTransform的一个限制是拾取(鼠标选择)不起作用。 Picking will work for a transformed TriangleMesh, but the mesh itself is not a general JavaFX node, just a collection of shaded faces. 拾取将适用于已转换的TriangleMesh,但网格本身不是一般的JavaFX节点,只是一组阴影面。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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