절차적 메시(Procedural Mesh)를 이용하여 기본 도형 삼각형을 그려보자.
면을 만드는 기본 요소는 삼각형이고 세 점이 필요하다.
세 점이 있으면 평면이 하나 정해지기 때문이다.
여기서 PrimitiveType 도형 중 하나인 쿼드를 생성해서 인스펙터를 보자.
Mesh Filter와 Mesh 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에서 확인 가능하다.
Unity Plus:
Unity Pro:
Unity 프리미엄 학습:
'개발 > Unity' 카테고리의 다른 글
유니티 - 절차적 메시의 양면 렌더링 (Double Sided Rendering with Procedural Mesh) (0) | 2022.10.30 |
---|---|
유니티 - 절차적 메시 기준점 설정하기 (Setting Offset with Procedural Mesh) (1) | 2022.10.30 |
유니티 - 퍼블릭 변수 변경시 이벤트 발생 (Public Value Event Handler) (0) | 2022.10.29 |
유니티 - 오목 다각형의 삼각분할 (Polygon Triangulation) (0) | 2022.10.29 |
유니티 - 2차원 평면에서 유한한 선의 교점 구하기 (Intersection of Two Finite Lines in 2-Dimension) (0) | 2022.10.29 |
댓글