将矩形图像变形为不规则形状

Posted

技术标签:

【中文标题】将矩形图像变形为不规则形状【英文标题】:Deforming a rectangular image into an irregular shape 【发布时间】:2014-04-28 15:28:16 【问题描述】:

我一直在网上寻找如何将规则形状变形为不规则形状。到目前为止,我只找到了有关使事物遵循弯曲路径或类似路径的资源。

我正在寻找一个完整的形状转换。有效地将规则的矩形变成不规则的形状。我的理想目标是将其用于简单的 2D 布料模拟动画。

网络上是否有我无法找到的现有资源?或者你们有谁知道我将如何创建一种算法来处理这种变形。

我最初的猜测是按轴顺序变形我的形状,但我担心这可能会导致很多变形。有什么想法吗?

【问题讨论】:

我想我可能已经发现了如何做一些类似于我希望使用 AfflineTransform 和剪切()实现的事情。然而它仍然不能完全达到完全的效果。 docs.oracle.com/javase/7/docs/api/java/awt/geom/… 您可能应该指出您是否真的想将其应用于 图像 - 特别是,您是在谈论 BufferedImage 吗?这与布料模拟有多大关系?对于这样的模拟,您通常需要 3D 坐标,否则距离(边长)几乎没有意义(在 2D 中,您只能明智地模拟 绳索 - 即 1D 对象)。不管怎样:AffineTransforms(即使在 3D 中)的问题在于它们......嗯,仿射。他们不提供任意转换。有关背景和意图的更多信息在这里可能会有所帮助 当然,基本上,这个。 puu.sh/8r7bz.PNG 除了所有的线都是直的,而不是小曲线。这将用于我的游戏角色的布衣服。是的,这将是一系列 BufferedImages。编辑:理论上仿射变换在这个应用程序中是最现实的,因为材料不会被拉伸。 实际上,您展示的不是仿射变换,而是透视变换。仿射变换使平行线保持平行。如果有帮助,OpenCV 有一些用于执行透视扭曲的内置功能。 @LexWebb 关于链接的图像:当布料连接在两个角上时,边缘可能根本没有拉伸,那么......它将保持完美的矩形如左图!除此之外,这种模拟通常不适用于四边形的变形。通常,它们在边缘上运行,(在最简单的情况下)被建模为质量弹簧模型(en.wikipedia.org/wiki/Soft_body_dynamics#Cloth_simulation)的力。这些方法很少对三角形进行操作,以实现各向异性拉伸行为。在任何情况下,模拟都与图像无关 【参考方案1】:

是的,您可以通过将图像分成矩形(然后将每个矩形分成两个三角形)然后在为图形设置AffineTransform 后使用graphics.drawImage(..) 来实现(每个三角形的变换不同) .

我已经在这个小程序中完成了:http://nik-sergeev.com/trees.html

(如果你点开现在出现的关于Java小程序的各种警告),那么当你点击小程序中的页面或书签时,你会看到一个“翻页”的效果,就是如上所述完成的。 (这是一个应该看起来像一本书的小程序。)

任何局部仿射的映射都可以通过这种方式实现。 (这是您最关心的。)

要找到为每个三角形定义AffineTransform 的六个参数,您必须对每个三角形的三个角进行光线追踪。 (如果您不熟悉“光线追踪”,它比听起来容易得多。您只需指定点映射的位置和映射到的位置。)然后使用一些基本数学求解仿射变换参数。

【讨论】:

以上是关于将矩形图像变形为不规则形状的主要内容,如果未能解决你的问题,请参考以下文章

将不规则形状划分为递减的矩形

如何制作非矩形形状的图像

基于形态学处理的不规则形状图像的几何参数统计,包括输出面积,周长,圆度,矩形度,伸长度

不规则可点击形状的图案

裁剪不规则形状的图像

如何将图像从不规则矩形更改为矩形?