// Vertices in clockwise order genrate face towards you public void GenerateMesh() { if (meshFilter == null || resolution < 3) { return; } Vector3[] vertices = new Vector3[resolution * 4]; Vector2[] uvs = new Vector2[resolution * 4]; float realWidth = width / radius; float realHeight = height / radius; for (int i = 0; i < resolution; i++) { float angle = i * Mathf.PI * 2 / resolution; vertices[i * 4 + 0] = Mobius.Circle(angle, -realWidth, -realHeight) * radius; vertices[i * 4 + 1] = Mobius.Circle(angle, realWidth, -realHeight) * radius; vertices[i * 4 + 2] = Mobius.Circle(angle, -realWidth, realHeight) * radius; vertices[i * 4 + 3] = Mobius.Circle(angle, realWidth, realHeight) * radius; uvs[i * 4 + 0] = new Vector2(0, i * uvScale); uvs[i * 4 + 1] = new Vector2(1, i * uvScale); uvs[i * 4 + 2] = new Vector2(1, i * uvScale); uvs[i * 4 + 3] = new Vector2(0, i * uvScale); } int[] triangles = new int[resolution * 12]; for (int i = 0; i < resolution - 1; i++) { // frontside triangles[i * 12 + 0] = i * 4 + 4; triangles[i * 12 + 1] = i * 4 + 0; triangles[i * 12 + 2] = i * 4 + 1; triangles[i * 12 + 3] = i * 4 + 1; triangles[i * 12 + 4] = i * 4 + 5; triangles[i * 12 + 5] = i * 4 + 4; // backside triangles[i * 12 + 6] = i * 4 + 2; triangles[i * 12 + 7] = i * 4 + 6; triangles[i * 12 + 8] = i * 4 + 7; triangles[i * 12 + 9] = i * 4 + 7; triangles[i * 12 + 10] = i * 4 + 3; triangles[i * 12 + 11] = i * 4 + 2; } // last frontside triangles[resolution * 12 - 12] = 2; triangles[resolution * 12 - 11] = resolution * 4 - 4; triangles[resolution * 12 - 10] = resolution * 4 - 3; triangles[resolution * 12 - 9] = resolution * 4 - 1; triangles[resolution * 12 - 8] = 1; triangles[resolution * 12 - 7] = 0; // last backside triangles[resolution * 12 - 6] = resolution * 4 - 4; triangles[resolution * 12 - 5] = 2; triangles[resolution * 12 - 4] = 3; triangles[resolution * 12 - 3] = 1; triangles[resolution * 12 - 2] = resolution * 4 - 1; triangles[resolution * 12 - 1] = resolution * 4 - 2; Mesh mesh = new Mesh { vertices = vertices, uv = uvs, triangles = triangles }; mesh.RecalculateNormals(); meshFilter.mesh = mesh; }
public Vector3 GetMobiusPosition(float u, float v, float w = 0) { return(transform.position + transform.rotation * Mobius.Circle(u, v / radius, w / radius) * radius); }