如何生成程序立方体小行星编队?
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 是我的最爱之一。分辨率较低时,它并不那么重要,因为无论如何您都看不到细节。
我正在尝试找到生成基于 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 是我的最爱之一。分辨率较低时,它并不那么重要,因为无论如何您都看不到细节。