Hacker News 中文摘要

RSS订阅

使用波函数坍缩构建程序化六边形地图 -- Building a Procedural Hex Map with Wave Function Collapse

文章摘要

这篇文章介绍了一种利用波函数坍缩算法生成程序化六边形地图的方法。作者受到童年桌游启发,开发了一个能自动生成包含道路、河流、森林等元素的随机中世纪岛屿地图系统。该系统使用WebGPU技术,由4,100个六边形单元组成,生成时间约20秒,每个地图都独一无二但具有确定性。

文章总结

使用波函数坍缩算法构建程序化六边形地图

作者 Felix Turner 开发了一个基于波函数坍缩算法(WFC)的六边形地图生成器,能够创建包含道路、河流、海岸线等元素的程序化中世纪岛屿世界。该项目使用Three.js WebGPU和TSL着色器构建,包含约4,100个六边形单元,生成时间约20秒。

核心算法:波函数坍缩

WFC算法灵感来源于桌游《卡卡颂》,通过以下步骤工作: - 初始状态:每个单元包含所有可能的瓦片状态(30种类型×6种旋转×5种海拔) - 坍缩过程:选择约束最多的单元,随机确定其状态 - 传播:根据相邻单元边缘匹配规则消除冲突选项 - 循环:重复上述步骤直到所有单元确定或失败

技术挑战与解决方案

  1. 多网格问题

    • 将大地图分解为19个六边形子网格独立求解
    • 开发三层恢复系统处理边界冲突:
      • 解除固定约束
      • 局部WFC重解边界区域
      • 使用山脉瓦片掩盖无法解决的缝隙
  2. 三维高程系统

    • 5级海拔系统带来额外复杂性
    • 道路和河流需要正确连接不同海拔的瓦片
  3. 视觉效果优化

    • 水体效果:海岸波浪、水面闪光
    • 后处理管线:环境光遮蔽、景深模糊、晕影和胶片颗粒
    • 动态阴影映射:根据视角调整阴影精度

性能优化

  • 使用BatchedMesh实现单次绘制调用渲染整个网格
  • 共享材质减少GPU状态切换
  • Web Workers多线程处理WFC计算
  • 最终实现4,100+单元60FPS流畅渲染

创作工具与素材

  • 使用Blender制作补充瓦片资产
  • 基于KayKit中世纪六边形资源包扩展
  • 采用Three.js r183 + WebGPU渲染器
  • TSL着色语言实现自定义效果

该项目展示了如何将算法生成与艺术设计结合,创造出既具有数学严谨性又富有视觉吸引力的程序化世界。读者可以通过在线演示体验,或查看GitHub源码

评论总结

总结评论内容:

  1. 赞赏与喜爱(多数观点):
  • 对工程技巧的欣赏:"Real engineering skills, I love it." (gedy)
  • 对视觉效果和细节的称赞:"Super awesome, love the tilt-shift camera effect!" (kevinsync)
  • 整体正面评价:"This looks amazing man, seriously good job with this." (nickandbro)
  1. 技术建议与讨论:
  • 性能优化建议:"did you consider using bitfields for the superposition state...the speedup was incredible" (jesse__)
  • 算法改进建议:"Algorithm X should...be able to solve...with a higher success rate" (porphyra)
  • 相关技术参考:"this site has a lot of good examples of hex math" (schemathings)
  1. 相关项目比较:
  • 与Dorfromantik游戏相似:"Reminds me of Dorfromantik" (tomtomistaken)
  • 与Hytale Worldgen比较:"Related (?) has anyone else been following the Hytale Worldgen v2?" (verdverm)
  • 与Townscaper技术关联:"Oskar Stålberg used wave function collapse for various games" (rhdunn)
  1. 批评与质疑(少数观点):
  • 怀疑AI生成内容:"This entire article reads like it was fully written by AI" (moi2388)
  • 认为内容过于简化:"The post glosses over the 'backtracking'" (porphyra)
  1. 功能建议:
  • 增加交互性:"Curious if you plan on keep it as a map generator or turn it into something more interactive" (behnam_amiri)
  • 参数调整建议:"Consider exposing some of the weight knobs" (btbuildem)
  1. 学术与技术背景:
  • 算法理论讨论:"Model synthesis...is a family of constraint-solving algorithms" (westurner)
  • 不同实现方法比较:"One of the differences...lies in the decision of which cell to 'collapse' next" (westurner)

注:所有评论均未显示评分(None),因此无法根据认可度排序。总结中尽量保持了不同观点的平衡,并选取了具有代表性的原始评论引用。