慢速道路:TL; DR

慢速道路是我在程序上生成无限,风景秀丽的景观的实验,被包装为休闲驾驶游戏,并内置在JavaScript中以在浏览器中运行。

亲自见slowroads.io

实际上,最后一部分被证明是真正的实验。当我在一些详细的帖子上工作以准确描述所有功能的工作原理,但这是关键组件的简要删除:

生成高度图

  • 使用类似于Perlin噪声的算法生成无限瓷砖高度图,并进行了修改以实现更真实的山坡。
  • Alea被用作可复制世代的PRNG。

路由道路

  • 选择了一个起点不太陡峭(并且不太深)。这是道路中线的第一点。
  • 选择了方向,并测试了周围的高度图,以横向和纵向评估梯度。
  • 然后,中线向最小化陡度的方向移动10米。点编码在双连接的列表中,每个列表都用元数据(例如梯度,道路宽度和曲率)注释。
  • 这是永远的重复(由距车辆位置15公里的地平线界定),小心不要自私(扰流板:这是最长的解决方案)。
  • 中线点的高度通过9点窗口追溯平滑,以避免高程突然急剧变化。
  • 在短范围内,使用二次Bezier曲线以1m分辨率的平滑点注释粗糙的10m中线。
经常被困在这样的半岛上,这是第一个线索,这是需要全面的回转机制

渲染环境

  • 大型粗网格(我选择了10m的分辨率,最大视图距离1公里平方)的5x5网格用于渲染大型场景。这是“遥远的网格”。
  • 为了靠近道路,沿着路中线行进了一个5x5的细网格,每个10m平方与遥远的网格网格都与遥远的网格网格一起,形成了一个详细的“走廊”。这是“近网格”,并从车辆位置前进到固定的地平线。
  • 同时,远处网格的现在被拼小的顶点被“隐藏”,通过将它们下方下方下沉几米来“隐藏”。
  • 使用靠近道路中线,近乎网格的高度在道路高度和基础环境的高度之间进行了插值,以进行无缝过渡。
  • 额外的3x3网格静态瓷砖(也是10m平方)将生成较短的地平线,以获取额外的细节。这些重叠(和位移)中等详细的瓷砖从上一步中进行了重叠。betway娱乐官网
  • 这条路被渲染为一个简单的矩形网,由3个高尾块和9个低尾块,每块100m,随着车辆的进行,每圈循环100m。
由于所涉及的曲率,这种布置并非完全无缝,但是通常,由于叶子被叶子隐藏,或者由于基础远处的几何形状而无法引起人们的意义

图形

  • 地面纹理使用世界坐标紫外线,与Perlin噪声混合以使草颜色变化。
  • 基于陡度,将悬崖的脸部质地混合在一起,并带有顶点位移。
  • 我在实施动态影子映射时接受了失败,而是让所有照明都是自上而下的,以简单起见。在叶子图下应用了深色纹理,以给人以树阴影的印象。
  • 我用略微调整的参数重复使用了高度图算法,以产生一个模糊地跟随高程的树地图,从而在湖泊周围提供更多树木。
  • 所有叶子均由简单的精灵和实例几何形状组成,其中多种变体在一个纹理中使用噪声在顶点着色器中采样
地面使用单个着色器,混合悬崖,沙子,两个草质地,刷子纹理(在这种情况下为希瑟)和森林地板。将树图作为离散密度从0–3给出,以决定给定的10x10单元格中呈现多少树。

物理

  • 每个车轮的动力学都可以独立计算,该动力学使用了重力,表面摩擦和正常地面的通常运动学方程。因此解决了底盘位置。
  • 墙壁作为道路中线的注释存在,这是一个简单的浮点,表明墙壁与中线的距离。然后,碰撞成为距离检查。
  • 就目前而言,与其他任何事物的碰撞被忽略;在树上折断的东西没有什么禅意…

优化

  • 最大的节省来自融合近网格的几何形状,并精心管理实例大小以最大程度地减少拨打电话。
  • 不断跟踪车辆的进度与道路中线,并检查了环境可见性。车辆后面的物体被绝望并汇总为重复使用。
  • 中线路径的先知意味着未来的几何形状和诸如道路标志之类的细节可以在展示之前很早就处理,从而使其具有更高的生成编排。
  • 少数图书馆方法(例如边界球或正常计算)已被覆盖或避开在生成过程中可以解决的地方。
  • 几乎所有记忆都被解释并重新使用,尽管这是一个改进的领域。
  • 任何不严格需要从曾经生成的池中样本的独立随机(例如特定树的旋转)的情况。
  • 最后的手段是提供一系列质量设置,以迎合不同的系统(例如通过禁用叶子,或从粗大的网格而不是高度图查询中查找高度。

让我知道我可能希望在这里跳过哪些元素。如果您想看到完整的Shebang,可以在这里或继续关注我推特

- -

- -

获取中型应用betway娱乐官网

一个说“在应用商店上下载”的按钮,如果单击,它将带您到iOS App Store
一个说“获取它,Google Play”的按钮,如果单击它,它将带您到Google Play商店
安斯洛

创意开发人员在设计和计算机科学之间的空间中迷失了方向。

Baidu