2D有机投影:Processing/GLSL下叶形平铺共形映射实现问询
2D空间叶形图案无畸变平铺的共形映射实现问题
问题背景
- 开发环境:基于Processing框架开发,可选择GLSL shader实现或矢量实现方案
- 实现目标:渲染对应参考效果,让图案铺满整个2D空间(或覆盖大尺寸显示区域),将重复纹理映射到通用叶形轮廓上
- 硬性约束:叶形区域内部需支持UV坐标用于叠加重复图案,坐标变换必须为共形映射(conformal map),否则图案会出现可见畸变
- 核心疑问:是否存在可将屏幕XY坐标直接投影到目标位置的函数,实现预期的图案映射效果?
已尝试的未达预期方案
- 递归法
- 实现逻辑:先将平面切分为条带,再把条带切割为上下边缘贴合条带边界的叶形,最后递归将叶形对半拆分,直到呈现足够的自然随机性;只要条带边界不在屏幕可视范围内,接缝就不会过于明显
- 现存问题:无法有效避免图案畸变
- Voronoi法
- 实现逻辑:尝试寻找受向量场引导的距离函数,让生成的Voronoi图符合预期的叶形排布效果
- 现存问题:很难实现所需的UV映射;可接受畸变不明显的良好近似方案,不需要完全精确的结果
- 直接投影法
- 实现逻辑:查阅资料得知连续复函数可作为共形映射,但未能基于该思路完成落地实现
- 补充诉求:除上述思路外,需要完整可行的解决方案,或未被考虑到的新思路参考
可行实现方案
方案1:复变函数共形映射方案(shader友好,严格无畸变)
共形映射的核心性质是保持局部角度不变,复变解析函数天然满足共形要求,针对叶形(双圆弧闭合类透镜轮廓)的平铺需求,可通过Schwarz-Christoffel映射结合周期平移实现:
- 基础映射单元:取单位正方形
[0,1]×[0,1]作为标准UV空间,通过Schwarz-Christoffel变换将正方形映射为单个叶形轮廓——叶形的两个尖点对应正方形上下边中点,圆弧边缘对应正方形左右边,该映射为严格共形映射。映射的积分系数可提前预计算为查找表,不需要在shader中实时运行复杂积分逻辑。 - 周期平铺逻辑:将屏幕坐标
(x,y)先做模1运算得到基础单元坐标,再对相邻单元通过哈希值生成随机偏移,模拟自然随机的叶形朝向、大小微调;共形映射叠加缩放、旋转变换后依然保持共形性,这类微调不会引入畸变。 - GLSL实现提示:可直接将二维坐标作为复数
z = x + i*y做运算,映射函数形式为f(z) = integral( 1/sqrt((z² - a²)(z² - b²)) )dz,调整积分常数匹配目标叶形的长宽比即可。
方案2:保角三角网格矢量方案(Processing原生友好,性能更高)
如果不需要严格数学意义上的共形,只要畸变控制在人眼不可察的程度,可采用预计算保角网格的方案,实现成本更低:
- 先绘制单个叶形的矢量轮廓,在轮廓内部生成均匀三角网格,通过LSCM(最小二乘共形映射)算法提前将网格顶点坐标和单位正方形UV做一一对应,导出为顶点-UV映射表。
- 平铺时直接在Processing中按网格排布叶形实例,每个实例通过哈希值生成随机旋转、等比缩放参数,采样重复图案时直接查询预计算的UV表即可,不需要实时计算映射关系。
- 接缝处理:相邻叶形的边缘顶点做1-2像素的位置融合,即可完全隐藏拼接缝隙。由于三角网格UV是提前计算的保角映射,内部图案不会出现拉伸畸变。
方案3:优化递归分块方案(实现成本最低)
原有递归法仅需补充保角校正步骤即可解决畸变问题:
- 保留切分条带、切割叶形、递归拆分的原有逻辑,每一次拆分叶形时,放弃线性坐标切割方式,对拆分后的两个子叶形分别做局部相似变换(仅包含平移、旋转、等比缩放操作)匹配父叶形边缘。
- 所有坐标变换全程禁用非等比缩放、切变操作,从根源上避免角度畸变——共形映射的局部等价于相似变换,只要拆分全程保持局部变换为相似变换,整体就不会出现可见的图案拉伸。
- 条带边界处做1-2像素的渐变过渡,即可完全隐藏接缝。
内容的提问来源于stack exchange,提问作者Cadeyrn
相关产品推荐
相关产品推荐

