고도 엔진에서 MeshInstance2D ArrayMesh 사용 방법 - Whitmem
고도 엔진에서 MeshInstance2D ArrayMesh 사용 방법
Game Development
2025-02-12 23:46 게시 5f7e88c82c44235382e6

0
0
48
이 페이지는 외부 공간에 무단 복제할 수 없으며 오직 있는 그대로 게시되며 부정확한 내용을 포함할 수 있습니다. 법률이 허용하는 한 가이드 라인에 맞춰 게시 내용을 인용하거나 출처로 표기할 수 있습니다.
This page is not to be distributed to external services; it is provided as is and may contain inaccuracies.
MeshInstance2D, ArrayMesh
직접 어떤 객체를 생성하거나, 버텍스를 가지는 (Triangles 형태의) 메시를 생성하기 위해 ArrayMesh를 사용할 수 있다.
기본적으로 MeshInstance2D에 어떤 Mesh를 사용할 것인지 정의해야 한다. Mesh 종류는 매우 많은데... QuadMesh 같은 걸 사용하면 2D에서 바로 사용할 수 있다.
한가지 이상한거는... 3D 객체가 있다는 것인데, 이것이 그냥 2D 에 투영되어 표시되게끔 구현되는 것 같다... 왜 굳이 이렇게 되어있는지는 모르겠다.
아무튼, ArrayMesh 를 직접 코드상에서 만들어서 적용하는 방법에 대해 알아본다.
ArrayMesh 는 단순히 에디터 상에서 추가할 수는 없어보인다. 리소스로 가져오는 방법이 있어보이긴 하나, 여기서는 스크립트로 ArrayMesh를 선언하여 직접 버텍스를 기입하는 방법에 대해 설명한다.
먼저 ArrayMesh를 생성한다.
그리고 이 ArrayMesh 에 담길 arrays를 생성한다. arrays 는 실제 버텍스 정보가 담기는 공간이다. 그런데 버텍스 정보를 넣는 방법에 유의해야 한다.
arrays.Resize((int)Mesh.ArrayType.Max); //버텍스를 가져와서 정의한다. arrays[(int)Mesh.ArrayType.Vertex] = new Vertex2[] { ..., ..., ..., ...}
먼저 array의 0번 인덱스부터 차곡 차곡 넣는 것이 아니라, Mesh.ArrayType 을 통해 Vertex 또는 Index, TexUV 에 대한 메모리 배치 인덱스 위치를 가져와서 해당 인덱스에 vertex 2[] 쌍을 담아야 한다.
즉 Mesh.ArrayType.Vertex 는 내부적으로 사용하는 버텍스 쌍의 인덱스 위치인 것이고 해당 인덱스 위치에 버텍스 쌍을 저장해야 한다.
(int)Mesh.ArrayType.Vertex (int)Mesh.ArrayType.Index (int)Mesh.ArrayType.TexUV
3D 그래픽스를 공부했다면, Index와 TexUV가 무엇인지는 알 것이라 믿는다. 각각 인덱스에 [] 배열 값을 넣어주면 된다.
mesh.AddSurfaceFromArrays(Mesh.PrimitiveType.Triangles, arrays);
이후 Triangles 모드로 arrays 를 mesh 에 삽입하고, MeshInstance2D 의 Mesh 에 mesh를 적용한다.
ArrayMesh mesh = new ArrayMesh(); //실제 메시 버텍스 정보가 담기는 Array를 생성한다. Godot.Collections.Array arrays = new Godot.Collections.Array(); /*현재 array의 각 최대 값은 시스템상의 Array Type 최대로 지정한다. 즉 0번은 버텍스, 1번은 인덱스, 2번은 UV 등을 넣는 시스템 상의 인덱스이기에 이러한 작업을 수행한다.*/ arrays.Resize((int)Mesh.ArrayType.Max); //버텍스를 가져와서 정의한다. arrays[(int)Mesh.ArrayType.Vertex] = new Vertex2[]{ ... , ... , ... , ... } //4개의 버텍스에 대해 인덱스를 정의하여 삼각형 2개로 사각형을 구현한다. arrays[(int)Mesh.ArrayType.Index] = new int[] { 0, 1, 2, 0, 2, 3 }; //UV 를 기입한다., arrays[(int)Mesh.ArrayType.TexUV] = new Vertex2[]{ ... , ... , ... , ... } //삼각형 모드로 메시를 구성한다. mesh.AddSurfaceFromArrays(Mesh.PrimitiveType.Triangles, arrays); //메시를 반영한다. instance.Mesh = mesh;
댓글 0개
댓글은 일회용 패스워드가 발급되며 사이트 이용 약관에 동의로 간주됩니다.
확인
Whitmemit 개인 일지 블로그는 개인이 운영하는 정보 공유 공간으로 사용자의 민감한 개인 정보를 직접 요구하거나 요청하지 않습니다. 기본적인 사이트 방문시 처리되는 처리 정보에 대해서는 '사이트 처리 방침'을 참고하십시오. 추가적인 기능의 제공을 위하여 쿠키 정보를 사용하고 있습니다. Whitmemit 에서 처리하는 정보는 식별 용도로 사용되며 기타 글꼴 및 폰트 라이브러리에서 쿠키 정보를 사용할 수 있습니다.
이 자료는 모두 필수 자료로 간주되며, 사이트 이용을 하거나, 탐색하는 경우 동의로 간주합니다.