[Unity] 정점이 8개인 Cube 만들기
유니티 큐브의 정점갯수는 기본적으로 24개다.
정점 8개만 이용해도 큐브를 만들 수 있지 않나 싶어서 만들어보았다.
Cube 만들기
vertex 순서
우선 정점을 만들어준다. 정점의 순서는 위와 같이 정했으며 이를 구현한다.
float halfWidth = width / 2;
float halfHeight = height / 2;
List<Vector3> vertexs = new List<Vector3>();
vertexs.Add(new Vector3(-halfWidth, -halfHeight, -halfWidth));
vertexs.Add(new Vector3(-halfWidth, -halfHeight, halfWidth));
vertexs.Add(new Vector3(-halfWidth, halfHeight, halfWidth));
vertexs.Add(new Vector3(-halfWidth, halfHeight, -halfWidth));
vertexs.Add(new Vector3(halfWidth, -halfHeight, -halfWidth));
vertexs.Add(new Vector3(halfWidth, -halfHeight, halfWidth));
vertexs.Add(new Vector3(halfWidth, halfHeight, halfWidth));
vertexs.Add(new Vector3(halfWidth, halfHeight, -halfWidth));
vertex 정보를 토대로 triangle를 지정하여준다.
방향은 시계방향으로 해야 큐브 바깥쪽 방향으로 메쉬가 생성된다.
List<int> triangles = new List<int>()
{
0,1,3,3,1,2,
0,3,4,3,7,4,
7,6,5,7,5,4,
6,2,1,6,1,5,
6,3,2,6,7,3,
5,1,0,5,0,4
};
이렇게 생성한 정보를 토대로 Mesh에 옮겨준다.
mesh.vertices = vertexs.ToArray();
mesh.triangles = triangles.ToArray();
mesh.RecalculateBounds();
GetComponent<MeshFilter>().mesh = mesh;
전체 코드
void GenerateCube(float width, float height)
{
Mesh mesh = new Mesh();
float halfWidth = width / 2;
float halfHeight = height / 2;
List<Vector3> vertexs = new List<Vector3>();
vertexs.Add(new Vector3(-halfWidth, -halfHeight, -halfWidth));
vertexs.Add(new Vector3(-halfWidth, -halfHeight, halfWidth));
vertexs.Add(new Vector3(-halfWidth, halfHeight, halfWidth));
vertexs.Add(new Vector3(-halfWidth, halfHeight, -halfWidth));
vertexs.Add(new Vector3(halfWidth, -halfHeight, -halfWidth));
vertexs.Add(new Vector3(halfWidth, -halfHeight, halfWidth));
vertexs.Add(new Vector3(halfWidth, halfHeight, halfWidth));
vertexs.Add(new Vector3(halfWidth, halfHeight, -halfWidth));
List<Vector2> uvs = new List<Vector2>
{
new Vector2(0f, 1f), new Vector2(1f,1f),
new Vector2(0f, 0f), new Vector2(1f,0f),
new Vector2(0f, 1f), new Vector2(1f,1f),
new Vector2(0f, 0f), new Vector2(1f,0f)
};
List<int> triangles = new List<int>()
{
0,1,3,3,1,2,
0,3,4,3,7,4,
7,6,5,7,5,4,
6,2,1,6,1,5,
6,3,2,6,7,3,
5,1,0,5,0,4
};
mesh.vertices = vertexs.ToArray();
mesh.triangles = triangles.ToArray();
mesh.RecalculateBounds();
GetComponent<MeshFilter>().mesh = mesh;
}
완성된 정점8개 큐브
단점
정점 8개만 있어도 큐브를 만들 수 있지만 문제는 uv를 통한 라이팅과 Material 표현이 불가능했다.
List<Vector2> uvs = new List<Vector2>
{
new Vector2(0f, 1f), new Vector2(1f,1f),
new Vector2(0f, 0f), new Vector2(1f,0f),
new Vector2(0f, 1f), new Vector2(1f,1f),
new Vector2(0f, 0f), new Vector2(1f,0f)
};
깨져버린 Material
원인
이는 uv하나가 표현해야할 면이 3개이지만 1개를 초과하는 정보를 담당할 수 없기 떄문이다. 각 면마다 사용해야할 uv 정보가 다 다른데 겹쳐서 저렇게 깨져버린 것이다.
그래서 유니티에선 정점을 24개로 구현해 각 면마다 사용할 uv정보를 담아주었다.
유니티 Cube
댓글남기기