Attention: Here be dragons
This is the latest
(unstable) version of this documentation, which may document features
not available in or compatible with released stable versions of Godot.
Checking the stable version of the documentation...
절차적 기하
Godot에서 절차적으로 지오메트리를 생성하는 여러 가지 방법이 있습니다. 이 튜토리얼에서는 그 중 몇 가지를 살펴봅니다. 각각의 기법에는 장단점이 있으므로, 각 기법과 이를 주어진 상황에서 어떻게 활용할지 이해하는 것이 가장 좋습니다.
참고
여기 설명된 모든 절차적 지오메트리 생성 방법은 CPU에서 실행됩니다. Godot는 아직 GPU에서의 절차적 지오메트리 생성을 지원하지 않습니다.
지오메트리란?
지오메트리는 모양을 표현하는 유식한 말입니다. 컴퓨터 그래픽에서, 지오메트리는 일반적으로 "꼭짓점"이라고 하는 좌표들의 배열로 표현됩니다. Godot에서는, 지오메트리가 메시로 표현됩니다.
메시란?
Godot의 많은 것들은 다음과 같이 이름 속에 Mesh를 포함합니다... Mesh, ArrayMesh, ImmediateMesh, MeshInstance3D, MultiMesh, MultiMeshInstance3D. 이것들은 모두 서로 연관되어 있지만, 사용되는 곳이 조금씩 다릅니다.
메시와 ArrayMesh는 MeshInstance3D 노드로 그려지는 리소스입니다. 메시나 ArrayMesh와 같은 리소스는 씬에 직접 추가될 수 없습니다. MeshInstance3D는 씬에서 메시 하나의 인스턴스를 나타냅니다. 하나의 메시를 여러 MeshInstance3D에 재사용하여 제각기 다른 머티리얼과 변형(스케일, 회전, 위치 등) 으로 씬의 서로 다른 부분을 그릴 수 있습니다.
동일한 오브젝트를 여러 번 그리려는 경우, MultiMeshInstance3D와 MultiMesh를 사용하면 좋을 것입니다. MultiMeshInstance3D 는 하드웨어 인스턴싱의 장점을 가져가며 매우 저렴하게 수천 번의 메시를 그려냅니다. MultiMeshInstance3D를 사용할 때의 단점은 모든 인스턴트에 대해 각 메시의 표면이 하나의 머티리얼로 제한된다는 것입니다. 인스턴스 배열을 사용하여 각 인스턴스에 대해 다양한 색상과 변형을 저장하지만, 모든 인스턴스의 표면은 같은 머티리얼을 사용합니다.
메시란
메시는 하나 이상의 표면으로 구성됩니다. 표면은 꼭짓점, 노멀, UV 등의 정보를 포함하는 여러 개의 부분 배열로 이루어진 배열입니다. 일반적으로 표면과 메시를 구성하는 과정은 RenderingServer에서 사용자로부터 숨겨지나, ArrayMesh를 사용하면 표면 정보를 포함하는 배열을 전달함으로써 유저가 메시를 직접 구성할 수 있습니다.
표면
각 표면은 자신만의 머티리얼을 가집니다. 혹은, MeshInstance3D를 사용할 때 속성 material_override로 메시 모든 표면의 머티리얼을 오버라이드할 수 있습니다.
표면 배열
표면 배열은 ArrayMesh.ARRAY_MAX만큼의 길이를 가지는 배열입니다. 배열의 각 위치는 매 버텍스의 정보를 포함하는 배열로 이루어져 있습니다. 예를 들어, ArrayMesh.ARRAY_NORMAL에 위치한 배열은 버텍스 노멀의 PackedVector3Array입니다. 자세한 정보는 Mesh.ArrayType을 참조하세요.
표면 배열은 인덱싱되거나 인덱싱되지 않을 수 있습니다. 인덱스가 없는 배열을 생성하는 것은 인덱스 ``ArrayMesh.ARRAY_INDEX``에 배열을 할당하지 않는 것만큼 쉽습니다. 인덱스되지 않은 배열은 모든 삼각형에 대한 고유한 꼭지점 정보를 저장합니다. 즉, 두 삼각형이 꼭지점을 공유할 때 꼭지점이 배열에 중복됩니다. 인덱스된 표면 배열은 각 고유 정점에 대한 정점 정보만 저장하고 정점 배열에서 삼각형을 구성하는 방법을 매핑하는 인덱스 배열도 저장합니다. 일반적으로 인덱스 배열을 사용하는 것이 더 빠르지만 이는 삼각형 간에 정점 데이터를 공유해야 함을 의미하며 이는 항상 바람직한 것은 아닙니다(예: 면당 법선을 원하는 경우).
툴
Godot는 기하학에 접근하고 작업하는 다양한 방법을 제공합니다. 각각에 대한 자세한 내용은 다음 자습서에서 제공됩니다.
ArrayMesh
ArrayMesh 리소스는 메시를 확장하여 몇 가지 다양한 삶의 질 기능을 추가하고, 가장 중요하게는 스크립팅을 통해 메시 표면을 구성하는 기능을 추가합니다.
ArrayMesh에 대한 자세한 정보는 ArrayMesh 튜토리얼을 참조해 주세요.
메시데이터도구
MeshDataTool은 메쉬 데이터를 런타임에 수정할 수 있는 정점, 면 및 가장자리 배열로 변환하는 리소스입니다.
MeshDataTool에 대한 자세한 정보는 MeshDataTool 튜토리얼을 참조해 주세요.
표면 도구
SurfaceTool을 사용하면 OpenGL 1.x 즉시 모드 스타일 인터페이스를 사용하여 메시를 생성할 수 있습니다.
SurfaceTool에 대한 자세한 정보는 SurfaceTool 튜토리얼을 참조해 주세요.
ImmediateMesh
ImmediateMesh는 즉시 모드 스타일 인터페이스(예: SurfaceTool)를 사용하여 객체를 그리는 메시입니다. ImmediateMesh와 SurfaceTool의 차이점은 ImmediateMesh는 코드를 사용하여 동적으로 직접 그리는 반면, SurfaceTool은 원하는 작업을 수행할 수 있는 메시를 생성하는 데 사용된다는 것입니다.
ImmediateMesh는 API가 간단하기 때문에 프로토타입 제작에 유용하지만 변경할 때마다 형상이 다시 작성되므로 속도가 느립니다. 시각적 디버깅을 위해 간단한 형상을 추가하는 데 가장 유용합니다(예: 물리 레이캐스트를 시각화하기 위해 선을 그리는 등).
ImmediateMesh에 대한 자세한 정보는 ImmediateMesh 튜토리얼을 참조해 주세요.
어떤 이동 메서드를 사용해야 할까요?
어떤 접근 방식을 사용하는지는 수행하려는 작업과 편리한 절차에 따라 다릅니다.
SurfaceTool과 ArrayMesh는 모두 시간이 지나도 변하지 않는 정적 형상(메시)을 생성하는 데 탁월합니다.
ArrayMesh를 사용하는 것은 SurfaceTool을 사용하는 것보다 약간 빠르지만 API는 조금 더 어렵습니다. 또한 SurfaceTool에는 generate_normals() 및 ``index()``와 같은 몇 가지 삶의 질 방법이 있습니다.
ImmediateMesh는 ArrayMesh와 SurfaceTool보다 더 제한적입니다. 그러나 어쨌든 매 프레임을 변경하기 위해 지오메트리가 필요한 경우 매 프레임마다 ArrayMesh를 생성하는 것보다 약간 더 빠를 수 있는 훨씬 쉬운 인터페이스를 제공합니다.
MeshDataTool은 빠르지는 않지만 다른 도구로는 얻을 수 없는 모든 종류의 메쉬 속성(가장자리, 면 등)에 액세스할 수 있습니다. 메시를 변환하기 위해 이러한 종류의 데이터가 필요할 때 매우 유용하지만 추가 정보가 필요하지 않은 경우에는 사용하지 않는 것이 좋습니다. MeshDataTool은 면 또는 가장자리 배열에 액세스해야 하는 알고리즘을 사용하려는 경우 가장 잘 사용됩니다.