这里记录一下用柏林噪声制作Unity随机地形的过程:
柏林噪声原理:柏林噪声数学原理介绍 2. 在unity中的应用
C# => static float PerlinNoise(float x, float y); 柏林噪波是在2D平面浮点值生成的伪随机图案(尽管该技术已经普及到三维或者更多维数,但在Unity还未实现)。此噪波不是由每个点的完全随机值构成,而是由逐渐增加和减少交错波形图案值构成。此噪波可以作为基本纹理效果,但也可用于动画、生成地形高度图以及其他东西。 (在渲染中的应用: 1.在凸凹贴图中它能很好地模拟火焰、云彩、奇形怪状的岩石,以及树木和大理石表面等; 2.做特效地模拟火焰、云彩等。) unity中首先建立一个平面,新建Script命名为GenerateTerren,将代码组件赋给plane; 地形代码:
using System.Collections; using System.Collections.Generic; using UnityEngine; public class GenerateTerren : MonoBehaviour { int heightScale =2; float detailScale = 2.0f; //与heightScale一起调整地形高度和细节 // Use this for initialization void Start () { Mesh mesh = this.GetComponent<MeshFilter>().mesh;//获取Mesh网格 Vector3[] vertices = mesh.vertices; //将Mesh网格的每一个顶点用柏林噪声函数处理 for (int v = 0; v < vertices.Length; v++) { vertices[v].y = Mathf.PerlinNoise((vertices[v].x + this.transform.position.x) / detailScale, (vertices[v].z + this.transform.position.z) / detailScale)*heightScale; //x和z的参数加上自身位置x和z的偏置量可以让结果看起来更自然。 } mesh.vertices = vertices;//重置顶点 mesh.RecalculateBounds();//重置网格边界 mesh.RecalculateNormals();//重置网格法线 this.gameObject.AddComponent<MeshCollider>();//添加Collider可以让player在地面上走动 } // Update is called once per frame void Update () { } }点击运行后记得设置下材质或贴图,让地形看起来更真实。