- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试实现 2D Perlin 噪声来创建类似 Minecraft 的地形(Minecraft 实际上并不使用 2D Perlin 噪声)而没有悬垂或洞穴之类的东西。
我这样做的方式是创建一个 [50][20][50] 立方体数组,其中 [20] 将是数组的最大高度,其值将由 Perlin 噪声确定。然后,我将用立方体数组填充该数组。
我一直在阅读 this article我不明白,如何计算 4 梯度向量并在我的代码中使用它?每个相邻的 2D 数组,例如 [2][3] 和 [2][4] 是否有不同的 4 梯度向量?
另外,我读过一般的 Perlin 噪声函数也采用一个数值作为种子,在这种情况下我应该把它放在哪里?
最佳答案
我将使用工作代码来解释 Perlin 噪声,而不依赖于其他解释。首先,您需要一种在 2D 点生成伪随机浮点数的方法。每个点相对于其他点看起来应该是随机的,但诀窍是相同的坐标应该始终产生相同的浮点数。我们可以使用任何散列函数来做到这一点——不仅仅是 Ken Perlin 在他的代码中使用的那个。这是一个:
static float noise2(int x, int y) {
int n = x + y * 57;
n = (n << 13) ^ n;
return (float) (1.0-((n*(n*n*15731+789221)+1376312589)&0x7fffffff)/1073741824.0);
}
landscape[i][j] = noise2(i,j);
(然后我将其转换为图像)并且它总是产生相同的东西:
static float stretchedNoise2(float x_float, float y_float, float stretch) {
// stretch
x_float /= stretch;
y_float /= stretch;
// the whole part of the coordinates
int x = (int) Math.floor(x_float);
int y = (int) Math.floor(y_float);
// the decimal part - how far between the two points yours is
float fractional_X = x_float - x;
float fractional_Y = y_float - y;
// we need to grab the 4x4 nearest points to do cubic interpolation
double[] p = new double[4];
for (int j = 0; j < 4; j++) {
double[] p2 = new double[4];
for (int i = 0; i < 4; i++) {
p2[i] = noise2(x + i - 1, y + j - 1);
}
// interpolate each row
p[j] = cubicInterp(p2, fractional_X);
}
// and interpolate the results each row's interpolation
return (float) cubicInterp(p, fractional_Y);
}
public static double cubicInterp(double[] p, double x) {
return cubicInterp(p[0],p[1],p[2],p[3], x);
}
public static double cubicInterp(double v0, double v1, double v2, double v3, double x) {
double P = (v3 - v2) - (v0 - v1);
double Q = (v0 - v1) - P;
double R = v2 - v0;
double S = v1;
return P * x * x * x + Q * x * x + R * x + S;
}
Math.cos()
已实现,但我仍然知道它的作用。这个函数给我们带来了拉伸(stretch)、平滑的噪音。
->
stretchedNoise2
函数生成一定比例(大或小)的“景观” - 随机点的景观,它们之间具有平滑的斜坡。现在我们可以生成一系列相互叠加的景观:
public static double perlin2(float xx, float yy) {
double noise = 0;
noise += stretchedNoise2(xx, yy, 5) * 1; // sample 1
noise += stretchedNoise2(xx, yy, 13) * 2; // twice as influential
// you can keep repeating different variants of the above lines
// some interesting variants are included below.
return noise / (1+2); // make sure you sum the multipliers above
}
// 1
float smearX = interpolatedNoise2(xx, yy, 99) * 99;
float smearY = interpolatedNoise2(xx, yy, 99) * 99;
ret += interpolatedNoise2(xx + smearX, yy + smearY, 13)*1;
// 2
float smearX2 = interpolatedNoise2(xx, yy, 9) * 19;
float smearY2 = interpolatedNoise2(xx, yy, 9) * 19;
ret += interpolatedNoise2(xx + smearX2, yy + smearY2, 13)*1;
// 3
ret += Math.cos( interpolatedNoise2(xx , yy , 5)*4) *1;
关于math - 用于地形生成的 Perlin 噪声,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28755988/
示例:https://www.terraform.io/docs/providers/kubernetes/r/service_account.html 我们看到了: resource "kubern
示例:https://www.terraform.io/docs/providers/kubernetes/r/service_account.html 我们看到了: resource "kubern
我有 5 个 keyvaults,有 5 个 secret ,问题是我不希望我的 terraform 文件有 10 个这样的数据 block : data "azurerm_key_vault" "k
我之前在我的 TF 代码中使用过这个: count = "${var.whatever == "true" ? 1 : 0}" 这非常适合我想要使用的东西。但是,我正在考虑如何最好地使用类似于说的
我之前在我的 TF 代码中使用过这个: count = "${var.whatever == "true" ? 1 : 0}" 这非常适合我想要使用的东西。但是,我正在考虑如何最好地使用类似于说的
我想创建一个上面有山的地形,使用一个非常基本的原理,如这个高度映射所示: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0
根据文档,使用terraform,我能够在 digital ocean 上创建一个小滴: resource "digitalocean_volume" "foobar" { region
在 Terraform 中,我正在尝试创建一个模块,其中包含一个带有变量键的 map 。我不确定这是否可能,但我尝试了以下但没有成功。 resource "aws_instance" "web" {
我正在使用Box2d进行自行车物理游戏,Box2d可以让你拥有8点或更少的凸多边形的固定装置,有人知道更简单的方法吗除了制作一大堆固定装置之外,还有复杂的凹形地形?或者这是唯一的方法? 任何想法、指示
我正在尝试在 LWJGL 中制作 2D 游戏。我在地形生成方面遇到问题。 我目前有一个生成地形的算法,但它总是随机的,我永远无法再次获得相同的世界,我想制作一个基于生成 x 和 y 坐标的算法给定的数
我在使用 libgdx 和 box2d 进行卡车游戏。 在我的游戏中 1 米 = 100 像素。 我的 2d 地形是由我生成的,由点组成。 我所做的是为整个多边形制作了一个多边形区域并使用了textu
我有一个 3D boolean 值数组,代表一些 3D 地形。目前我可以通过在数组中的 x y 和 z 指定的位置绘制一个点来绘制它,它看起来像这样。 我想不通的是如何使用三角形绘制它,所以它看起来像
我读过很多关于这个概念的教程,但我觉得它们都没有深入探讨如何做到这一点。我已经知道 3D 编程(光栅化、投影矩阵等)、光线转换(使用欧几里得几何和矢量)和光线追踪如何工作,我只需要知道如何使用柏林噪声
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 9 年前。 Improve this qu
我正在做一些地形渲染,但遇到了一些麻烦。在这个时间点,我只是镶嵌顶点补丁,然后用高度图替换它们。我目前的问题是渲染看起来很时髦。我已经调试了一段时间,看起来这是深度缓冲区的问题。除此之外,我对正在发生
在 OpenGL 中用四边形制作地形纹理的最佳方法是什么?我有大约 30 种不同的纹理我想为我的地形(每种地形类型 1 个纹理,所以 30 种地形类型)并且希望在任何两个地形之间平滑过渡。 我一直在浏
执行时 terraform plan我没有错误,但是当我执行 terraform apply 时我收到以下错误。 地形计划输出:- + aws_route53_record.alm_route_rec
执行 terraform init 时出现以下错误升级到 0.12.2 后的命令版本。早期的相同代码在 terraform 中运行良好,没有问题 0.11.10版本。 alb.tf tags {
terraform init成功初始化但卡在 terraform 计划上。 该错误与功能块有关。我不确定在哪里添加功能块: Insufficient features blocks (source c
我正在使用 terraform 版本 0.14.3。我有一个用于创建 Azure 网络接口(interface)卡的模块,如下所示: resource "azurerm_network_interfa
我是一名优秀的程序员,十分优秀!