受约束景观的程序生成

2024-03-29

我想实现地形的程序生成。 经过彻底的研究后,我得出的结论是,应该使用梯度(相干)噪声生成算法之一来实现,例如 Perlin 噪声算法。 然而,我不希望生成是完全随机的。我想应用一些限制(例如哪里应该是山脉,或者哪里应该是低地等)。

问题:

例如,我有一条代表某些景观元素的曲线。曲线是点的数组。

  • 我怎样才能改进柏林噪声算法,以便沿着这个 曲线噪声将有一个首选的值范围(或者,对于 简单性,值 0)?
  • 或者,如果我有一个纹理 Perlin Noise 算法的输出(二维数组),我该如何转换它 到所需的噪声(受曲线影响)?

如何改进 Perlin 噪声算法,以便沿着这条曲线,噪声将具有首选值范围(或者,为了简单起见,值 0)?

这可以通过简单的变换地图中的每个像素来实现p -> f(p)数学函数。

考虑一个函数,它将紫色线映射到蓝色曲线 - 它强调较低的定位高度以及非常高的定位高度,但使它们之间的过渡更陡峭(这个例子只是一个余弦函数,使曲线不太平滑会使的转变更加突出)。

您也可以只使用曲线的下半部分,使峰值更尖锐,位置较低的区域更平坦(因此更具可玩性)。

曲线的“锐度”可以通过功率(使效果更加显着)或平方根(降低效果)轻松调节。

其实现实际上非常简单(特别是如果您使用余弦函数) - 只需在地图中的每个像素上应用该函数即可。如果该函数在数学上不是那么简单,则查找表可以正常工作(在表值之间进行三次插值,线性插值会产生伪影)。

(从我的回答复制到另一个问题 https://stackoverflow.com/questions/14006238/tweaking-heightmap-generation-for-hexagon-grids/14009833#14009833)

如果您需要的只是将生成的噪声转换为已知的值范围(例如 -1.0 - 1.0),请使用以下算法:

function scaleValuesTo(heightMap, newMin, newMax)
{
    var min = min(heightMap);
    var range = max(heightMap) - min;
    var newRange = newMax - newMin;

    for each coordinate x, y do:
        hrightMap[x, y] = newMin + (heightMap[x, y] - min) * newRange / range;
    end for
}

我想应用一些限制(例如哪里应该是山脉,或者哪里应该是低地等)。

这有点复杂,因为您需要指定山脉的位置。最简单的解决方案是使用所需地形的大致形状创建一个单独的高度图(您可以按程序执行此操作或从位图加载它,这并不重要),然后将其与噪声图添加在一起。有几点需要记住:

1) 确保模板地图上没有尖锐的边缘(这些边缘在组合地图上非常明显)。框模糊通常足以达到此目的,尽管像高斯模糊这样更复杂的过滤器可以提供更好的结果(在某些情况下,框模糊会保留地图上的一些锐利边缘)。

2) 您可能希望在较高海拔处给予噪声图较高的优先级,而在较低海拔处给予较低的优先级。这可以通过执行以下操作轻松实现:combinedMap[x, y] = templateMap[x, y] + (0.2 + 0.8 * templateMap[x, y]) * noiseMap[x, y].

您可以在此图中看到这种方法:

(这是我为自己做的地形生成项目 https://code.google.com/p/geogen/)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

受约束景观的程序生成 的相关文章

  • 如何在 MATLAB 中可视化如图所示的体积数据?

    我的问题非常简单 我有一堆矩阵 所有矩阵都相互堆叠起来 这样我就有了大量的数据 我想可视化这些数据 如下图所示 在我看来 需要一定程度的透明度 这可能与每个体素的值有关 也就是说 值越高 体素对其后面的事物越不 透明 我不知道如何开始 这是
  • 使用四元数进行 OpenGL 旋转[重复]

    这个问题在这里已经有答案了 因此 我正在编写一个程序 其中对象以 spacesim 方式移动 以便学习如何在 3D 空间中平滑地移动对象 在对欧拉角进行了一番研究之后 它们似乎并不真正适合任意方向上的自由形式 3D 运动 因此我决定继续使用
  • 从绘图 3d 图中抓取相机位置

    我正在绘制 3D 图形并想要调整相机位置 对我来说最好的方法是使用查看器 根据需要缩放和旋转场景 然后以 JSON 形式获取相机位置并将其放入我的脚本中 该脚本生成图片以默认实现相同的位置 根据这条推文 https twitter com
  • WP7 XNA 显示 3D FBX 模型

    我只是初学者 很抱歉我的愚蠢问题 我的模型看起来像这样 http img265 imageshack us img265 8291 clipboard01ap jpg http img265 imageshack us img265 829
  • 是否可以在 Netbeans 7.0 应用程序中使用 Jzy3D?

    好吧 我们正在尝试将 3D 散点图合并到 Netbeans 7 0 中的项目中 我们选择测试的库之一是 Jzy3D 看起来它会做我们需要它做的一切 但不幸的是 它什么也没做 我已经正确安装了 JOGL 并对其进行了测试 发现它可以正常工作
  • Blender 与 Unity [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 使用 CSS3 在文本上创建双色锐渐变

    我需要为我正在构建的网站上的标题和导航文本创建 锐利 渐变 我正在尝试使其尽可能纯 HTML5 CSS3 并且愿意坚持使用 font face而不是转移到Cufon 我所说的锐渐变是指两种颜色 两者之间没有混合 例子 http dl dro
  • Python 中的标量场可视化

    我需要在 Python 中可视化几个重叠的标量场 我发现mayavi图书馆做这种情节 问题是我不明白如何为标量字段自定义颜色图 我的想法是为每个字段设置一种颜色的阴影 我尝试采用一个例子 http docs enthought com ma
  • 给定 3D 空间中的一条线,如何找到从它到一点的角度?

    我在 3D 空间中有两组点 我想画一条穿过两组点的中心的线 然后找到从该线到每个点的角度 从那里开始 我将根据两个角度的接近程度来确定两组中的匹配点 我知道如何找到每组点的中心 只需将它们平均在一起 并且我知道如何将它们匹配 甚至考虑到它们
  • 对一系列点重新采样

    我有一个 3d 点数组 想象一下球的轨迹 有 X 个样本 现在 我想对这些点重新采样 以便我有一个新数组 其中包含 y 个样本的位置 y 可以大于或小于 x 但不能小于 1 始终至少有 1 个样本 将原始数组重新采样为新数组的算法会是什么样
  • Android“高级”渐变 - “拇指”位置?

    我正在尝试创建一个渐变绘图来描绘某物的比例 作为一般示例 假设您正在查看包含车队的列表视图 背景可以是电量计 我不想要平滑 宽阔的过渡 我想要一个非常紧密的过渡 并且我希望能够设置过渡发生的位置 这就是我正在盯着的东西 但我还没有走得太远
  • 如何在Android中渲染OBJ或FBX? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我有几个 obj 和 fbx 格式的 3D 对象 其中包含 mtl 和纹理文件 我想知道哪个是在 An
  • 3D 游戏的 Libgdx 渲染层

    在我的第一个 3D 游戏中 我现在想要渲染地板 它实际上是一个平面 不是 libgdxPlane on y 0 我想添加一个Texture到它 这样我就可以在每个级别有不同的楼层 现在我的问题是 创建和渲染这种纹理地板的最佳方法是什么 我考
  • 可点击的精灵标签?

    我一直在玩精灵文本标签 更具体地说是这个例子 http stemkoski github io Three js Sprite Text Labels html http stemkoski github io Three js Sprit
  • OpenGL Z 偏置(多边形偏移)限制

    我有两个共面的多边形 我尝试做 glEnable GL POLYGON OFFSET FILL glPolygonOffset 0 1 并期望其中一个明显 位于 另一个之上 这种情况直到大约 70 75 个单位之外 近剪裁平面为 1 远剪裁
  • 用渐变色绘制一个 D3 圆

    如何用渐变颜色画一个圆 比如说 从黄色到蓝色的渐变 通常 要创建黄色圆圈 我们可以使用以下代码 var cdata 50 40 var xscale 40 var xspace 50 var yscale 70 var svg d3 sel
  • 如何将 3D 图像输出到 3D 电视?

    我有一台 3D 电视 如果我不至少尝试让它显示我自己创作的漂亮 3D 图像 我就会逃避我的责任 作为一个极客 我之前已经完成了非常基本的 OpenGL 编程 因此我了解所涉及的概念 假设我可以为自己渲染一个简单的四面体或立方体并使其旋转一点
  • 光线追踪三角形

    我正在用java编写一个光线追踪器 并且我能够追踪球体 但我相信我追踪三角形的方式有问题 据我了解 这是基本算法 首先确定射线是否与plane三角形已打开 剪裁所有点 使它们与三角形位于同一平面上 因此xy以平面为例 根据沿着新平面向任意方
  • 用顶点之间的渐变填充 matplotlib 多边形

    我正在使用 matplotlib 的 Poly3DCollection 绘制多边形 三角形 的集合 三角形位于具有与其关联的颜色的顶点之间 我目前正在用通过平均三个顶点的颜色确定的纯色填充每个三角形 绘制三角形以形成 3D 表面网格 I w
  • Android 创建类似 iphone 的渐变

    我需要在我的 Android 应用程序中创建类似黑色 iphone 的渐变 请查看下图中顶部的黑色渐变 怎么做 谢谢 也许是这样的

随机推荐