1、取得顶点的数据汇合
protected override Vector3[] GetVertices() { var curIndex = 0; var arrayLen = (_latitude + 1) * (_longitude + 1); var vertices = new Vector3[arrayLen]; for (var lat = 0; lat <= _latitude; lat++) { //经线角度的取值范畴是0~180度 var latRad = lat * 1.0f / _latitude * Mathf.PI; var latCos = Mathf.Cos(latRad); var latSin = Mathf.Sin(latRad); for (var lon = 0; lon <= _longitude; lon++) { //纬线角度的取值范畴是0~360度 var lonRad = lon * 1.0f / _longitude * Mathf.PI * 2;//每一圈的最初一个点和第一个点重合(设置UV的坐标) var lonCos = Mathf.Cos(lonRad); var lonSin = Mathf.Sin(lonRad); vertices[curIndex++] = new Vector3(latSin * lonCos, latCos, latSin * lonSin) * _radius - _vertexOffset; } } return vertices; }
2、取得法线方向的数据汇合
protected override Vector3[] GetNormals() { var curIndex = 0; var vertices = Vertices;//取得以后的顶点 var normals = new Vector3[vertices.Length]; foreach (var vertex in vertices) { normals[curIndex++] = (vertex + _vertexOffset).normalized; } return normals; }
3、取得三角面顶点的索引
protected override int[] GetTriangles() { var curIndex = 0; var arrayLen = _latitude * _longitude * 3 * 2; var triangles = new int[arrayLen]; //侧面 for (var lat = 0; lat < _latitude; lat++) { for (var lon = 0; lon < _longitude; lon++) { var current = lat * (_longitude + 1) + lon; var next = current + _longitude + 1; triangles[curIndex++] = current; triangles[curIndex++] = current + 1; triangles[curIndex++] = next; triangles[curIndex++] = next; triangles[curIndex++] = current + 1; triangles[curIndex++] = next + 1; } } return triangles; }
4、取得UV坐标的数据汇合
protected override Vector2[] GetUVs() { var curIndex = 0; var arrayLen = (_latitude + 1) * (_longitude + 1); var uvs = new Vector2[arrayLen]; for (var lat = 0; lat <= _latitude; lat++) for (var lon = 0; lon <= _longitude; lon++) uvs[curIndex++] = new Vector2((float)lon / _longitude, 1f - (float)lat / _latitude); return uvs; }
成果如下:
gitee地址:https://gitee.com/pangdudu010...