[Unity] Procedural Mesh (3)
Updated:
Requirements for Cube
- 6 sides = 6 quads
- Hard edges = quads need their own vertices
- 24 vertices, but only 8 vertex positions
Quads 구성을 위한 방식
- Hard code : 6 quads, vertices 모두 직접 타이핑하여 구현
- Procedural quads : 모두 자동화하여 빌드시에 구현
- Goldilocks quads : 최초의 8개의 정점을 하드코딩 후, quad 함수로 triangle 구현
Vertex 구성 방식
- 오른쪽이 X+, 앞쪽이 Z+, 윗쪽이 Y+
Composition of vertices |
CubeMeshData
public static Vector3[] vertices =
{
new Vector3( 1, 1, 1),
new Vector3(-1, 1, 1),
new Vector3(-1,-1, 1),
new Vector3( 1,-1, 1),
new Vector3(-1, 1,-1),
new Vector3( 1, 1,-1),
new Vector3( 1,-1,-1),
new Vector3(-1,-1,-1)
};
public static int[][] faceTriangles =
{
new int[] {0, 1, 2, 3},
new int[] {5, 0, 3, 6},
new int[] {4, 5, 6, 7},
new int[] {1, 4, 7, 2},
new int[] {5, 4, 1, 0},
new int[] {3, 2, 7, 6},
};
public static Vector3[] faceVertices(int dir, float scale, Vector3 pos)
{
Vector3[] fv = new Vector3[4];
for (int i = 0; i < fv.Length; i++)
{
fv[i] = vertices[faceTriangles[dir][i]] * scale + pos;
}
return fv;
}
- 정점(vertex) 8개를 하드코딩
- 각 면(face) 6개에 해당하는 정점 정의
- 각 면에 대한 정점 값 불러오는 함수 정의
Procedural cube
void MakeCube(float cubeScale, Vector3 cubePos)
{
vertices = new List<Vector3>();
triangles = new List<int>();
for (int i = 0; i < 6; i++)
{
MakeFace(i, cubeScale, cubePos);
}
}
void MakeFace(int dir, float faceScale, Vector3 facePos)
{
vertices.AddRange(CubeMeshData.faceVertices(dir, faceScale, facePos));
int vCount = vertices.Count;
triangles.Add(vCount - 4);
triangles.Add(vCount - 4 + 1);
triangles.Add(vCount - 4 + 2);
triangles.Add(vCount - 4);
triangles.Add(vCount - 4 + 2);
triangles.Add(vCount - 4 + 3);
}
- 각 면에 대한 triangle 2개를 구현하는 함수
- 각 면에 대한 vertex가 4개씩 추가되기 때문에 (vCount - 4) 적용
Cube |
Leave a comment