圓柱體的頂點有頂面、底面和側面三部分。
一、得到頂點的數據集合git
protected override Vector3[] GetVertices() { int curIndex = 0;//當前索引 int arrayLen = (_circularSideCount + 1) * 2 + _circularSideCount * 2 + 2;//數組的長度 var vertices = new Vector3[arrayLen]; //底面 vertices[curIndex++] = new Vector3(0, -_height * 0.5f, 0) - _verticeOffset; ;//圓心 for (int i = 0; i < _circularSideCount; i++) { var rad = i * 1.0f / _circularSideCount * Mathf.PI * 2;//弧度 var cos = Mathf.Cos(rad) * _radius; var sin = Mathf.Sin(rad) * _radius; vertices[curIndex++] = new Vector3(cos, -_height * 0.5f, sin) - _verticeOffset; } //頂面 vertices[curIndex++] = new Vector3(0, _height * 0.5f, 0) - _verticeOffset; ;//圓心 for (int i = 0; i < _circularSideCount; i++) { var rad = i * 1.0f / _circularSideCount * Mathf.PI * 2;//弧度 var cos = Mathf.Cos(rad) * _radius; var sin = Mathf.Sin(rad) * _radius; vertices[curIndex++] = new Vector3(cos, _height * 0.5f, sin) - _verticeOffset; } //側面 int sideStartIndex = curIndex; for (int i = 0; i < _circularSideCount; i++) { var rad = i * 1.0f / _circularSideCount * Mathf.PI * 2;//弧度 var cos = Mathf.Cos(rad) * _radius; var sin = Mathf.Sin(rad) * _radius; vertices[curIndex++] = new Vector3(cos, -_height * 0.5f, sin) - _verticeOffset; vertices[curIndex++] = new Vector3(cos, _height * 0.5f, sin) - _verticeOffset; } vertices[curIndex++] = vertices[sideStartIndex]; vertices[curIndex] = vertices[sideStartIndex + 1]; return vertices; }
二、得到法線方向的數據集合數組
protected override Vector3[] GetNormals() { int curIndex = 0; int arrayLen = (_circularSideCount + 1) * 2 + _circularSideCount * 2 + 2; var normals = new Vector3[arrayLen]; //底面 for (int i = 0; i <= _circularSideCount; i++) { normals[curIndex++] = Vector3.down; } //頂面 for (int i = 0; i <= _circularSideCount; i++) { normals[curIndex++] = Vector3.up; } //側面 for (int i = 0; i <= _circularSideCount; i++) { float rad = i * 1.0f / _circularSideCount * Mathf.PI * 2; var cos = Mathf.Cos(rad); var sin = Mathf.Sin(rad); normals[curIndex++] = new Vector3(cos, 0, sin); normals[curIndex++] = new Vector3(cos, 0, sin); } return normals; }
三、得到三角面頂點的索引ide
protected override int[] GetTriangles() { int curIndex = 0; int arrayLen = _circularSideCount * 3 + _circularSideCount * 3 + _circularSideCount * 3 * 2; var triangles = new int[arrayLen]; //底面 for (int i = 1; i < _circularSideCount; i++) { triangles[curIndex++] = 0; triangles[curIndex++] = i; triangles[curIndex++] = i + 1; } triangles[curIndex++] = 0; triangles[curIndex++] = _circularSideCount; triangles[curIndex++] = 1; //頂面 for (int i = _circularSideCount + 2; i < _circularSideCount * 2 + 1; i++) { triangles[curIndex++] = _circularSideCount + 1; triangles[curIndex++] = i + 1; triangles[curIndex++] = i; } triangles[curIndex++] = _circularSideCount + 1; triangles[curIndex++] = _circularSideCount + 2; triangles[curIndex++] = _circularSideCount * 2 + 1; //側面 int startIndex = _circularSideCount * 2 + 2; for (int i = 0; i < _circularSideCount; i++) { triangles[curIndex++] = startIndex; triangles[curIndex++] = startIndex + 1; triangles[curIndex++] = startIndex + 3; triangles[curIndex++] = startIndex + 3; triangles[curIndex++] = startIndex + 2; triangles[curIndex++] = startIndex; startIndex += 2; } return triangles; }
四、 得到UV座標的數據集合spa
protected override Vector2[] GetUVs() { int curIndex = 0; int arrayLen = (_circularSideCount + 1) * 2 + (_circularSideCount + 1) * 2; var uvs = new Vector2[arrayLen]; //底面 uvs[curIndex++] = new Vector2(0.5f, 0.5f); for (int i = 0; i < _circularSideCount; i++) { var rad = i * 1.0f / _circularSideCount * Mathf.PI * 2; var cos = Mathf.Cos(rad); var sin = Mathf.Sin(rad); uvs[curIndex++] = new Vector2(cos, sin) * 0.5f + new Vector2(0.5f, 0.5f); } //頂面 uvs[curIndex++] = new Vector2(0.5f, 0.5f); for (int i = 0; i < _circularSideCount; i++) { var rad = i * 1.0f / _circularSideCount * Mathf.PI * 2; var cos = Mathf.Cos(rad); var sin = Mathf.Sin(rad); uvs[curIndex++] = new Vector2(cos, sin) * 0.5f + new Vector2(0.5f, 0.5f); } //側面 float value = 1.0f / _circularSideCount; for (int i = 0; i <= _circularSideCount; i++) { uvs[curIndex++] = new Vector2(i * value, 0); uvs[curIndex++] = new Vector2(i * value, 1); } return uvs; }
總體效果以下:
code
gitee倉庫地址:https://gitee.com/pangdudu010...orm