본문 바로가기
개발/Unity

유니티 - 절차적 메시로 삼각형 그리기 (Make Triangle with Procedural Mesh)

by 피로물든딸기 2022. 10. 30.
반응형

Unity 전체 링크

 

절차적 메시(Procedural Mesh)를 이용하여 기본 도형 삼각형을 그려보자.


면을 만드는 기본 요소는 삼각형이고 세 점이 필요하다.

세 점이 있으면 평면이 하나 정해지기 때문이다.

 

여기서 PrimitiveType 도형 중 하나인 쿼드를 생성해서 인스펙터를 보자.

Mesh FilterMesh Renderer가 기본으로 추가되어 있다. (+ Collider)

 

Mesh Filter에는 각 정점(Vertex)에 대한 정보를 가지고 있다.

즉, 렌더링에 필요한 모든 정보를 Mesh Filter가 가진다.

 

그리고 Mesh Renderer는 Mesh Filter의 정보를 가지고 메시를 그린다.

메시를 그릴 때 정점의 순서는 상관 없지만, 시계 방향으로 만들어줘야 보이게 된다.

반시계 방향이라면 뒷면으로 볼 수 있다.

 

실제로 메시를 그려보면 뒷면에서는 보이지 않는다. (반시계로 그리면 뒷면에서 보인다.)

 

정점의 좌표Mesh Filter에서 vertices 배열이 관리하고, 순서triangles 배열이 관리한다.

vertices와 triangles에 정보를 잘 넣으면 메시를 그릴 수 있다.

 

이제 빈 오브젝트를 추가하고 ProceduralTriangle.cs를 추가하자.

메시를 그리기 위해 MeshRenderer와 MeshFilter가 반드시 필요하므로 Requirecomponent로 강제 설정하였다.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

[RequireComponent(typeof(MeshRenderer), typeof(MeshFilter))]
public class ProceduralTriangle : MonoBehaviour
{
    Mesh mesh;
    Vector3[] vertices;
    int[] triangles;

    void Start()
    {
        mesh = GetComponent<MeshFilter>().mesh;

        setMeshData();
        createProceduralMesh();
    }

    void setMeshData()
    {
        vertices = new Vector3[] {
            new Vector3(0, 0, 0),
            new Vector3(0.5f , 0, Mathf.Sqrt(3.0f) / 2.0f),
            new Vector3(1, 0, 0)};

        triangles = new int[] { 0, 1, 2 };
    }

    void createProceduralMesh()
    {
        mesh.Clear();
        mesh.vertices = vertices;
        mesh.triangles = triangles;
    }
}

 

정삼각형의 좌표 3개를 설정하고 triangles에 좌표의 시계방향 순서대로 vertices의 index를 넣는다.

    void setMeshData()
    {
        vertices = new Vector3[] {
            new Vector3(0, 0, 0),
            new Vector3(0.5f , 0, Mathf.Sqrt(3.0f) / 2.0f),
            new Vector3(1, 0, 0)};

        triangles = new int[] { 0, 1, 2 };
    }

 

좌표를 모두 만들었으므로 createProceduralMesh에서 mesh를 초기화하고 정보를 넣어준다.

    void createProceduralMesh()
    {
        mesh.Clear();
        mesh.vertices = vertices;
        mesh.triangles = triangles;
    }

 

아래와 같이 설정이 되면 게임을 실행해보자.

 

옆에 있는 쿼드와 다르게 분홍색(마젠타)의 메시가 형성되었다.

 

쿼드를 보면 Materials에 Default-Material이 설정된 것을 알 수 있다.

 

삼각형을 만드는 빈 오브젝트에도 Default-Material을 설정하자.

 

이제 삼각형이 만들어졌다. 

하지만 Quad와 달리 색상이 다르다.

 

이 현상은 빛의 연산을 담당하는 Normal Vector가 초기화된 상태이기 때문이다.

실제로 빛의 좌표를 변경하면 삼각형과 쿼드가 다르게 밝아지거나 어두워진다.

 

따라서 RecalculateNormals()를 이용해서 노멀을 다시 계산한다.

    void createProceduralMesh()
    {
        mesh.Clear();
        mesh.vertices = vertices;
        mesh.triangles = triangles;
        mesh.RecalculateNormals();
    }

 

게임을 실행하면 정삼각형이 만들어졌다.

 

마지막으로 AddComponent로 메시 콜라이더를 추가하자.

    void createProceduralMesh()
    {
        mesh.Clear();
        mesh.vertices = vertices;
        mesh.triangles = triangles;
        mesh.RecalculateNormals();

        this.gameObject.AddComponent<MeshCollider>();
    }

 

MeshRenderer를 꺼보면 콜라이더가 정상적으로 추가된 것을 알 수 있다.

 

최종 코드는 다음과 같다.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

[RequireComponent(typeof(MeshRenderer), typeof(MeshFilter))]
public class ProceduralTriangle : MonoBehaviour
{
    Mesh mesh;
    Vector3[] vertices;
    int[] triangles;

    void Start()
    {
        mesh = GetComponent<MeshFilter>().mesh;

        setMeshData();
        createProceduralMesh();
    }

    void setMeshData()
    {
        vertices = new Vector3[] {
            new Vector3(0, 0, 0),
            new Vector3(0.5f , 0, Mathf.Sqrt(3.0f) / 2.0f),
            new Vector3(1, 0, 0)};

        triangles = new int[] { 0, 1, 2 };
    }

    void createProceduralMesh()
    {
        mesh.Clear();
        mesh.vertices = vertices;
        mesh.triangles = triangles;
        mesh.RecalculateNormals();

        this.gameObject.AddComponent<MeshCollider>();
    }
}

 

위의 실행결과는 아래의 unitypackage에서 확인 가능하다.

ProceduralTriangle_Basic.unitypackage
0.00MB

 

Unity Plus:

 

Easy 2D, 3D, VR, & AR software for cross-platform development of games and mobile apps. - Unity Store

Have a 2D, 3D, VR, or AR project that needs cross-platform functionality? We can help. Take a look at the easy-to-use Unity Plus real-time dev platform!

store.unity.com

 

Unity Pro:

 

Unity Pro

The complete solutions for professionals to create and operate.

unity.com

 

Unity 프리미엄 학습:

 

Unity Learn

Advance your Unity skills with live sessions and over 750 hours of on-demand learning content designed for creators at every skill level.

unity.com

반응형

댓글