我正试图找到生成基于佩林噪声的立方体体素小行星的最佳方法,但似乎找不到一致的方法。
我试过使用这个柏林噪音库: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);
}
}
}
}
}
不幸的是,我得到的结果是这样的。
当我真的在寻找像我制作的搅拌机模型这样的结果时。。
从外观上看,你可以看到我正在使用Unity来做这件事,作为一种媒介来查看我的代码输出。我绝不是在寻找Unity对此的答案,这完全是概念性的,用于多个编码项目。
我希望能得到一些指导、答案或建议来实现我的目标。感谢您的提前帮助,我真的很感谢您抽出时间来帮助我,
干杯。
我不太确定你到底在做什么,所以我只告诉你我通常是怎么做的。我的体素使用了一些行进立方体的变体,所以我会对它进行一些更改,以适应你正在做的事情。
首先,你可以循环通过你所有的体素并取中心点。然后将其标准化。我假设你的小行星在中间有(0.0,0.0,0(,如果不只是抵消所有东西的话。在任何情况下,它都会为您提供围绕单位球体的点。然后,你可以将这些点乘以某个常数,得到一个更大的点球体,比如5或10。数字越大,噪声的频率就越高。玩到你觉得好看为止。接下来,将这些点插入三维鼻子、Perlin或单纯形中。Simplex通常更好。这将为每个体素提供一个从-1到1的值。
然后你只需要有一个小行星的基本半径。例如,如果你的体素在所有维度上都从-10到+10,你可以使用8的基本半径。如果将其添加到噪波中,则球体周围的每个体素的值大约为7到9。如果体素的中心到原点的距离小于其计算的数字,则它是实心的。如果它更大,它是非固体的。宾果,你完了。
你也可以放大和缩小你的噪音,给你更高的峰值和更低的低谷。然后有各种方法可以组合噪声来获得许多不同类型的地形。脊状多重分形是我的最爱之一。然而,对于低分辨率,它并不那么重要,因为你无论如何都看不到细节。