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.

CSG를 사용한 프로토타이핑 레벨

CSG는 **Constructive Solid Geometry**의 약자로, 기본 모양이나 사용자 정의 메시를 결합하여 더 복잡한 모양을 만드는 도구입니다. 3D 모델링 소프트웨어에서 CSG는 대부분 "부울 연산자"로 알려져 있습니다.

레벨 프로토타이핑은 Godot에서 CSG의 주요 용도 중 하나입니다. 이 기술을 사용하면 사용자는 기본 요소를 결합하여 가장 일반적인 모양을 만들 수 있습니다. 반전된 프리미티브를 사용하여 내부 환경을 만들 수 있습니다.

참고

Godot의 CSG 노드는 주로 프로토타입 제작을 위한 것입니다. UV 매핑 또는 3D 다각형 편집에 대한 기본 지원은 없습니다(밀출된 2D 다각형은 CSGPolygon3D 노드와 함께 사용할 수 있음).

프로젝트에 사용하기 쉬운 레벨 디자인 도구를 찾고 있다면 대신 FuncGodot 또는 `Cyclops Level Builder <https://github.com/blackears/cyclopsLevelBuilder>`__를 사용하는 것이 좋습니다.

더 보기

이 문서 외에 여러가지 Godot 데모 프로젝트들도 살펴보면 좋습니다.

CGS 노드 소개

Godot의 다른 기능과 마찬가지로 CSG는 노드 형태로 지원됩니다. CSG 노드는 다음과 같습니다.

  • CSGBox

  • CSGCylinder (원뿔도 지원)

  • CSGSphere3D

  • CSGTorus

  • CSGPolygon

  • CSGMesh

  • CSGCombiner

../../_images/csg_nodes.png ../../_images/csg_mesh.png

CSG 툴 기능

모든 CSG 노드는 3가지 종류의 부울 연산을 지원합니다.

  • 결합: 두 기본 요소의 형상이 병합되고 교차하는 형상이 제거됩니다.

  • 교차점: 교차하는 형상만 남고 나머지는 제거됩니다.

  • 뺄셈: 첫 번째 도형에서 두 번째 도형을 빼서 도형에 홈이 남습니다.

../../_images/csg_operation_menu.png ../../_images/csg_operation.png

CSG폴리곤

CSGPolygon3D 노드는 다음과 같은 방법으로 2D(X, Y 좌표)로 그려진 다각형을 따라 돌출됩니다.

  • 깊이: 지정된 양만큼 뒤로 돌출됩니다.

  • 회전: 원점을 중심으로 회전하면서 돌출됩니다.

  • 경로: 경로 노드를 따라 돌출됩니다. 이 작업을 일반적으로 로프팅이라고 합니다.

../../_images/csg_poly_mode.png ../../_images/csg_poly.png

참고

Path 모드가 작동하려면 Path3D 노드와 함께 제공되어야 합니다. 경로 노드에서 경로를 그리면 CSGPolygon3D의 다각형이 지정된 경로를 따라 돌출됩니다.

커스텀 메시

메시가 *다양체*인 한 :ref:`CSGMesh3D <class_CSGMesh3D>`에 사용자 정의 메시를 사용할 수 있습니다. 메시는 다른 소프트웨어에서 모델링하고 Godot로 가져올 수 있습니다. 다양한 재질이 지원됩니다.

메시를 CSG 메시로 사용하려면 다음이 필요합니다.

  • 닫혀 있음

  • 각 모서리가 두 면에만 연결되도록 하세요.

  • 볼륨이 있다

그리고 다음을 피하는 것이 좋습니다.

  • 마이너스 볼륨

  • 선택 항목 중앙으로

  • Godot 인터페이스

Godot는 CSG 메시를 구현하기 위해 manifold 라이브러리를 사용합니다. Godot에서 사용하는 "manifold"의 기술적 정의는 해당 라이브러리의 `"manifold" 정의 <https://github.com/elalish/manifold/wiki/Manifold-Library#manifoldness-definition>`__에서 수정된 다음과 같습니다:

모든 삼각형의 모든 가장자리는 정확히 하나의 다른 삼각형 가장자리와 동일한 두 개의 정점(인덱스 기준)을 포함해야 하며 시작 및 끝 정점은 이 두 가장자리 사이에서 위치를 전환해야 합니다. Godot 엔진 매니폴드 메시 외부에서 볼 때 삼각형 꼭지점은 시계 방향 순서로 나타나야 합니다.

../../_images/csg_custom_mesh.png

블렌더를 사용하여 기존 메쉬 매니폴드 만들기

아직 다양하지 않은 기존 메쉬가 있는 경우 블렌더를 사용하여 다양하게 만들 수 있습니다.

Blender에서 3D Print Toolbox 애드온을 설치하고 활성화하세요.

다양체를 만들고 싶은 메쉬를 선택하세요. 화살표를 클릭하여 사이드바를 엽니다.

../../_images/csg_manifold_step_1.webp

3D 인쇄 탭의 정리**에서 **다양체 만들기 버튼을 클릭합니다.

../../_images/csg_manifold_step_2.webp

이제 메시는 다양해지며 사용자 정의 메시로 사용할 수 있습니다.

CSGCombiner3D

CSGCombiner3D 노드는 구성에 사용되는 빈 모양입니다. 자식 노드 노드만 결합합니다.

처리 순서

모든 CSG 노드는 먼저 해당 자식 노드 노드 및 해당 작업(합집합, 교차점 또는 빼기)을 트리 순서로 처리하고 이를 차례로 자체에 적용합니다.

참고

성능을 위해서는 CSG 지오메트리가 비교적 단순하게 유지되어야 합니다. 복잡한 메시는 처리하는 데 시간이 걸릴 수 있기 때문입니다. 개체(예: 테이블 및 방 개체)를 함께 추가하는 경우 별도의 CSG 트리로 만듭니다. 단일 트리에 너무 많은 개체를 강제 적용하면 결국 성능에 영향을 미치기 시작합니다. 실제로 필요한 경우에만 이진 연산을 사용하십시오.

레벨 프로토타이핑

CSG 도구 사용을 연습할 수 있는 공간을 프로토타입으로 만들어 보겠습니다.

직교 투영으로 작업하면 CSG 모양을 결합할 때 더 나은 보기가 제공됩니다.

우리 레벨에는 다음과 같은 개체가 포함됩니다.

  • 방,

  • 침대,

  • 램프,

  • 책상,

  • 책장.

만들기 및 Node3D 노드를 루트 노드로 사용하는 씬.

환경의 기본 조명은 일부 각도에서 명확한 음영을 제공하지 않습니다. 3D 뷰포트 메뉴에서 **Display Overdraw**를 사용하여 디스플레이 모드를 변경하거나 DirectionalLight 노드를 추가하여 명확하게 볼 수 있습니다.

../../_images/csg_overdraw.png

CSGBox3D를 만들기로 지정하고 이름을 ``room``로 지정하고 **얼굴 반전**을 활성화하고 방의 크기를 변경하세요.

../../_images/csg_room.png ../../_images/csg_room_invert.png

다음으로 CSGCombiner3D를 생성하고 이름을 ``desk``로 지정합니다.

책상에는 표면이 하나이고 다리가 4개 있습니다.

  • 만들기 1 CSGBox3D 자식 노드 노드 in Union mode for the surface and adjust the dimensions.

  • 만들기 4 CSGBox3D 자식 노드 노드 Union 모드에서 다리를 만들고 치수를 조정합니다.

책상과 비슷하게 배치를 조정합니다.

../../_images/csg_desk.png

참고

CSGCombiner3D 내부의 CSG 노드는 결합기 내에서만 작업을 처리합니다. 따라서 CSGCombiner3D는 CSG 노드를 구성하는 데 사용됩니다.

만들기를 CSGCombiner3D로 지정하고 이름을 ``bed``로 지정합니다.

우리 침대는 침대, 매트리스, 베개의 세 부분으로 구성되어 있습니다. 만들기를 CSGBox3D로 만들고 침대 크기를 조정합니다. 만들기 또 다른 CSGBox3D를 선택하고 매트리스 크기를 조정합니다.

../../_images/csg_bed_mat.png

``bed``의 하위 항목으로 ``pillow``라는 또 다른 CSGCombiner3D를 생성합니다. 씬 트리는 다음과 같아야 합니다.

../../_images/csg_bed_tree.png

Union 모드에서 3개의 CSGSphere3D 노드를 결합하여 베개를 만듭니다. 구의 Y축 크기를 조정하고 **Smooth Faces**를 활성화합니다.

../../_images/csg_pillow_smooth.png

pillow 노드를 선택하고 모드를 **뺄셈**으로 전환합니다. 결합된 구체는 매트리스에 구멍을 뚫습니다.

../../_images/csg_pillow_hole.png

pillow 노드를 루트 Node3D 노드로 다시 부모로 지정해 보십시오. 구멍이 사라질 것입니다.

참고

이는 CSG 처리 순서의 효과를 설명하기 위한 것입니다. 루트 노드는 CSG 노드가 아니므로 CSGCombiner3D 노드는 작업의 끝입니다. 이는 CSGCombiner3D를 사용하여 CSG 씬을 구성하는 방법을 보여줍니다.

만든 침대는 다음과 같아야 합니다:

../../_images/csg_bed.png

만들기를 CSGCombiner3D로 지정하고 이름을 ``lamp``로 지정합니다.

램프는 스탠드, 기둥, 갓의 세 부분으로 구성됩니다. 만들기 a CSGCylinder3D, Cone 옵션을 활성화하고 스탠드로 만듭니다. 만들기 또 다른 CSGCylinder3D를 만들고 치수를 조정하여 기둥으로 사용합니다.

../../_images/csg_lamp_pole_stand.png

갓에는 CSGPolygon3D를 사용하겠습니다. CSGPolygon3D의 회전 모드를 사용하고 **전면 보기**(숫자 키패드 1)에 있는 동안 `사다리꼴 <https://en.wikipedia.org/wiki/Trapezoid>`_을 그립니다. 이 모양은 원점 주위로 돌출되어 갓을 형성합니다.

../../_images/csg_lamp_spin.png ../../_images/csg_lamp_polygon.png ../../_images/csg_lamp_extrude.png

3개 부품의 위치를 조정하여 램프처럼 보이도록 합니다.

../../_images/csg_lamp.png

만들기를 CSGCombiner3D로 지정하고 이름을 ``bookshelf``로 지정합니다.

책장에는 3개의 CSGBox3D 노드를 사용하겠습니다. 만들기 a CSGBox3D 및 치수 조정 이것이 책장의 크기가 됩니다.

../../_images/csg_shelf_big.png

CSGBox3D를 복제하고 각 축의 치수를 줄인 다음 모드를 **뺄셈**으로 변경합니다.

../../_images/csg_shelf_subtract.png ../../_images/csg_shelf_subtract_menu.png

선반을 거의 만들었습니다. 만들기 선반을 두 레벨로 나누기 위한 CSGBox3D가 하나 더 있습니다.

../../_images/csg_shelf.png

방에 가구를 원하는 장소에 배치하고 씬은 다음과 같아야 합니다:

../../_images/csg_room_result.png

Godot의 CSG 도구를 사용하여 방 수준의 프로토타입을 성공적으로 만들었습니다. CSG 도구는 미로나 도시와 같은 모든 종류의 레벨을 디자인하는 데 사용할 수 있습니다. 게임을 디자인할 때 한계점을 살펴보세요.

행성 텍스처 만들기

Godot의 :ref:`doc_standard_material_3d`는 왜곡 없이 임의의 개체에 텍스처를 자동으로 적용하는 데 사용할 수 있는 *3면 매핑*을 지원합니다. Godot는 아직 CSG 노드에서 UV 맵 편집을 지원하지 않기 때문에 CSG를 사용할 때 편리합니다. 삼면 매핑은 상대적으로 느리기 때문에 일반적으로 지형과 같은 유기적 표면으로의 사용이 제한됩니다. 그래도 프로토타이핑할 때 CSG 기반 레벨에 텍스처를 빠르게 적용하는 데 사용할 수 있습니다.

참고

프로토타입 제작에 텍스처가 필요한 경우 Kenney는 `CC0 라이센스 프로토타입 텍스처 세트 <https://kenney.nl/assets/prototype-textures>`__를 만들었습니다.

이렇게 하고 싶어하는 몇 가지 이유가 있습니다:

  • CSGCombiner3D 노드에 재료 재정의로 적용합니다(인스펙터의 형상 > 재료 재정의). 이는 자동으로 자식 노드에 영향을 주지만 개별 자식 노드의 재료를 변경할 수 없게 됩니다.

  • 개별 노드(인스펙터의 재료)에 재료를 적용합니다. 이러한 방식으로 각 CSG 노드는 고유한 모양을 가질 수 있습니다. 빼기 CSG 노드는 "파고 있는" 노드에 재료를 적용합니다.

CSG 노드에 삼면 매핑을 적용하려면 해당 항목을 선택하고 인스펙터로 이동하여 재료 재정의**(또는 개별 CSG 노드의 경우 **재료) 옆에 있는 [empty] 텍스트를 클릭합니다. 새 표준재료3D**를 선택합니다. 편집하려면 새로 생성된 재질의 아이콘을 클릭하세요. **Albedo 섹션을 펼치고 Texture 속성에 텍스처를 로드합니다. 이제 Uv1 섹션을 펼치고 Triplanar**를 확인하세요. 바로 위의 **ScaleOffset 속성을 사용하여 각 축의 텍스처 오프셋과 배율을 변경할 수 있습니다. Scale 속성의 값이 높을수록 텍스처가 더 자주 반복됩니다.

StandardMaterial3D를 복사하여 CSG 노드에서 재사용할 수 있습니다. 이렇게 하려면 인스펙터의 재료 속성 옆에 있는 드롭다운 화살표를 클릭하고 **복사**를 선택합니다. 붙여넣으려면 재질을 적용할 노드를 선택하고 해당 재질 속성 옆에 있는 드롭다운 화살표를 클릭한 다음 **붙여넣기**를 선택하세요.

MeshInstance3D로 변환하기

Godot 4.4부터 CSG 노드 및 해당 자식 노드를 MeshInstance3D 노드로 변환할 수 있습니다.

이렇게 하려는 이유가 몇 가지 있습니다:

  • MeshInstance3D에서 UV2가 생성될 수 있으므로 라이트맵을 굽습니다.

  • 오클루전 컬링 베이크 프로세스는 MeshInstance3D만 고려하므로 오클루전 컬링을 굽습니다.

  • 씬이 로드될 때 CSG 메시를 더 이상 다시 구축할 필요가 없으므로 로딩 시간이 더 빨라집니다.

  • 다른 CSG 노드 내에서 메시를 사용하는 경우 노드 변환을 업데이트할 때 성능이 향상됩니다.

CSG 노드를 MeshInstance3D 노드로 변환하려면 이를 선택한 다음 도구 모음에서 CSG > Bake Mesh Instance**를 선택합니다. MeshInstance3D 노드가 형제로 생성됩니다. 베이킹에 사용된 CSG 노드는 자동으로 숨겨지지 **않으므로 해당 형상이 새로 생성된 MeshInstance3D와 겹치지 않도록 숨겨야 합니다.

**CSG > Bake Collision Shape**를 사용하여 트리메시 충돌 모양을 만들 수도 있습니다. 생성된 CollisionShape3D 노드가 유효하려면 StaticBody3D 또는 AnimatableBody3D 노드의 하위여야 합니다.

씬 트리에 원본 CSG 노드를 유지하여 필요할 경우 나중에 형상을 변경할 수 있도록 하십시오. 형상을 변경하려면 MeshInstance3D 노드를 제거하고 루트 CSG 노드를 다시 표시하십시오.

배열 내보내기

CSG를 사용하여 레벨을 차단한 다음 이를 3D 모델로 내보내고 3D 모델링 소프트웨어로 가져오는 것이 유용할 수 있습니다. **씬 > 다른 이름으로 내보내기... > glTF 2.0 씬**를 선택하여 이 작업을 수행할 수 있습니다.

../../_images/export_as_gltf.webp