【问题标题】:Minecraft like terrain in unity3dunity3d 中类似于 Minecraft 的地形
【发布时间】:2018-07-25 13:34:27
【问题描述】:

我是 Minecraft 旧地形一代的粉丝,拥有令人惊叹的悬垂、山脉和有趣的世界。我的问题是,现在我正在使用 perlin 噪声,虽然它对平滑的地形很有好处,但并不能真正产生零星的跳跃,从而在大部分平坦的区域允许山脉。

最重要的是,我使用的方法是获取 2d perlin 噪声,将其放入一个数组中,然后获取其下的每个 Y 值并将其设置为一个块;这会阻止像这样产生悬垂:Old Minecraft Terrain Image

现在我有这个:

public class GenerateIdMap : MonoBehaviour {
     [Serializable] public class IBSerDict : SerializableDictionaryBase<int, byte> {};
     public int size = 60;
     public int worldHeight = 3;
     public float perlinScale = 15f;
     public int seed;
     public int heightScale = 10;
     public int maxHeight = 256;
     public IBSerDict defaultBlocks = new IBSerDict();
     void Start()
     {
         if (seed != 0) seed = (int)Network.time * 10;
         CreateMap();
     }
     byte[,,] CreateMap()
     {
         byte[,,] map = new byte[size, maxHeight, size];
         for (int x = 0; x < size; x++)
         {
             for (int z = 0; z < size; z++)
             {
                 int y = (int)(Mathf.PerlinNoise((x + seed) / perlinScale, (z + seed) / perlinScale) * heightScale) + worldHeight;
                 y = Mathf.Clamp(y, 0, maxHeight-1);
                 while (y > 0)
                 {
                     map[x, y, z] = GetBlockType(y);
                     y--;
                 }
             }
         }
         return map;
     }
     byte GetBlockType(int y)
     {
         SortedDictionary<int, byte> s_defaultBlocks = new SortedDictionary<int, byte>(defaultBlocks);
         foreach (var item in s_defaultBlocks.OrderBy(key => key.Key))
         {
             if (y <= item.Key)
             {
                 print(item.Value);
                 return item.Value;
             }
         }
         return 0;
     }  }

GetBlockType 函数是新的,用于获取该高度的默认块,我稍后会修复它,但现在可以使用。如果你在那个 vector3 上实例化一个预制件,你会看到地形。有人可以帮我弄清楚如何制作更好的地形吗?提前致谢!

【问题讨论】:

    标签: c# unity3d terrain perlin-noise


    【解决方案1】:

    您的两个问题都应该单独解决。

    关于生成值缺乏变化的第一个问题通常可以通过以下两种方式之一来解决,第一种方式是将输入修改为 perlin 噪声,即八度音程和持久性,第二种方式是混合多个函数的输出,甚至使用一个函数的输出作为另一个函数的输入。通过功能,我的意思是 Perlin/Simplex/Voronoi 等。

    使用前一种方法,正如您所提到的,很难在大面积上获得具有有趣特征的地形(生成的值是均匀的),但是通过使用坐标范围和八度音程/持久性,它可以可能的。然而,可能建议使用第二种方法,因为通过混合不同函数的输入和输出,您可以获得一些非常有趣的形状(Voronoi 产生类似环形火山口的形状)。

    为了解决悬垂问题,您需要稍微改变生成世界的方法。目前,您只是生成地形的高度值并分配这些值中的每一个以仅给您地形表面。理想情况下,您想要做的是生成一个伪随机值,用作 3d 空间中的每个块(也包括地下的块)的通过标志。该标志将指示是否应在 3d 世界中放置一个块。

    这比较慢,但会根据需要生成洞穴和悬垂物。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-12-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多