将矩形图像变形为不规则形状
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
的六个参数,您必须对每个三角形的三个角进行光线追踪。 (如果您不熟悉“光线追踪”,它比听起来容易得多。您只需指定点映射的位置和映射到的位置。)然后使用一些基本数学求解仿射变换参数。
【讨论】:
以上是关于将矩形图像变形为不规则形状的主要内容,如果未能解决你的问题,请参考以下文章