개발/Unity

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

피로물든딸기 2022. 10. 30. 15:02
반응형

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

반응형