본문 바로가기
유니티

[Unity] 메쉬 만들기

by Minok_nok 2021. 11. 18.

개요

작년에 후배들을 가르쳐 줄 수 있는 기회가 생겨서, 준배했었던 자료들입니다.

드라이브에 썩고 있는게 아까워서 설명과 함께 올리면 좋을듯 합니다.

서론

이번에 같이 알아 볼 것은 Unity에서 3D를 표현하기 위한 최소 단위인, 버텍스와 버텍스로 이루어져 있는 메쉬를 알아 볼 예정입니다.

간단한 3D지식을 알기위해서 필요한 요소들이니, 앞으로 올라올 자료들을 같이 보기에 꼭 필요합니다.

정점, 폴리곤, 메쉬

일단 메쉬부터 봅시다.

저는 메쉬를 '폴리곤, UV 등 3D 객체를 관리하는 구조체'라고 정의하도록 하겠습니다.

위 그림과 같이 정점들이 모여 삼각형 폴리곤이 되고, 그 폴리곤이 모여서 주전자 모양의 메쉬가 만들어진것을 볼 수 있습니다.

 

그럼 이제 메쉬를 이루고 있는 정점과 폴리곤에 대해서도 이야기를 해 봅시다.

 

좌측 정육면체는 정육면체 메쉬라고도 할수 있습니다.

정육면체 메쉬는 여러개의 삼각형(폴리곤)으로 이루어져 있습니다.

 

우측 삼각형, 즉 폴리곤은 다수의 버텍스(점)으로 이루어져있습니다.

저희는 위와 같은 도형들을 만들 때, 버텍스(점)의 위치를 하나하나씩 잡으면서 만들어야 합니다.

폴리곤을 만들어 봅시다.

(4) - 폴리곤의 구성요소

저희는 폴리곤을 만들기 전에, 폴리곤이 어떤 데이터 값을 가지고 만들어지는지를 확인 해 봐야합니다.

방금 버텍스가 모여서 하나의 폴리곤이 된다고 하였습니다.

 

그렇기 때문에 버텍스의 위치를 잘 잡는것이 중요합니다.

 

버텍스는 [ 위치 값 / 순서 ]를 가지고 있습니다.

이는 버텍스의 최소 단위일 뿐, 다른 정보값을 가질 수 있습니다.

 

일단 위치 값 자체는 직관적으로 이해가 가실 수 있을겁니다.

위 이미지는 (0,1,0), (1,-1,0), (-1,-1,0) (왼손 좌표계, x y z 기준 값)위치를 가지고 있는 버텍스의 모음인 삼각형입니다.

 

방금 위치 값 / 순서 중 위치 값을 설명했으니, 이번엔 순서를 이야기 할 차례입니다.

3D 객체에는 앞면, 뒷면 이라는 개념이 있습니다.

 

물체 면의 방향을 알아야 추후 있을 연산들을 수행 할 수 있기 때문에 잘 설정 해주어야 합니다.

 

그러면 물체의 앞면은 어떻게 정하냐면, 버텍스의 순서가 시계방향으로 돌아갈 때 앞면입니다.

위 (4)번 이미지를 보면, 순서가 위쪽부터 시계방향으로 0->1->2로 지정이 되어있음을 볼 수 있습니다.

그렇기 때문에 저희가 보고 있는 (4)이미지의 삼각형은 정면부분을 보고 있다고 이야기 할 수 있습니다.

 

Unity에서는 기본적으로 물체의 뒷면은 보이지 않게 Culling을 합니다.

 

예, 만들어 봅시다.

 

일단 빈 오브젝트를 만들고, MeshRenderer와 Mesh Filter을 추가시킵니다.

Unity 2D에서는 SpriteRenderer 컴포넌트가 Sprite를 렌더링 해주는 로직을 수행해 주었다면, MeshRenderer는 3DMesh를 렌더링 해주는 로직을 수행시켜 줍니다.

 

유니티 MeshRenderer 문서에서 볼 수 있는 MeshRenderer의 설명입니다.

MeshFilter에서 사용하는 메쉬정보를 사용한다는 점, Unity Object의 Transform 컴포넌트의 위치를 사용한다는 점을 알 수 있습니다.

 

유니티 MeshFilter 문서에서 볼 수 있는 MeshFilter의 설명입니다.

설명을 보면 MeshFilter의 존재 의의 자체가 MeshRenderer을 위해서 존재함을 알 수 있습니다.

 

MeshFilter는 Unity Asset들 중 Mesh만 참조 할 수 있습니다.

 

하나의 폴리곤 메쉬를 만드는 코드입니다.

public class CustomMeshCreater : MonoBehaviour
{
    [SerializeField] private MeshFilter meshFilter
    
    public void Start()
    {
    	Creating();
    }
    
    public void Creating()
    {
    	Mesh mesh = new Mesh();
        
        Vector3[] vertices = new Vector3[]
        {
            new Vector3(0,1,0),
            new Vector3(1,-1,0),
            new Vector3(-1,-1,0)
        };
        
        int[] indexes = new int[]{ 0, 1, 2 };
        
        mesh.vertices = vertices;
        mesh.triangles = indexes;
        
        meshFilter.mesh = mesh;
    }
}

 

MeshFilter를 참조하고 있으며, Create함수를 통하여 메쉬 생성 및 적용을 시켜줍니다.

 

Mesh class안에 버텍스의 위치값인 vertices와 순서값인 triangles를 넣어줍니다.

그리고 만들어진 mesh를 참조중인 MeshFilter 안에 넣어줍니다.

Vector3배열인 vertices입니다.

이 배열은 폴리곤 메쉬의 위치를 저장합니다.

 

버텍스의 순서를 저장하는 int배열 indexes입니다.

index와 vertex는 같은 배열 순서를 가지고 있기 때문에, 위 그림과 같이 0번째 인덱스의 vertices, indexes가 한 쌍으로 묶입니다.

 

그렇기 때문에 위치와 순서를 잘 이해하고 배치해야 문제가 생기지 않습니다.

 

해당 스크립트를 적용시킨 뒤, MeshFilter를 참조시켜줍니다.

그 후 실행을 시켜주면 마젠타 색의 삼각형 메쉬가 렌더링됩니다.

 

 

댓글