3D 씬 가져오기

Godot 씬 임포터

3D 애셋을 다룰 때, Godot는 유연하면서 설정할 수 있는 임포터를 가지고 있습니다.

Godot는 으로 작업합니다. 이는 즉, 좋아하는 3D DCC에서 작업한 전체 씬을 최대한 가깝게 전송한다는 것입니다.

Godot는 아래와 같은 3D 씬 파일 형식 을 지원합니다:

  • glTF 2.0 (권장). Godot은 텍스트(.gltf)와 이진 파일 형식 (.glb) 모두를 지원합니다.

  • DAE (COLLADA), 완전히 지원되는 오래단 파일 형식입니다.

  • OBJ (Wavefront) 형식 + MTL 재질 파일. 완전히 지원하지만, 꽤 제한적입니다 (피봇, 스켈레톤, 애니메이션, PBR 재질 등을 지원하지 않음).

  • ESCN, Blender에서 플러그인으로 내보낼 수 있는 Godot-specific한 형식입니다.

  • FBX, 공개 에셋 가져오기 라이브러리를 통해 지원됩니다. 하지만, FBX는 사유 소프트웨어이므로 워크플로우에 적합한 경우, 위에 나열된 다른 형식을 사용하는 것이 좋습니다.

텍스처와 씬 파일을 함께 프로젝트 저장소에 복사하면 Godot가 완전히 가져올 것입니다.

메시를 내보낼 때, 메시가 본에 의해 형태가 변하지 않는 것이 중요합니다. 좋아하는 3D 편집기에서 메시를 내보낼 때, 스켈레톤이 기존의 T 포즈나 기본 휴식 포즈로 되어있는지 확인하세요.

Maya와 3DS Max에서 DAE 파일 내보내기

Autodesk는 Maya와 3DS Max를 위한 내장 COLLADA 지원을 추가했습니다, 하지만 기본적으로 고장나고 사용하지 않아야 합니다. 이 형식을 내보내는 최선의 방법은 OpenCollada 플러그인을 사용하는 것입니다. 항상 소프트웨어의 최신 버전으로 업데이트 되진 않지만 잘 작동합니다.

블렌더에서 glTF 2.0 파일 내보내기

glTF를 Blender로 내보내는 방법은 세 가지가 있습니다. glTF 이진 파일 (glb), glTF 임베디드 파일 (.gltf), 그리고 텍스처 파일 (gltf + .bin + 텍스처) 입니다.

glTF 이진 파일은 세 선택지중 용량이 가장 작습니다. Blender에서 설정된 메시와 텍스처를 포함하고 있습니다. Godot에 불러왔을 때 텍스처는 오브젝트의 재질 파일의 일부입니다.

glTF 임베디드 파일은 이진 파일과 같은 방식으로 동작합니다. Godot에서 추가적인 기능을 제공하지 않으며 파일의 크기도 크므로 사용하지 않는 것이 좋습니다.

glTF을 텍스처와 분리해 사용해야하는 이유는 두 가지가 있습니다. 첫 번째는 씬의 설명을 텍스트 기반의 포맷과 이진 데이터로 각각의 이진 파일에 저장하기 위함입니다. 이 경우 버전 관리에서 텍스트 기반 포맷의 변경점을 검토해야 할 때 유용합니다. 두 번째는 텍스처 파일을 재질 파일과 분리하기 위해서 입니다. 위 두 가지 이점이 필요하지 않다면 glTF 이진 파일을 사용하는 것도 좋습니다.

경고

Blend shape animations cannot be imported - they require manual animation within Godot.

참고

Blender versions older than 3.2 do not export emissive textures with the glTF file. If your model uses one and you're using an older version of Blender, it must be brought in separately.

Blender는 기본적으로 재질의 backface culling이 비활성화 되어 있으며 Blender에서 렌더링되는 것과 같이 재질을 내보내려고 할 것입니다. 따라서 Godot에서도 재질의 cull mode 옵션을 Disabled 로 설정해야 합니다. 이 경우 다른 면에 가려질 때에도 backface가 렌더링 되므로 성능을 떨어뜨릴 수 있습니다. 이를 해결하려면 Blender의 재질 탭에서 Backface culling 옵션을 활성화하십시오.

블렌더에서 DAE 파일 내보내기

블렌더도 내장 COLLADA를 지원하지만, 게임 엔진의 필요에 맞게 동작하지 않으므로 그대로 사용하지 않는 것이 좋습니다.

Godot는 Godot에 맞게 COLLADA 씬을 제대로 내보낼 수 있도록 Blender 플러그인 을 지원합니다. Blender 2.8 이상의 버전에서는 동작하지 않지만 추후 업데이트가 있을 예정입니다.

블렌더에서 ESCN 파일 내보내기

가장 강력한 기능은 godot-blender-exporter 입니다. .tscn 파일 (Godot 씬 파일)의 일종인 .escn 파일을 사용하며, 블렌더 씬의 정보를 가능한 많이 보존해줍니다. 하지만 아직은 실험적인 기능입니다.

ESCN 내보내기는 기능과 사용법을 설명하는 세부적인 문서를 갖고 있습니다.

텍스처를 각각 내보내기

glTF 2.0같은 몇몇 파일 포맷에서는 텍스처를 모델과 함께 내보낼 수 있지만, 따로 내보내는 것도 가능합니다. Godot은 재질에 PBR(물리 기반 렌더링)을 사용하는데, 텍스처 프로그램이 PBR 텍스처를 내보낼 수 있다면 Godot에서도 사용이 가능합니다. Substance suite, ArmorPaint (오픈 소스), 그리고`Material Maker (오픈 소스) <https://github.com/RodZill4/material-maker>`__ 가 이에 해당됩니다.

참고

자세한 정보는 Spatial Material 페이지를 참고하십시오.

내보내기 고려 사항

GPU가 삼각형만을 렌더링 할 수 있기 때문에 사각형 혹은 초과의 n각형을 포함하는 메시는 렌더링 이전에 triangulate 되어야 합니다. Godot은 가져오기 과정에서 메시를 triangulate 할 수 있지만, 특히 n각형의 경우는 예측 불가능하거나 잘못된 결과가 나올 수 있습니다. 목표 애플리케이션에 관계 없이 씬을 내보내기 이전에 triangulate하는 편이 더 안정적인 결과물을 만들기 때문에 가능하면 내보내기 이전에 수행해야 합니다.

Godot에 가져오기 이후 잘못된 triangulation이 수행되는 것을 방지하기 위해 오브젝트 자신의 3D DCC triangulate 오브젝트를 만드는 것을 권장합니다. Blender의 경우 오브젝트에 Triangulate modifier를 추가한 뒤 내보내기 창에서 Apply Modifiers 에 체크해 이 작업을 수행할 수 있습니다.

에디터에서 3D 선택 항목에 문제가 생기는 것을 방지하기 위해 씬을 내보내기 전에 3D DCC에 오브젝트 변환을 적용하는 것을 권장합니다.

워크플로 가져오기

Godot 씬 임포터는 어떻게 데이터를 가져오는지에 따라 서로 다른 워크플로를 허용합니다. 많은 옵션에 따라, 다음을 통해 씬을 가져올 수 있습니다:

  • 외부 머티리얼 (기본 값): 각 머티리얼은 파일 리소스에 저장됩니다. 모디파이어는 유지됩니다.

  • 외부 메시: 각 메시는 다른 파일로 저장됩니다. 많은 사용자는 메시를 직접 처리하는 것을 선호합니다.

  • 외부 애니메이션: 원본이 변경될 때 저장된 애니메이션을 수정하고 병합할 수 있도록 합니다.

  • 외부 씬: 가져온 씬의 각 루트 노드를 별도의 씬으로 저장합니다.

  • 단일 씬: 모든 것이 내장된 하나의 씬 파일입니다.

../../_images/scene_import1.png

다른 개발자가 다른 요구가 있듯이, 이 가져오기 처리는 많이 커스터마이징 할 수 있습니다.

옵션 가져오기

임포터에는 여러 설정이 있는데, 아래에서 논의합니다:

../../_images/scene_import2.png

노드(Node)

Root Type(루트 타입)

기본적으로, 가져온 씬의 루트 노드 타입은 "Spatial"이지만, 수정될 수 있습니다.

Root Name(루트 이름)

생성된 루트 노드에 특정 이름을 설정할 수 있습니다.

Root Scale(루트 크기)

루트 노드의 크기입니다.

Custom Script(맞춤 스크립트)

특수한 스크립트로 가져오기 이후 전체 씬을 처리하는 것도 가능합니다. 후처리, 재질 변경, 도형으로 장난을 치는 일 등에 유용합니다.

다음과 같은 스크립트를 만드세요:

tool # Needed so it runs in the editor.
extends EditorScenePostImport


func post_import(scene):
    # Do your stuff here.
    return scene # remember to return the imported scene

post_import 함수는 가져온 씬을 인수로 받습니다 (매개변수는 사실 씬의 루트 노드입니다). 마지막으로 사용되는 씬은 반환되어야 합니다. 그것은 다른 것일 수 있습니다.

Storage(저장소)

기본적으로, Godot은 하나의 씬을 가져옵니다. 이 옵션으로 루트 아래의 노드들이 각각 별개의 씬으로 되고 가져온 씬에 인스턴스화되는 것을 명시할 수 있게 해줍니다.

물론 가져온 씬을 다른 곳에서 인스턴스화하는 것도 수동으로 작동합니다.

머티리얼(Materials)

위치

Godot는 메시나 노드에서 머티리얼을 지원합니다. 기본적으로, 머티리얼은 각 노드에 들어갑니다.

Storage(저장소)

머티리얼은 씬이나 외부 파일 안에 저장될 수 있습니다. 기본적으로, 외부 파일에 저장되므로 편집하는 것이 가능합니다. 대부분의 3D DCC가 Godot와 같은 머티리얼 설정을 갖고 있지 않기 때문입니다.

머티리얼이 내장형이라면, 원본 씬을 수정하고 다시 가져올 때마다 없어질 것입니다.

참고

.material 파일을 다시 가져오기 이전에 제거하지 않는 이상 Godot은 외부 파일에 저장된 머티리얼들을 다시 가져오지 않습니다.

3D 씬을 다시 가져올 때마다 다시 가져오도록 강제하려면 파일 시스템 독에서 머티리얼 저장 모드를 선택한 후 가져오기 독에서 Material > StorageFiles 대신 Built-In 으로 변경하십시오.

다시 가져오기 유지(Keep On Reimport)

한번 Godot 기능을 사용하기 위해 머티리얼을 편집하면, 임포터는 편집한 것을 유지하고 원본 씬에서 나오는 것은 무시합니다. 이 옵션은 머티리얼이 파일로 저장된 경우에만 존재합니다.

Meshes(메시)

Compress(압축)

공간을 절약하기 위해 메시의 여러 측면에 덜 정확한 수치를 사용하도록 합니다.

이렇게 됩니다:
  • Transform Matrix (Location, rotation, and scale) : 32비트 실수에서 16비트 부호 있는 정수로.

  • Vertices : 32비트 실수에서 16비트 부호 있는 정수로.

  • Normals : 32비트 실수에서 32비트 부호 있는 정수로.

  • Tangents : 32비트 실수에서 32비트 부호 있는 정수로.

  • Vertex Colors : 32비트 실수에서 32비트 부호 있는 정수로.

  • UV : 32비트 실수에서 32비트 부호 있는 정수로.

  • UV2 : 32비트 실수에서 32비트 부호 있는 정수로.

  • Vertex weights : 32비트 실수에서 16비트 부호 있는 정수로.

  • Armature bones : 32비트 실수에서 16비트 부호 있는 정수로.

  • Array index : 얼마나 많은 원소가 있는 지에 따라 32비트나 16비트 부호 있는 정수로.

추가 정보:
  • UV2 = 세부적인 텍스처와 구워진 텍스처를 위한 두 번째 UV 채널.

  • Array index = 위 배열의 각 요소에 순서를 매기는 배열; 즉, 꼭짓점과 노말에 순서를 매깁니다.

이로 인해 몇몇 상황에서 정밀도가 떨어질 수 있으니, 필요하다면 이 옵션을 비활성화할 수 있습니다. 예를 들어, 메시가 매우 크거나 큰 영역을 포함하는 여러 메시를 가져온다면, 메시 가져오기를 압축하는 것이 기하 사이의 간격 생성, 꼭짓점이 있어야 할 자리에 없는 현상이 발생할 수 있습니다.

Ensure Tangents(탄젠트 보장)

If textures with normal mapping are to be used, meshes need to have tangent arrays. This option ensures that these are generated if not present in the source scene. Godot uses Mikktspace for this, but it's always better to have them generated in the exporter.

Storage(저장소)

메시는 내장 대신 별개의 파일 (리소스)로 저장될 수 있습니다. 직접 오브젝트를 짓는 것이 아니라면 이것은 꽤 실용적인 사용을 갖지는 않습니다.

이 설정은 씬 대신 메시로 직접 작업하기를 선호하는 사람들을 돕기 위해 제공됩니다.

광원 베이킹

메시가 베이킹된 라이트맵에서 사용되는지 여부입니다.

  • Disabled: 메시가 베이킹된 라이트맵에서 사용되지 않습니다.

  • Enable: 메시가 베이킹된 라이트맵에서 사용됩니다.

  • Gen Lightmaps: 메시가 베이킹된 라이트맵에서 사용되고 라이트맵에 사용할 두 번째 UV 레이어를 폅니다.

참고

광원 베이킹에 대한 자세한 내용은 doc_baked_lightmap 페이지를 참고하세요.

External Files(외부 파일)

생성된 메시와 머티리얼은 하위 디렉토리에 씬의 이름을 가지면서 선택적으로 저장될 수 있습니다.

애니메이션 설정

Godot는 애니메이션 데이터를 어떻게 다루는 지에 따라 많은 설정을 제공합니다. (블렌더처럼) 일부 내보내기는 하나의 파일에 많은 애니메이션을 생성할 수 있습니다. 3DS Max나 Maya와 같은 것은 같은 타임라인에 많은 애니메이션을 넣어야 하거나, 최악의 경우, 애니메이션을 별도의 파일에 넣어야 합니다.

../../_images/scene_import3.png

애니메이션 가져오기는 기본적으로 활성화되어 있습니다.

주의

가져온 3D 씬의 애니메이션을 수정하려면 가져오기 독에서 애니메이션 저장 옵션을 Built-In**에서 **Files 로 변경해야 합니다. 그렇지 않으면 프로젝트가 실행될 때 Godot에서의 변경사항은 사라집니다.

초당 프레임

대부분의 3D 내보내기 형식은 프레임 대신 초당 타임라인으로 애니메이션을 저장합니다. 애니메이션을 가능한 한 충실하게 가져오기 위해서는, 편집에 사용된 초 당 프레임을 명시하세요. 이를 잘못하면 떨리는 애니메이션을 만들게 됩니다.

Filter Script(필터 스크립트)

어떤 애니메이션의 어떤 트랙을 골라낼 지 결정하기 위해 필터 스크립트를 특수한 문법으로 정의할 수 있습니다.

필터 스크립트는 가져온 모든 애니메이션에 수행됩니다. 문법은 두 가지 문항으로 이루어졌는데, 첫 번째는 어떤 애니메이션을 필터링 하는지 결정하는 것이고, 두 번째는 해당하는 애니메이션에서 개별의 트랙을 필터링 하는 것 입니다. 이름 패턴은 ?* 와일드카드를 사용해서 대소문자 구분 없는 표현식으로 매칭이 수행됩니다(내부적으로 String.matchn() 을 사용합니다).

스크립트는 항상 애니메이션 필터 문항으로 시작해야 합니다(@ 로 라인이 시작이 표시된 바로 뒤에). 예를 들어 "_Loop" 로 끝나는 모든 애니메이션에 필터를 적용하려면 다음과 같이 해야 합니다:

@+*_Loop

비슷한 맥락에서 같은 줄에 쉼표로 구분되도록 패턴을 추가할 수도 있습니다. "Arm_Left"``로 시작하는 애니메이션을 모두 *포함* 시키고 ``"Attack" 으로 끝나는 애니메이션은 모두 제외 시키는 예제는 다음과 같습니다:

@+*_Loop, +Arm_Left*, -*Attack

애니메이션 필터 문항 다음에는 어떤 애니메이션의 트랙을 골라낼 지 결정하는 트랙 필터 패턴을 추가해야 합니다. 만약 필터 패턴을 정하지 않으면 골라낸 애니메이션의 모든 트랙이 그냥 버려집니다!

트랙 필터문이 애니메이션의 모든 개별 트랙에 적용된다는 사실을 이해하는 것이 중요합니다. 이는 한 문항에 의해 트랙이 포함되었더라도 이후에 나오는 문항에 의해 다시 제외될 수 있다는 뜻이니까요. 같은 맥락으로 앞의 문항에 의해 제외된 트랙 역시 나중에 나오는 문항에 의해 다시 포함될 수 있습니다.

예를 들어서 "_Loop" 으로 끝나는 애니메이션의 모든 트랙을 추가한 뒤 "Skeleton" 으로 시작하는 트랙 중 "Control" 로 끝나는 트랙은 "Arm" 이 포함되지 않으면 제외하는 필터문은 다음과 같습니다:

@+*_Loop
+*
-Skeleton:*Control
+*Arm*

위 예제에서 "Skeleton:Leg_Control" 은 제외되지만 "Skeleton:Head""Skeleton:Arm_Left_Control" 는 포함될 것입니다.

트랙 필터 중 + 또는 - 로 시작하지 않는 줄은 모두 제외됩니다.

Storage(저장소)

기본적으로, 애니메이션은 내장되어 저장됩니다. 대신 파일로 애니메이션을 저장할 수도 있습니다. 이렇게 하면 맞춤 트랙을 애니메이션에 추가할 수 있고, 다시 가져온 후에도 이를 유지할 수 있습니다.

Optimizer(최적화 도구)

애니메이션을 가져올 때 옵티마이저(optimizer)가 실행되어 애니메이션의 크기는 상당히 줄어듭니다. 일반적으로, 옵티마이저가 활성화되어 있기 때문에 애니메이션이 손상되었다고 의심되는 상황이 아니라면 항상 활성화되어 있어야 합니다.

Clips(클립)

클립의 형태로 하나의 타임라인에 여러 개의 애니메이션을 지정하는 것 역시 가능합니다. 이를 위해서는 모델에 default 로 작명된 애니메이션은 단 하나만 존재해야 합니다. 클립을 생성하려면 클립 개수를 0보다 큰 값으로 변경하면 됩니다. 이후 클립의 이름, 시작 프레임과 끝 프레임 및 애니메이션의 반복 여부를 정할 수 있습니다.

씬 상속

많은 상황에서, 가져온 씬을 수정하고 싶을 것입니다. 기본적으로 원본 애셋(3D 모델링 앱에서 다시 내보낸 원본 .dae, .gltf, .obj 파일)이 바뀌기 때문에 그렇게 할 수는 없고 , Godot는 전체 씬을 다시 가져올 것입니다.

하지만, 씬 상속을 사용하면 로컬로 수정하는 것이 가능합니다. 가져온 씬을 열면 다음 대화 상자가 나타납니다:

../../_images/scene_import4.png

상속된 씬에서, 수정에 대한 유일한 제한은 다음과 같습니다:

  • 노드는 삭제될 수 없습니다 (하지만 어디에나 추가될 수 있습니다).

  • 하위 리소스를 편집할 수 없습니다 (이를 위해선 위에서 설명했듯 외부로 저장해야 합니다)

그 외에는 모든 것이 허용됩니다!

가져오기 힌트

여러번 씬을 편집할 때, 내보낸 후 해야 하는 일반적인 작업이 있습니다:

  • 오브젝트에 콜리전 감지를 추가하기.

  • 오브젝트를 내비게이션 메시로 설정하기.

  • Deleting nodes that are not used in the game engine (like specific lights used for modelling).

이 워크플로를 간단히 하기 위해, Godot는 3D 모델링 소프트웨어에서 오브젝트의 이름에 붙일 수 있는 몇몇 접미사를 제공합니다. 가져올 때, Godot는 이를 감지하고 자동으로 동작을 수행합니다:

참고

아래에 설명된 모든 접미사들은 대소문자를 구분합니다.

노드 삭제 (-noimp)

-noimp 접미사를 갖고 있는 오브젝트가 어떤 타입이든지 가져올 때 제거될 것입니다. 가져온 씬에서 나타나지 않습니다.

콜리전 생성 (-col, -convcol, -colonly, -convcolonly)

-col 옵션은 메시 오브젝트에만 적용됩니다. 만약 접미사가 감지되면 동일한 도형을 메시로 사용해 자식 정적 콜리전 노드가 추가됩니다. 이 옵션에서는 느리지만 충돌 감지가 정확한 삼각형 메시 콜리전 모양이 생성됩니다. 레벨 지형을 만드는데 적합한 옵션입니다 (하지만 하단의 -colony 또한 확인해보십시오).

-convcol 옵션은 ConcavePolygonShape 대신 :ref:`class_convexpolygonshape`를 생성합니다. 오목한 부분을 묘사할 수 있는 삼각형 메시와는 달리 볼록 다면체 형상은 오목한 각이 없는(예를 들어 피라미드는 볼록 다면체 형상이지만 빈 박스는 오목한 형상입니다) 도형만을 정확히 묘사할 수 있습니다. 때문에 볼록 다면체 콜리전 형상은 레벨 지형을 묘사하는데에는 적합하지 않습니다. 충분히 간단한 메시를 표현하고자 할 때는 볼록 다면체 콜리전 형상을 사용하는 것이 삼각형 콜리전 형상보다 성능 면에서 원활합니다. 이 옵션은 비교적 정확한 충돌 감지가 필요한 간단하고 동적인 오브젝트에 적합합니다.

However, in both cases, the visual geometry may be too complex or not smooth enough for collisions. This can create physics glitches and slow down the engine unnecessarily.

이를 해결하기 위해, -colonly 모디파이어(modifier)가 존재합니다, 가져올 때 메시를 제거하고 대신 StaticBody 콜리전을 생성합니다. 이렇게 하면 시각적 메시와 실제 콜리전을 분리할 수 있습니다.

-convcolonly 옵션 또한 위와 유사하지만 :ref:`class_convexpolygonshape`를 생성한다는 차이가 있습니다.

-colonly 옵션은 블렌더의 empty 오브젝트와 함께 사용될 수도 있습니다. 가져올 때, 자손으로 콜리전 노드가 있는 StaticBody를 생성할 것입니다. 콜리전 노드는 미리 정의된 모양 중 하나를 가지며, 블렌더의 empty 드로우 타입에 따라 다릅니다:

../../_images/3dimp_BlenderEmptyDrawTypes.png
  • Single arrow는 :ref:`class_rayshape`를 생성합니다.

  • Cube는 BoxShape 를 생성합니다.

  • Image는 PlaneShape 를 생성합니다.

  • Sphere (그리고 나열되지 않은 나머지)는 SphereShape 를 생성합니다.

가능하다면 삼각형이나 볼록 다면체 대신 primitive 충돌 감지 형상을 사용해보십시오. Primitive 형상이 많은 경우 성능 및 안전성 면에서 더 뛰어납니다.

참고

For better visibility in Blender's editor, you can set the "X-Ray" option on collision empties and set some distinct color for them in Blender's User Preferences > Themes > 3D View > Empty.

더 보기

모든 콜리전 형상을 확인하고 싶다면 :ref:`doc_collision_shapes_3d`을 참고하십시오.

내비게이션 생성 (-navmesh)

-navmesh 접미사를 가진 메시 노드는 내비게이션 메시로 변환되고 기존 메시 오브젝트는 import-time 때 삭제될 것입니다.

VehicleBody 만들기 (-vehicle)

-vehicle 접미사를 가진 메시 노드는 VehicleBody 노드의 자손으로 가져오게 됩니다.

VehicleWheel 만들기 (-wheel)

-wheel 접미사를 가진 메시 노드는 VehicleWheel 노드의 자손으로 가져오게 됩니다.

리지드 바디 (-rigid)

-rigid 접미사를 가진 메시 노드는 VehicleBody 노드의 자손으로 가져오게 됩니다.

애니메이션 루프 (-loop, -cycle)

COLLADA 문서에서 loopcycle토큰으로 시작하거나 끝나는 애니메이션 클립은 루프 플래그가 설정된 Godot 애니메이션으로 가져와질 것입니다. 위에서 설명된 다른 접미사와 다르게, 하이픈(-)이 필요하지 않습니다.

In Blender, this requires using the NLA Editor and naming the Action with the loop or cycle prefix or suffix.