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. It does not work in Blender 2.8 or newer, but there are plans to update it in the future.

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

The most powerful one, called godot-blender-exporter. It uses a .escn file, which is kind of another name for a .tscn file (Godot scene file); it keeps as much information as possible from a Blender scene. However, it is considered experimental.

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와 같은 머티리얼 설정을 갖고 있지 않기 때문입니다.

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

주석

Godot will not reimport materials that are stored in external files unless you remove the associated .material file before reimporting.

To force reimporting materials every time the 3D scene is reimported, change the material storage mode in the 3D scene by selecting it in the FileSystem dock, going to the Import dock then setting Material > Storage to Built-In instead of Files.

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

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

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

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

가져오기 힌트

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

  • Adding collision detection to objects.
  • Setting objects as navigation meshes.
  • Deleting nodes that are not used in the game engine (like specific lights used for modelling).

To simplify this workflow, Godot offers several suffixes that can be added to the names of the objects in your 3D modelling software. When imported, Godot will detect suffixes in object names and will perform actions automatically.

주석

All the suffixes described below are case-sensitive.

노드 삭제 (-noimp)

Objects that have the -noimp suffix will be removed at import-time no matter what their type is. They will not appear in the imported scene.

Create collisions (-col, -convcol, -colonly, -convcolonly)

The option -col will work only for Mesh objects. If it is detected, a child static collision node will be added, using the same geometry as the mesh. This will create a triangle mesh collision shape, which is a slow, but accurate option for collision detection. This option is usually what you want for level geometry (but see also -colonly below).

The option -convcol will create a ConvexPolygonShape instead of a ConcavePolygonShape. Unlike triangle meshes which can be concave, a convex shape can only accurately represent a shape that doesn't have any concave angles (a pyramid is convex, but a hollow box is concave). Due to this, convex collision shapes are generally not suited for level geometry. When representing simple enough meshes, convex collision shapes can result in better performance compared to a triangle collision shape. This option is ideal for simple or dynamic objects that require mostly-accurate collision detection.

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 unneccesarily.

To solve this, the -colonly modifier exists. It will remove the mesh upon importing and will create a StaticBody collision instead. This helps the visual mesh and actual collision to be separated.

The option -convcolonly works in a similar way, but will create a ConvexPolygonShape instead.

The option -colonly can also be used with Blender's empty objects. On import, it will create a StaticBody with a collision node as a child. The collision node will have one of a number of predefined shapes, depending on Blender's empty draw type:

../../../_images/3dimp_BlenderEmptyDrawTypes.png

When possible, try to use a few primitive collision shapes instead of triangle mesh or convex shapes. Primitive shapes often have the best performance and reliability.

주석

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.

더 보기

See Collision shapes (3D) for a comprehensive overview of collision shapes.

내비게이션 생성 (-navmesh)

A mesh node with the -navmesh suffix will be converted to a navigation mesh. The original Mesh object will be removed at import-time.

VehicleBody 만들기 (-vehicle)

A mesh node with the -vehicle suffix will be imported as a child to a VehicleBody node.

VehicleWheel 만들기 (-wheel)

A mesh node with the -wheel suffix will be imported as a child to a VehicleWheel node.

리지드 바디 (-rigid)

A mesh node with the -rigid suffix will be imported as a RigidBody.

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

Animation clips in the COLLADA document that start or end with the token loop or cycle will be imported as a Godot Animation with the loop flag set. Unlike the other suffixes described above, this does not require a hyphen.

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