如何生成程序立方体小行星编队?

How Do I Generate Procedural Cube Asteroid Formations?

我正在尝试找到生成基于 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 的答案,这完全是用于多个编码项目的概念。

我希望得到一些指导、答案或建议来实现我的目标。感谢您提前提供的所有帮助,非常感谢您花时间帮助我,

干杯。

我不太确定你在做什么,所以我只告诉你我通常是怎么做的。我的体素使用了一些行进立方体的变体,所以我会稍微改变一下以适应你正在做的事情。

首先,您可以遍历所有体素并取中心点。然后将其正常化。我假设你的小行星在中间有 (0.0,0.0,0),如果不只是抵消一切的话。在任何情况下,它都会给你一个单位球体周围的点。然后,您可以将这些点乘以某个常数以获得更大的点范围,例如 5 或 10。数字越大,噪声的频率就越高。玩它直到它看起来不错。接下来将这些点插入 3D 鼻子、Perlin 或单纯形。单纯形通常更好。对于每个体素,这将为您提供大约 -1 到 1 的值。

那么您只需要为您的小行星设置一个基本半径即可。例如,如果你的体素在所有维度上从 -10 到 +10,你可以使用 8 的基本半径。如果你将它添加到你的噪声中,你会得到大约 7 到 9 的值,因为每个体素一直围绕着球体。如果体素中心到原点的距离小于它的计算值,它就是实心的。如果它更大,则它是非固体。宾果你完成了。

您还可以按比例放大和缩小噪音,以获得更高的峰值和更低的谷值。然后有多种方法可以结合噪声以获得许多不同类型的地形。 Ridged Multi-Fractal 是我的最爱之一。分辨率较低时,它并不那么重要,因为无论如何您都看不到细节。