Articles of 单纯形噪声

为什么我的Simplex Noise出现在四列?

我试图用单纯的噪音来制作一个Texture ,但是不管大小是多less,都会像这样一直出现: 以下代码用于生成图像的颜色date: private Color[,] GetSimplex() { Color[,] colors = new Color[800, 600]; float scale = colors.GetLength(0); for (int x = 0; x < 800; x++) { for (int y = 0; y < 600; y++) { byte noise = (byte)(Noise.Generate(x / scale, y / scale) * 255); colors[x, y] = new Color(noise, noise, noise); […]

1D单纯形噪声返回相同的一代

我一直在使用一维单纯形噪声来创建一个随机的世界表面,并使用相同的表面地形来生成一些细微的变化。 这是我的示例代码 – Tile[][] tiles = new Tile[rows][]; for (int i = 0; i < rows; i++) { tiles[i] = new Tile[cols]; for (int x = 0; x < cols; x++) { tiles[i][x] = new Tile(0, new Vector2(x, i), scale); } } int left = Main.rand.Next(rows / 4, rows / 2); double seed = Main.rand.NextDouble(); […]

数组的确定性混洗

我无法find答案,所以我在这里问,我已经做了一个体素引擎,它的工作相当好,除了一个小的细节:我还没有弄清楚如何播种我的单工噪音引擎,互联网给了我两个建议: 用第四个轴作为种子,生成一个更高维的单纯形,这种方法很有效,但是比较起来却很痛苦。 洗牌排列表,我喜欢这个想法。 它应该(如果我的理解math是正确的)产量512! 排列,但是我不知道如何以确定的方式可靠地洗牌数组,我希望每次使用相同的种子时洗牌都是一样的。 所以像shuffle(perm,12)这样的东西在每次种子是12时都会返回相同的结果,但是当种子是22321时会有所不同。 所以我真正想知道的是如何使用种子或更好的方法来快速,可靠和确定性地对置换表进行混洗,或者使用更好的方法来播种单纯的噪声。

Java:不相关的单纯形噪声

我陷入另一个噪音问题(我从来没有这样做过)。 现在地形正在生成,它的相当好,但它的彼此不相关。 这是一个截图 正如你可能注意到,每一列地形都不光滑,这使得bruscal高度跳跃例如:而不是做2 4 6 7等等它使得2 14 16 18 28 46等 注:这只发生在高振幅值,但在较低的振幅,它没有任何山脉几乎一切顺利 这是我的地形生成代码: public void GenerateChunk(float offsetX, float amplitude)//I am using a value of 73 for amplitude. { for (int y = 200; y < 400; y += 16) { for(float x = 0; x < CHUNK_SIZE; x += 1) { try { float […]

我如何创建GPUgem3中提到的地形

所以,我想创建这种风格的地形: http : //http.developer.nvidia.com/GPUGems3/gpugems3_ch01.html 然而,尽管我在网上search试图find在Unity内部实现这个方法,但是我找不到它。 我目前对3d噪声的理解是它只是一个2d噪声的数组,它使用-1到1的范围来确定密度值(如果在空间(x,y,z)的一个点应该有地面或空气,而2d噪声只是你想要地形的一个高度图。 我目前已经产生了统一的单工噪声,我认为可以工作(当我调用coherentNoise()函数时,似乎经历了-1到1):但是我想对它进行一些评论:pastebin.com/SiX2C31t(目前,I还没有实施行军平方algorithm,也会喜欢这方面的一些技巧)。 我一直在看几个论坛问题和Unity的答案,但从来没有发现任何东西。 我想要做的是为水下地形创造迷人的山脊和悬崖,我还希望知道如何用更低的LOD(我想它是低聚)来做到这一点。 谢谢。

使用Simplex噪声与八度的高度图:帮助参数和解释

我find了几段代码,其中Simplex噪声的Java代码(基于这个广泛引用的文章 )与八度音符相结合,以获得一个高度图。 然而,这些类/片段不在-1,1范围内,尽管如此,所以我不得不添加一些修改。 通过反复试验和一些大脑工作,我得到了一个在-1和1之间产生输出的版本,在这里(你可以理智地检查它吗?这是正确的吗?) : public static float[][] generateOctavedSimplexNoise(final int width, final int height, final int octaves, final float roughness, final float scale) { final float[][] totalNoise = new float[width][height]; float layerFrequency = scale; float layerWeight = 1f; float weightSum = 0f; for (int octave = 0; octave < octaves; octave++) { // Calculate single […]

我应该如何使用这个一维珀林噪声函数?

我正在尝试用SDL2和C ++创建一个类似terrain的terraria。 为了生成地形我试图从这里使用1D噪声function: https : //github.com/SRombauts/SimplexNoise 这是非常基本的,只需要斧头价值。 我已经搞乱了一阵子,但不能解决什么传递给函数的x值。 我第一次尝试传递只是我find噪音列的x值。 这只是每次返回0。 接下来,我尝试传递0和1之间的值,所以我传递了它的x / width 。 这种工作方式,但我做的地形越宽,它变得越分开。 希望你明白,我做了什么给x值的函数? 提前致谢。

在二维瓷砖游戏中使用Perlin / Simplex噪音进行地形生成

我一直在做关于程序化二维地形生成的一系列研究,并得出结论,使用perlin / simplex噪声似乎是大多数事情的方法。 我已经从opensimplex噪音复制代码,并产生一些噪音,但我不知道该怎么办? 我怎样才能把这个噪音用来创造类似于“暗黑破坏神2”或“stream放之路”游戏的地形? 放置树木和河stream等的东西 另外,是否有可能使用这个来创建我的游戏简单的瓷砖? 说我想创建一堆不同的草地砖(等轴测图),我可以做到这一点? 编辑:所以我已经尝试了下面的代码来尝试和生成一些自然看岩石的位置,我不太确定我明白它是如何工作的。 我用条件值<.1来放置一块岩石,但是这个世界似乎充满了岩石。 我做错了什么,或者我只是不理解它应该如何工作? private void populateObjects(TileLoader tileLoader) { OpenSimplexNoise noise = new OpenSimplexNoise(); for (int i = 0; i < layers[1].layerData.GetLength(0); i++) { for (int j = 0; j < layers[1].layerData.GetLength(1); j++) { double value = noise.Evaluate(j, i); if(value < .1) layers[1].layerData[i, j] = tileLoader.getTileByName("grassrock"); } } […]

程序生成非矩形表面的高度图

我正在为一个大陆开展程序性的地形生成工作,这意味着我需要在大陆周围形成一个广泛的丘陵,山脉和山谷。 对于山区,我采用了阿米特的岛屿生成algorithm ,这个algorithm生成了相当漂亮的山峰,有着非常清晰的山脊,山坡以及其他所有的山峰。 现在我的问题是一些平滑的丘陵地形。 由于我的大陆六边形的性质,网格被细分为三角形。 另外,由于需要多个山脉/山丘/山谷,我还将我的大陆分割成多个扇区,然后由于扇区的边缘始终为零,因此很容易将它们缝合在一起。 所以约束如下: 表面是六角形的,这实际上不是一个问题,因为我仍然可以生成“正方形”网格的高程,并在“实际”六边形垂直上使用双线性插值。 表面不是一个正方形,我完全不知道该如何处理。 现在,大多数地形生成algorithm总是在方形表面上生成地形,中点位移,噪声等等。 他们也不会在边缘生成零值,这对我来说是一个严格的要求。 现在我真的想采用双重单纯形噪声的方法,但我需要一种方法来迫使它在我的多边形扇区(显然是变化的)的边界之外始终生成零,并且在边界内部的平滑值会形成很好的丘陵地形。 问题是…甚至可能,或者我应该寻找一个不同的方法?

2D单纯形光滑洞穴生成

所以我在随机地形下创建了一个洞穴系统,我使用2D Simplex Noise来完成这个任务,而且我对生成随机洞穴有很好的把握。 然而,从地形到洞穴层开始的地方有点突然,我想知道如何防止这种情况发生。 随机等级生成: public static Level GetRandomLevel(int rows, int cols, float scale = 1f) { Tile[][] tiles = new Tile[rows][]; for (int i = 0; i < rows; i++) { tiles[i] = new Tile[cols]; for (int x = 0; x < cols; x++) { tiles[i][x] = new Tile(0, new Vector2(x, i), scale); } […]