问题标签 [procedural-generation]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
2247 浏览

java - 排列地形块(菱形算法)

我正在编写一个使用 Minecraft-esque 块的地形引擎。使用Diamond-square 算法单独生成块。

问题是这些块没有排列,它们是完全分开的。我已经尝试了很多事情来让他们这样做,但到目前为止,没有任何事情能起到应有的作用。

编辑:另外,我试图创造的世界不是无限的;它生成一个 33x33 的块数组,每个块都有一个由另一个菱形正方形生成器分配的全局高度值。

有没有一种(简单的,最好的)方法来修改菱形引擎以使块对齐?

0 投票
2 回答
4545 浏览

opengl - 在顶点着色器中置换顶点

我的代码创建了一个包含许多顶点的网格,然后将它们替换为顶点着色器中高度的随机噪声值。移动使用

工作正常,但这意味着你可以一直走到网格的边缘。

我考虑将相机位置发送到着色器,并让整个位移被它抵消。因此最终的顶点着色器代码:

编辑:我修复了一个缺陷,顶点本身不应该水平位移。

但是由于某种原因,当我运行它并更改相机位置时,屏幕闪烁但没有任何移动。顶点正确地被噪声值置换,着色和一切正常,但置换不移动。

作为参考,这里是 git 存储库:https ://github.com/Orpheon/Synthworld

我究竟做错了什么?

PS:“闪烁”是错误的。就好像在某些位置它不绘制任何东西,而在其他位置它从位置 0 绘制正常场景,所以如果我不停地移动它会闪烁。我可以停在它保持黑色的地方,或者在它保持正常的地方。

0 投票
1 回答
351 浏览

android - Android - 根据周围的瓷砖确定瓷砖位图

我一直在研究基于图块的地形生成系统,但遇到了一些障碍。我希望创建一系列过渡瓷砖来标记水和陆地之间的过渡,并且无法找出一种有效的方法来确定哪个瓷砖应该是哪个瓷砖。

我的第一次尝试(如下图所示)基本上将通过一系列 if 语句运行每个图块,以确定它应该是哪个图块。这样做的主要问题是,对于 100 块 x 100 块的世界地图,它将运行 10,000 次迭代,访问 8 个周围块上的数据(80,000 次操作),然后运行多达四个 if 语句(320,000操作)。在我看来,这将是非常低效和缓慢的。

这种方法的好处是它只能在陆地单元格上运行,并且会首先检查以确保它与至少一个水单元格相邻,这将大大减少所需的操作次数。

这是我绘制的基本图表,它遍历周围的瓷砖并挑选出合适的瓷砖。

尝试 1 布局

我的第二个想法是基本上开始穿过瓷砖,一旦我碰到沿海瓷砖,就沿着两个方向沿着海岸走,边走边分配瓷砖。此方法将确保在开始之前尚未计算出图块。这样做的问题是,一,我无法弄清楚它是如何工作的,二,结果我不知道它的效率有多高。

一位朋友告诉我第三种可能有效的方法。它获取水瓷砖并将它们设置为 0,将它们设置为 1。然后,它获取周围的瓷砖并将它们从 1 到 9 编号。从那里遍历它们并在 0 和 1 上创建一个字符串:

将是:000011111

0*2^0 + 0*2^1 + 0*2^2 + 0*2^3 + 1*2^4 + 1*2^5 + 1*2^6 + 1*2^7 + 1* 2^8

0*1 + 0*2 + 0*4 + 0*8 + 1*16 + 1*32 + 1*64 + 1*128 + 1*126 = 496

理论上,我会为与该组合关联的图块分配数字 496 并加载它作为响应。问题是每条边都有 13 或 14 种组合,这会导致它的使用。例如:

从本质上讲,要使这种方法起作用,我必须找出会导致特定瓷砖的每种可能的水和土地组合的最终数字,然后通过一系列 ifs / case 运行最终数字以挑选出适当的位图。这将与 if 块一样或更多低效。

因此,在所有这一切中提出实际问题。有谁知道这样做的另一种方法,或者使这些方法中的任何一种更有效的方法?

0 投票
1 回答
661 浏览

graphics - 从不可平铺的 3D 纹理生成可平铺的 2D 纹理

我正在开发一个用于程序纹理生成的库(https://github.com/mikera/clisk),它开始很好地融合在一起。

我现在正在尝试找出制作可平铺 2D 纹理的好方法。

一种似乎可行的方法是将 (0,0) - (1,1) 2D 纹理空间映射到 3D 纹理内的表面上,使表面连接左边缘和右边缘以及顶部和底部边缘纹理(例如圆环)。这样做,应该确保 2D 纹理是自动平铺的。

由于我已经拥有良好的(不可平铺的)3D 纹理(柏林噪声、分形噪声等),这似乎是允许从任意 3D 纹理创建可平铺 2D 纹理的好方法。

所以我的问题:

  • 这是一种有效的技术吗?
  • 如果是这样,我应该映射到什么样的表面以最大限度地减少扭曲/获得好看的平铺效果?
  • 有什么需要注意的陷阱吗?
0 投票
2 回答
1650 浏览

haskell - 如何从 Haskell 中的复杂或复合分布中采样?

我正在尝试为 Haskell 中的假设行星生成随机质量。我想通过对双峰分布(理想情况下是两个正态分布的叠加:一个对应于小行星,一个对应于气态巨行星)进行采样来产生这些质量。我查看了统计包,它提供了quantile可以将一个均匀分布Double变成一个Double对多个分布的函数。但似乎没有任何支持编写发行版。

这种特殊情况可以通过选择一个分布或另一个分布来预先采样,但我想用一个分布来做,特别是因为我以后可能需要调整整体分布。最终,我可能会用来自天空调查的真实数据代替正态分布。

我正在考虑自己实现拒绝抽样,它可以相当简单地处理任意分布,但它似乎效率很低,如果解决方案已经作为库存在,那么实现它肯定不是一个好主意。

是否有支持从组合或明确指定的分布中采样的 Haskell 库?还是现有的拒绝抽样的 Haskell 实现?或者,是否有一个明确的公式来计算两个正态分布之和的 CDF 的倒数?

0 投票
1 回答
3712 浏览

php - 循环通过描述螺旋的公式以生成 XY 坐标

我正在尝试以 xy (2D) 坐标的形式生成一个螺旋星系——但数学不是我的强项。

我从一个关于螺旋的优秀来源收集了以下内容:

对于最简单的螺旋,即阿基米德螺旋,半径 r(t) 和角度 t 成正比。因此等式是:

(3) 极坐标方程:r(t) = at [a 为常数]。
由此得出
(2) 参数形式:x(t) = at cos(t), y(t) = at sin(t),
(1) 中心方程:x²+y² = a²[arc tan (y/x) ]²。

这个问题有点涉及星系的生成,但是对于我需要的东西来说,答案是分散的并且仍然过于复杂(又名,我的数学愚蠢的头脑无法理解它们)。

本质上,我需要做的是在 PHP 中循环一个螺旋公式 ~5000 次,以在 513x513 XY 网格上生成点。网格的大小和所需的点数将来可能会发生变化。更好的办法是将这些点与螺旋的起源进行权衡,包括频率以及它们偏离精确数学公式的距离,类似于星系的实际外观。

这篇数学论文讨论了一个描述螺旋星系结构的公式

让我完全迷失的是如何将数学公式转换为我可以在 PHP 中循环的东西!

0 投票
3 回答
249 浏览

javascript - 我需要一个将两个坐标映射到 0 到 1 之间的伪随机值的 javascript 函数

其他要求:

  • 函数的输入是两个数字,不一定是整数

  • 速度是主要问题;它应该尽可能快

  • 不必是安全的,只要它的输出看起来足够随机。

例子:

编辑 澄清:输出值应该是确定性的,但看起来是随机的。

0 投票
3 回答
71755 浏览

c# - 随机 2D 瓦片地图生成算法

谁能告诉我一种像我的世界那样生成岛屿结构或山丘结构的方法?

我只是在寻找一个合适的理论来生成随机形状,但它应该保持一个定义的基本模式..

像:岛屿应该是圆形的,但形状和规模会有所不同(最小/最大宽度和高度)。

或者:河流不应该是直线,它们应该有曲线和随机宽度。

甚至:生成某种森林,其中树木以用户仍然可以穿过森林的方式放置(我认为这是一个简单的方式,只是说如果代码尝试放置树周围的一些块应该保持空白最后一棵树周围有更多树)

我可以用什么样的数学来做这些事情?

我会很高兴有一些教程或参考链接。我在网上搜索了几个小时,但我只能找到一些可以买的书,比如“游戏数学”之类的书,但我的预算设置为零。

编辑:

首先,我很抱歉我的英语不好。

第二,我要感谢大家的回答。这些都是很好的参考资料,我会花很多时间来深入了解。

0 投票
4 回答
1587 浏览

java - java多线程性能扩展

你能给我解释一下这个废话吗?我有一个基本上用数学运算填充数组的方法。不涉及 I/O 或任何东西。现在,这个方法运行大约需要 50 秒,并且代码是完全可扩展的(理论上 100%),所以我把它分成 4 个线程,等待它们完成,然后重新组装 4 个数组。现在,我在四核处理器上运行程序,预计需要大约 15 秒,而实际上需要 58 秒。没错:它需要更长的时间!我看到 cpu 工作 100%,我知道每个线程执行 1/4 的计算,创建线程和重新组装数组总共需要大约 1-2 毫秒。是什么导致了这种性能损失?这段时间cpu到底在做什么?代码: http: //pastebin.com/cFUgiysw

0 投票
2 回答
304 浏览

c# - 如何删除此网格中的多余图块?

我正在开发基于图块的 2D 游戏,并且地图生成存在小问题。

一般概念是它默认创建一个房间,然后在任何现有房间的基础上构建,直到构建了 X 个房间或 Y 次尝试失败。

我遇到的问题可能很简单,我只是想不通,但是我将如何去除带圆圈的瓷砖?生成的每张地图都是程序性的,所以我不知道什么时候会出现像圆圈那样的点,我可以很容易地用我的眼睛发现它们……我只是想不出一种在地图之后处理它们的包罗万象的方法已经生成。

目标是永远不要在不需要的地方加倍墙壁。我不想改变地图的生成方式,而是在事后修改它。我也不想失去房间或类似的角落。

我真的觉得我正在尝试做的事情会在图像编辑或类似领域有一个名字,但这肯定不是我的强项。

描述的图像