【发布时间】:2021-03-11 12:43:43
【问题描述】:
我正在尝试找到生成基于 perlin 噪声的立方体体素小行星的最佳方法,但似乎找不到一致的方法。
我尝试使用这个 perlin 噪声库:https://github.com/warmwaffles/Noise/blob/master/src/prime/PerlinNoise.java
使用这种静态方法来消除 3D 噪点:
public static double Perlin3D(PerlinNoise noise, double x, double y, double z)
{
double AB = noise.getHeight(x, y);
double BC = noise.getHeight(y, z);
double AC = noise.getHeight(x, z);
double BA = noise.getHeight(y, x);
double CB = noise.getHeight(z, y);
double CA = noise.getHeight(z, x);
double ABC = AB + BC + AC + BA + CB + CA;
return ABC / 6;
}
还有这个制作小行星的方法:
public void Generate()
{
PerlinNoise p = new PerlinNoise(seed, persistence, frequency, amplitude, octaves);
GameObject newUnit = Instantiate(unit, genPoint, Quaternion.identity);
newUnit.transform.SetParent(transform);
for (int x = 0; x < maxDistanceFromCenter * 2; x++)
{
for (int y = 0; y < maxDistanceFromCenter * 2; y++)
{
for (int z = 0; z < maxDistanceFromCenter * 2; z++)
{
int targetX = genPoint.x - maxDistanceFromCenter + x;
int targetY = genPoint.y - maxDistanceFromCenter + y;
int targetZ = genPoint.z - maxDistanceFromCenter + z;
Vector3Int targetPos = new Vector3Int(targetX, targetY, targetZ);
Vector3 targetVector3d = new Vector3(targetX, targetY, targetZ).normalized;
double distFromCenter = Vector3.Distance(genPoint, targetPos);
double maxDistFromCenter = (NoiseHelper.Perlin3D(p, targetVector3d.x, targetVector3d.y, targetVector3d.z));
print(maxDistFromCenter);
if (distFromCenter < maxDistFromCenter)
{
GameObject newUnit2 = Instantiate(unit, targetPos, Quaternion.identity);
newUnit2.transform.SetParent(transform);
}
}
}
}
}
不幸的是,我得到的结果看起来像 like this.
当我真的在寻找这样的结果时Blender mock-up I made.。
从外观上看,您可以看到我正在使用 Unity 来执行此操作,以查看我的代码输出的内容。我绝不是在寻找 Unity 的答案,这完全是用于多个编码项目的概念。
我希望获得一些指导、答案或建议来实现我的目标。感谢您在高级方面的所有帮助,非常感谢您抽出时间帮助我,
干杯。
【问题讨论】:
-
我同意 Gnollrunner 的观点,即单纯形噪声通常更好。这主要是由于外观而不是显示相同类型的网格对齐。我们应该将术语“Perlin”视为方向变化问题的同义词,而不是平滑值。另外,我不推荐“3D out of 2D”的技巧。首先,它沿剩余轴创建每个 2D 噪声特征的阴影。它看起来也很复杂,因为它结合了 6 个噪声,但它实际上只结合了 3 个。共享相同翻转轴的那些合并为一个噪声。我推荐github.com/Auburn/FastNoiseLite
标签: minecraft noise voxel procedural