- bool[] above = new bool[MeshInfo.vertices.Count];
- int[] newTriangles = new int[MeshInfo.vertices.Count];
- for (int i = 0; i < newTriangles.Length; i++)
- {
- Vector3 vert = MeshInfo.vertices[i];
- above[i] = Vector3.Dot(vert - point, normal) >= 0f;
- if (above[i])
- {
- newTriangles[i] = a.vertices.Count;
- a.Add(vert, MeshInfo.uvs[i], MeshInfo.normals[i], MeshInfo.tangents[i]);
- }
- else
- {
- newTriangles[i] = b.vertices.Count;
- b.Add(vert, MeshInfo.uvs[i], MeshInfo.normals[i], MeshInfo.tangents[i]);
- }
- }
- for (int i = 0; i < triangleCount; i++)
- {
- int _i0 = MeshInfo.triangles[i * 3];
- int _i1 = MeshInfo.triangles[i * 3 + 1];
- int _i2 = MeshInfo.triangles[i * 3 + 2];
- bool _a0 = above[_i0];
- bool _a1 = above[_i1];
- bool _a2 = above[_i2];
- if (_a0 && _a1 && _a2)
- {
- a.triangles.Add(newTriangles[_i0]);
- a.triangles.Add(newTriangles[_i1]);
- a.triangles.Add(newTriangles[_i2]);
- }
- else if (!_a0 && !_a1 && !_a2)
- {
- b.triangles.Add(newTriangles[_i0]);
- b.triangles.Add(newTriangles[_i1]);
- b.triangles.Add(newTriangles[_i2]);
- }
- else
- {
- //....
- }
通过与原模型顶点索引的比较,我们将得到- for (int i = 0; i < edges.Count - 3; i++)
- {
- Vector3 t = edges[i + 1];
- Vector3 temp = edges[i + 3];
- for (int j = i + 2; j < edges.Count - 1; j += 2)
- {
- if ((edges[j] - t).sqrMagnitude < 1e-6)
- {
- edges[j] = edges[i + 2];
- edges[i + 3] = edges[j + 1];
- edges[j + 1] = temp;
- break;
- }
- if ((edges[j + 1] - t).sqrMagnitude < 1e-6)
- {
- edges[j + 1] = edges[i + 2];
- edges[i + 3] = edges[j];
- edges[j] = temp;
- break;
- }
- }
- edges.RemoveAt(i + 2);
- }
- edges.RemoveAt(edges.Count - 1);
这样我们就得到了一个按剖面形状连接的顺序顶点。- int count = triangles.Count / 3;
- for (int i = 0; i < count; i++)
- {
- int _i0 = triangles[i * 3];
- int _i1 = triangles[i * 3 + 1];
- int _i2 = triangles[i * 3 + 2];
- Vector3 v0 = vertices[_i0] - center + size / 2f;
- Vector3 v1 = vertices[_i1] - center + size / 2f;
- Vector3 v2 = vertices[_i2] - center + size / 2f;
- v0 = new Vector3(v0.x / size.x, v0.y / size.y, v0.z / size.z);
- v1 = new Vector3(v1.x / size.x, v1.y / size.y, v1.z / size.z);
- v2 = new Vector3(v2.x / size.x, v2.y / size.y, v2.z / size.z);
- Vector3 a = v0 - v1;
- Vector3 b = v2 - v1;
- Vector3 dir = Vector3.Cross(a, b);
- float x = Mathf.Abs(Vector3.Dot(dir, Vector3.right));
- float y = Mathf.Abs(Vector3.Dot(dir, Vector3.up));
- float z = Mathf.Abs(Vector3.Dot(dir, Vector3.forward));
- if (x > y && x > z)
- {
- uvs[_i0] = new Vector2(v0.z, v0.y);
- uvs[_i1] = new Vector2(v1.z, v1.y);
- uvs[_i2] = new Vector2(v2.z, v2.y);
- }
- else if (y > x && y > z)
- {
- uvs[_i0] = new Vector2(v0.x, v0.z);
- uvs[_i1] = new Vector2(v1.x, v1.z);
- uvs[_i2] = new Vector2(v2.x, v2.z);
- }
- else if (z > x && z > y)
- {
- uvs[_i0] = new Vector2(v0.x, v0.y);
- uvs[_i1] = new Vector2(v1.x, v1.y);
- uvs[_i2] = new Vector2(v2.x, v2.y);
- }
- }
联系客服