3D 씬 가져오기

Godot 씬 가져오기

3D 에셋을 다룰 때, Godot는 유연하면서 구성할 수 있는 가져오기를 갖고 있습니다.

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

Godot는 다음 3D 씬 파일 형식을 지원합니다:

  • DAE (COLLADA), 현재 가장 성숙한 워크플로우입니다.
  • GLTF 2.0. 문자와 이진 형식 모두 지원됩니다. Godot는 완벽하게 지원하지만 형식은 새롭고 견인력을 얻고 있습니다.
  • OBJ (Wavefront) 형식. 또한 완벽하게 지원하지만, 꽤 제한적입니다 (피봇, 스켈레톤 등을 지원하지 않음).

그냥 텍스쳐와 함께 씬 파일을 프로젝트 저장소에 복사하면 됩니다, 그리고 Godot는 완전히 가져올 것입니다.

FBX는 왜 안 되죠?

대부분의 게임 엔진은 3D 씬을 가져오기 위해 FBX 형식을 사용합니다, 확실하게 업계에서 가장 표준화된 형식이죠. 하지만 이 형식은 Autodesk에서 닫힌 라이브러리를 사용해야 하는데, Godot보다 더 제한적인 라이선스 제약에서 배포됩니다.

언젠가 미래에 세운 계획은, GDNative를 사용해 이진 플러그인을 제공하는 것입니다.

Maya와 3DS Max에서 DAE 파일을 가져오기

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

블렌더에서 DAE 파일 가져오기

블렌더도 내장 COLLADA 지원을 갖고 있지만, 역시 고장나고 사용해서는 안됩니다.

Godot는 파이썬 플러그인을 지원하며 씬을 가져오는 작업이 훨씬 더 좋을 것입니다.

블렌더에서 ESCN 파일 가져오기

가장 강력한 것으로,`godot-blender-exporter <https://github.com/godotengine/godot-blender-exporter>`__라고 부릅니다. .escn 파일을 사용하며, .tscn 파일 (Godot 씬 파일)의 다른 이름의 일종입니다; 가능한 한 많은 정보를 블렌더 씬에서 유지해줍니다.

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

가져오기 워크플로우

Godot 씬 가져오기 어떻게 데이터를 가져오는 지에 따라 다른 워크플로우가 있습니다. 많은 설정에 따라, 다음으로 씬을 가져올 수 있습니다:

  • 외부 머티리얼 (기본 값): 각 머티리얼은 파일 리소스에 저장됩니다. 모디파이어는 유지됩니다.
  • 외부 메시: 각 메시는 다른 파일로 저장됩니다. 많은 사용자는 메시를 직접 처리하는 것을 선호합니다.
  • 외부 애니메이션: 원본이 변경될 때 저장된 애니메이션을 수정하고 병합할 수 있도록 합니다.
  • 외부 씬: 가져온 씬의 각 루트 노드를 별도의 씬으로 저장합니다.
  • 단일 씬: 모든 것이 내장된 하나의 씬 파일입니다.
../../../_images/scene_import1.png

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

설정 가져오기

가져오기는 여러 설정이 있고, 밑에서 설명합니다:

../../../_images/scene_import2.png

노드(Nodes)

Root Type(루트 타입)

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

Root Name(루트 이름)

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

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)

Location(위치)

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

Storage(저장소)

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

머티리얼이 내장된 상태일 때, 원본 씬을 수정하고 다시 가져올 때마다 사라질 것입니다.

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(탄젠트 보장)

노말 맵핑 된 텍스쳐가 사용된다면, 메시는 탄젠트 배열을 가져야 합니다. 이 설정으로 원본 씬에서 탄젠트 배열이 없다면 생성하게 해줍니다. Godot는 Mikktspace를 사용하지만, 가져오기에서 생성하는 것이 항상 더 좋습니다.

Storage(저장소)

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

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

External Files(외부 파일)

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

애니메이션 설정

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

../../../_images/scene_import3.png

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

초당 프레임

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

Filter Script(필터 스크립트)

어떤 애니메이션에서 트랙을 유지할 지 결정하기 위한 특수 문법에 filter script를 지정할 수 있습니다. (@TODO 이것은 문서가 필요합니다)

Storage(저장소)

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

Optimizer(최적화 도구)

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

Clips(클립)

하나의 타임라인에서 여러 애니메이션을 클립처럼 지정하는 것이 가능합니다. 어떤 프레임에서 각 클립을 가져와야 하는 프레임으로 지정하세요 (그리고 물론, 위의 FPS 설정을 지정하는 것도 잊지 마세요).

씬 상속

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

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

../../../_images/scene_import4.png

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

  • 노드는 삭제될 수 없습니다 (하지만 어디에나 추가될 수 있습니다).
  • 하위 리소스를 편집할 수 없습니다 (이를 위해선 위에서 설명했듯 외부로 저장해야 합니다)

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

가져오기 힌트

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

  • 객체에 충돌 감지를 추가하기
  • 객체를 내비게이션 메시로 설정하기
  • (모델링에 사용되는 특정 빛과 같이) 게임 엔진에 사용되는 않는 노드 지우기

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

노드 삭제 (-noimp)

이 접미사를 갖고 있는 이름의 노드는 가져오는 순간 삭제될 것이며, 이는 타입과 관계없습니다. 가져온 씬에서는 나타나지 않습니다.

충돌 생성 (-col, -colonly, -convcolonly)

"-col" 설정은 오직 Mesh 노드에만 작동할 것입니다. 이것이 감지되면, 메시와 같은 기하학을 사용하여 자식 정적 충돌 노드가 추가될 것입니다.

하지만, 시각적인 기하학이 너무 복잡하거나 충돌에 너무 부드럽지 않은 경우, 잘 작업되지 않을 수 있습니다.

이를 해결하기 위해, "-colonly" 모디파이어가 존재합니다, 가져오면 메시는 제거되고 StaticBody 충돌이 대신 생성됩니다. 이렇게 하면 시각적 메시와 실제 충돌을 분리할 수 있습니다.

"-convcolonly" 설정은 ConcavePolygonShape 대신 ConvexPolygonShape를 만들 것입니다.

"-colonly" 설정은 블렌더의 Empty 객체와 함께 사용될 수도 있습니다. 가져올 때, StaticBody와 자식으로 충돌 노드를 생성할 것입니다. 충돌 노드는 미리 정의된 모양 중 하나를 가지며, 블렌더의 Empty 형태 타입에 따라 다릅니다:

../../../_images/3dimp_BlenderEmptyDrawTypes.png
  • Single arrow는 RayShape를 만들 것입니다
  • Cube는 BoxShape를 만들 것입니다
  • Image는 PlaneShape를 만들 것입니다
  • Sphere (그리고 나열되지 않은 나머지)는 SphereShape를 만들 것입니다

블렌더의 에디터에서 더 좋은 가시성을 위해, 충돌 Empty에 "X-Ray"를 설정하고 User Preferences / Themes / 3D View / Empty에서 뚜렷한 색상을 설정할 수 있습니다.

내비게이션 생성 (-navmesh)

이 접미사를 가진 메시 노드는 내비게이션 메시로 변환될 것입니다. 기존 메시 노드는 삭제될 것입니다.

리지드 바디 (-rigid)

이 메시에서 리지드 바디를 만듭니다.

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

시작과 끝에 "loop"나 "cycle" 표시가 있는 COLLADA 문서에서 애니메이션 클립은 루프 플래그가 설정된 Godot 애니메이션을 가져올 것입니다. 대소문자를 구분하고 하이픈(-)이 필요하지 않습니다.

블렌더에서, 이를 위해 NLA 에디터를 사용하여 Action 이름에 "loop"나 "cycle" 접두사 혹은 접미사를 붙여야 합니다.