1 분 소요

유니티 큐브의 정점갯수는 기본적으로 24개다.

정점 8개만 이용해도 큐브를 만들 수 있지 않나 싶어서 만들어보았다.

Cube 만들기

imagevertex 순서

우선 정점을 만들어준다. 정점의 순서는 위와 같이 정했으며 이를 구현한다.

    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;
    }

image완성된 정점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)
    };

image깨져버린 Material


원인

이는 uv하나가 표현해야할 면이 3개이지만 1개를 초과하는 정보를 담당할 수 없기 떄문이다. 각 면마다 사용해야할 uv 정보가 다 다른데 겹쳐서 저렇게 깨져버린 것이다.

그래서 유니티에선 정점을 24개로 구현해 각 면마다 사용할 uv정보를 담아주었다.

image유니티 Cube

댓글남기기