3D 씬 가져오기

Godot 씬 가져오기

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

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

Godot supports the following 3D scene file formats:

  • glTF 2.0. Godot has full support for text and binary formats.
  • DAE (COLLADA), an older format that is fully supported.
  • OBJ (Wavefront) 형식. 또한 완벽하게 지원하지만, 꽤 제한적입니다 (피봇, 스켈레톤 등을 지원하지 않음).
  • ESCN, a Godot specific format that Blender can export with a plugin.
  • FBX, supported via the Open Asset Import library. However, FBX is proprietary, so we recommend using other formats listed above, if suitable for your workflow.

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

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

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

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

Exporting glTF 2.0 files from Blender

There are three ways to export glTF files from Blender. As a glTF binary (.glb file), glTF embedded (.gltf file), and with textures (gltf + .bin + textures).

glTF binary files are the smallest of the three options. They include the mesh and textures set up in Blender. When brought into Godot the textures are part of the object's material file.

glTF embedded files function the same way as binary files. They don't provide extra functionality in Godot, and shouldn't be used since they have a larger file size.

There are two reasons to use glTF with the textures separate. One is to have the scene description in a text based format and the binary data in a separate binary file. This can be useful for version control if you want to review changes in a text based format. The second is you need the texture files separate from the material file. If you don't need either of those glTF binary files are fine.

주석

Blender does not export emissive textures with the glTF file. If your model uses one it must be brought in separately.

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

Blender has built-in COLLADA support, but it does not work properly for the needs of game engines and should not be used as is.

Godot provides a Blender plugin that will correctly export COLLADA scenes for use in 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

노드(Node)

Root Type(루트 타입)

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

Root Name(루트 이름)

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

Root Scale

The scale of the root node.

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(저장소)

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

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

Light Baking

Whether or not the mesh is used in baked lightmaps.

  • Disabled: The mesh is not used in baked lightmaps.
  • Enable: The mesh is used in baked lightmaps.
  • Gen Lightmaps: The mesh is used in baked lightmaps, and unwraps a second UV layer for lightmaps.

주석

For more information on light baking see Baked lightmaps.

External Files(외부 파일)

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

애니메이션 설정

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

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

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

초당 프레임

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

Filter Script(필터 스크립트)

It is possible to specify a filter script in a special syntax to decide which tracks from which animations should be kept.

The filter script is executed against each imported animation. The syntax consists of two types of statements, the first for choosing which animations to filter, and the second for filtering individual tracks within the matched animation. All name patterns are performed using a case insensitive expression match, using ? and * wildcards (using String.matchn() under the hood).

The script must start with an animation filter statement (as denoted by the line beginning with an @). For example, if we would like to apply filters to all imported animations which have a name ending in "_Loop":

@+*_Loop

Similarly, additional patterns can be added to the same line, separated by commas. Here is a modified example to additionally include all animations with names that begin with "Arm_Left", but also exclude all animations which have names ending in "Attack":

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

Following the animation selection filter statement, we add track filtering patterns to indicate which animation tracks should be kept or discarded. If no track filter patterns are specified, then all tracks within the matched animations will be discarded!

It's important to note that track filter statements are applied in order for each track within the animation, this means that one line may include a track, a later rule can still discard it. Similarly, a track excluded by an early rule may then be re-included once again by a filter rule further down in the filter script.

For example: include all tracks in animations with names ending in "_Loop", but discard any tracks affecting a "Skeleton" which end in "Control", unless they have "Arm" in their name:

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

In the above example, tracks like "Skeleton:Leg_Control" would be discarded, while tracks such as "Skeleton:Head" or "Skeleton:Arm_Left_Control" would be retained.

Any track filter lines that do not begin with a + or - are ignored.

Storage(저장소)

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

Optimizer(최적화 도구)

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

Clips(클립)

It is possible to specify multiple animations from a single timeline as clips. For this to work, the model must have only one animation that is named default. To create clips, change the clip amount to something greater than zero. You can then name a clip, specify which frames it starts and stops on, and choose whether the animation loops or not.

씬 상속

In many cases, it may be desired to make modifications to the imported scene. By default, this is not possible because if the source asset changes (source .dae, .gltf, .obj file re-exported from 3D modelling app), Godot will re-import the whole scene.

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

../../../_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)

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

VehicleBody 만들기 (-vehicle)

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

VehicleWheel 만들기 (-wheel)

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

리지드 바디 (-rigid)

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

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

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

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