PlaneGenerator.cs 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188
  1. using System.Collections.Generic;
  2. using UnityEngine;
  3. public class PlaneGenerator : MonoBehaviour
  4. {
  5. public Material material;
  6. private const int pqsResolution = 16;
  7. private const int sphereRadius = 10;
  8. private List<Quad> quads;
  9. // Start is called once before the first execution of Update after the MonoBehaviour is created
  10. void Start()
  11. {
  12. BuildRootQuads();
  13. }
  14. // Update is called once per frame
  15. void Update()
  16. {
  17. }
  18. private void BuildRootQuads()
  19. {
  20. var (vertices, uv) = CreateVertices();
  21. var triangles = CreateTriangles();
  22. RotatePlaneY(vertices);
  23. CreateMesh("mesh_Y", vertices, uv, triangles);
  24. (vertices, uv) = CreateVertices();
  25. triangles = CreateTriangles();
  26. RotatePlaneY1(vertices);
  27. CreateMesh("mesh_Y1", vertices, uv, triangles);
  28. (vertices, uv) = CreateVertices();
  29. triangles = CreateTriangles();
  30. RotatePlaneZ(vertices);
  31. CreateMesh("mesh_Z", vertices, uv, triangles);
  32. (vertices, uv) = CreateVertices();
  33. triangles = CreateTriangles();
  34. RotatePlaneZ1(vertices);
  35. CreateMesh("mesh_Z1", vertices, uv, triangles);
  36. (vertices, uv) = CreateVertices();
  37. triangles = CreateTriangles();
  38. RotatePlaneX(vertices);
  39. CreateMesh("mesh_X", vertices, uv, triangles);
  40. (vertices, uv) = CreateVertices();
  41. triangles = CreateTriangles();
  42. RotatePlaneX1(vertices);
  43. CreateMesh("mesh_X1", vertices, uv, triangles);
  44. }
  45. private (Vector3[] vertices, Vector2[] uv) CreateVertices()
  46. {
  47. var half = sphereRadius / 2f;
  48. var vertices = new Vector3[(pqsResolution + 1) * (pqsResolution + 1)];
  49. Vector2[] uv = new Vector2[(pqsResolution + 1) * (pqsResolution + 1)];
  50. for (int x = 0, vertex = 0; x < pqsResolution + 1; x++)
  51. {
  52. for (int z = 0; z < pqsResolution + 1; z++, vertex++)
  53. {
  54. vertices[vertex] = new Vector3(half - (float)x / pqsResolution * sphereRadius, half, half - (float)z / pqsResolution * sphereRadius);
  55. uv[vertex] = new Vector2((float)x / pqsResolution, (float)z / pqsResolution);
  56. }
  57. }
  58. return (vertices, uv);
  59. }
  60. private int[] CreateTriangles()
  61. {
  62. var triangles = new int[(pqsResolution) * (pqsResolution) * 6];
  63. int triangle = 0;
  64. for (int x = 1, vertex = 0; x<pqsResolution + 1; x++, vertex++)
  65. {
  66. for (int z = 1; z<pqsResolution + 1; z++, vertex++)
  67. {
  68. triangles[triangle] = vertex;
  69. triangles[triangle + 1] = vertex + pqsResolution + 2;
  70. triangles[triangle + 2] = vertex + pqsResolution + 1;
  71. triangles[triangle + 3] = vertex;
  72. triangles[triangle + 4] = vertex + 1;
  73. triangles[triangle + 5] = vertex + pqsResolution + 2;
  74. triangle += 6;
  75. }
  76. }
  77. return triangles;
  78. }
  79. private void CreateMesh(string name, Vector3[] vertices, Vector2[] uv, int[] triangles)
  80. {
  81. var mesh = new GameObject(name, typeof(MeshFilter), typeof(MeshRenderer), typeof(MeshCollider));
  82. mesh.transform.localScale = new Vector3(1, 1, 1);
  83. var meshFilter = mesh.GetComponent<MeshFilter>();
  84. meshFilter.mesh.vertices = vertices;
  85. meshFilter.mesh.triangles = triangles;
  86. meshFilter.mesh.uv = uv;
  87. mesh.GetComponent<MeshCollider>().sharedMesh = meshFilter.mesh;
  88. meshFilter.mesh.RecalculateBounds();
  89. meshFilter.mesh.RecalculateNormals();
  90. mesh.GetComponent<MeshRenderer>().material = material;
  91. }
  92. private void RotatePlaneZ(Vector3[] vertices)
  93. {
  94. for (int x = 0, vertex = 0; x < pqsResolution + 1; x++)
  95. {
  96. for (int z = 0; z < pqsResolution + 1; z++, vertex++)
  97. {
  98. vertices[vertex] = new Vector3(-vertices[vertex].x, vertices[vertex].z, vertices[vertex].y);
  99. vertices[vertex] = Vector3.Normalize(vertices[vertex]) * sphereRadius;
  100. }
  101. }
  102. }
  103. private void RotatePlaneY(Vector3[] vertices)
  104. {
  105. for (int x = 0, vertex = 0; x < pqsResolution + 1; x++)
  106. {
  107. for (int z = 0; z < pqsResolution + 1; z++, vertex++)
  108. {
  109. vertices[vertex] = Vector3.Normalize(vertices[vertex]) * sphereRadius;
  110. }
  111. }
  112. }
  113. private void RotatePlaneZ1(Vector3[] vertices)
  114. {
  115. for (int x = 0, vertex = 0; x < pqsResolution + 1; x++)
  116. {
  117. for (int z = 0; z < pqsResolution + 1; z++, vertex++)
  118. {
  119. vertices[vertex] = new Vector3(-vertices[vertex].x, -vertices[vertex].z, -vertices[vertex].y);
  120. vertices[vertex] = Vector3.Normalize(vertices[vertex]) * sphereRadius;
  121. }
  122. }
  123. }
  124. private void RotatePlaneX(Vector3[] vertices)
  125. {
  126. for (int x = 0, vertex = 0; x < pqsResolution + 1; x++)
  127. {
  128. for (int z = 0; z < pqsResolution + 1; z++, vertex++)
  129. {
  130. vertices[vertex] = new Vector3(vertices[vertex].y, vertices[vertex].x, -vertices[vertex].z);
  131. vertices[vertex] = Vector3.Normalize(vertices[vertex]) * sphereRadius;
  132. }
  133. }
  134. }
  135. private void RotatePlaneY1(Vector3[] vertices)
  136. {
  137. for (int x = 0, vertex = 0; x < pqsResolution + 1; x++)
  138. {
  139. for (int z = 0; z < pqsResolution + 1; z++, vertex++)
  140. {
  141. vertices[vertex] = new Vector3(-vertices[vertex].x, -vertices[vertex].y, vertices[vertex].z);
  142. vertices[vertex] = Vector3.Normalize(vertices[vertex]) * sphereRadius;
  143. }
  144. }
  145. }
  146. private void RotatePlaneX1(Vector3[] vertices)
  147. {
  148. for (int x = 0, vertex = 0; x < pqsResolution + 1; x++)
  149. {
  150. for (int z = 0; z < pqsResolution + 1; z++, vertex++)
  151. {
  152. vertices[vertex] = new Vector3(-vertices[vertex].y, -vertices[vertex].x, -vertices[vertex].z);
  153. vertices[vertex] = Vector3.Normalize(vertices[vertex]) * sphereRadius;
  154. }
  155. }
  156. }
  157. }