다음을 통해 공유


개체 모델링 및 애니메이션

이 가이드에서는 Minecraft: Bedrock Edition에서의 모델 및 애니메이션 제작에 관한 기본 정보를 살펴봅니다. 예시 작업에서는 작은 로봇을 모델링하고 움직임을 부여하는데, 작업의 초기 내용은 개체 추가 안내 문서에서 확인할 수 있습니다.

이 튜토리얼에서는 다음과 같은 사항을 안내해 드립니다.

  • Blockbench를 사용하여 개체의 모델을 만드는 방법
  • 모델에 텍스처와 애니메이션을 적용하는 방법

요구 사항

튜토리얼을 시작하기 전에 아래 사항을 완료하시길 추천합니다.

모델

Minecraft에서 모델은 JSON을 이용해 모양을 정의하는 특정한 형식을 사용합니다. 각 모델은 렌더링 컨트롤러를 통해 할당할 수 있는 텍스처를 사용합니다.

모델과 텍스처 생성에는 Blockbench를 사용합니다. 이 프로그램은 Minecraft Bedrock Edition용 모델을 만들 수 있는 3D 모델링 프로그램입니다.

모델 설정하기

Blockbench를 처음 실행하면 사용할 수 있는 모델 형식이 표시됩니다. Bedrock Model을 선택하세요. 프로젝트의 기본 설정에 관한 대화 상자가 표시됩니다.

Blockbench에서의 Bedrock Edition 모델 프로젝트 설정

여기서 중요한 부분은 Mob Geometry Name입니다. 여기에는 모델의 고유한 이름을 입력해야 합니다. 모범 사례는 snake_case를 사용하는 것이므로, 소문자와 숫자, 밑줄 및 점만 사용하세요. 공백이나 다른 특수 문자는 지원되지 않습니다. 우리의 모델에는 robot이라고 입력하겠습니다.

파일 이름 입력란에는 아무것도 입력하지 않아도 됩니다. 파일 이름은 모델을 내보낼 때 정의하기 때문입니다. Box UV 설정과 텍스처 크기도 기본값을 그대로 유지하세요. 두 항목은 나중에 변경합니다. 확인 버튼을 누르면 이상의 설정을 저장합니다.

뼈 구조물

모델을 만들 때 가장 먼저 고려해야 하는 요소는 뼈 구조입니다. 뼈는 모델에서 움직임을 부여할 수 있는 부분이며, 임의의 심층 계층 구조로 정렬할 수 있습니다. 뼈 자체는 눈에 보이지 않지만, 각각의 뼈에는 모델의 모양을 결정하는 큐브가 포함될 수 있습니다.

Blockbench에서의 뼈 목록

모범 사례는 각 모델에 로봇 뼈를 사용하고 다른 모든 요소를 뼈 안에 넣는 것입니다. 이렇게 하면 나중에 모델 전체에 움직임을 부여하거나 모델의 특정 부위에 움직임을 부여할 수 있습니다. Blockbench에서 새 그룹을 만듭니다. 이 맥락에서 "그룹"과 "뼈"는 본질적으로 동일한 항목입니다.

그룹을 우클릭하거나 F2를 누르면 그룹의 이름을 바꿀 수 있습니다. 뼈의 이름은 snake_case여야 합니다(따라서 소문자와 숫자, 밑줄만 사용할 수 있습니다). 애니메이션을 통해 나중에 참조할 수 있도록 각 뼈의 이름은 고유해야 합니다.

아래 단계에 따라 모델을 만들 때는 구조물이 올바르게 설정되었는지 확인해야 합니다. 그룹을 드래그하여 순서를 바꾸거나 다른 그룹 안에 드롭할 수 있습니다. 이 스크린샷에서는 완성된 모델의 올바른 뼈 구조를 확인할 수 있습니다.

모양

이제 모델 모양을 만들어보겠습니다. 새 큐브를 만들고 이동, 크기 조절 및 회전 도구를 이용해 큐브를 조정하세요. 이미 위치가 지정된 큐브를 선택하고 Ctrl + D(복사)를 눌러 사본을 얻으면 큐브를 빠르게 추가할 수 있습니다.

Blockbench에서 표현되는 로봇의 텍스처 없는 모양

Shift나 Control 또는 두 키를 동시에 누르고 있으면 큐브를 더 정확하게 옮길 수 있습니다. 모델링 스타일에 따라 그리드에 완전히 붙이거나 큐브를 절반 또는 4분의 1 크기로 옮겨야 합니다.

Bedrock Edition 모델은 기본적으로 Box UV 매핑을 사용합니다. 따라서 텍스처 매핑은 정수만 사용하며, 필요하다면 더 작은 숫자로 내립니다. 늘어나거나 투명한 면이 생기지 않도록, 큐브 크기가 정수를 유지하는지 확인하십시오.

팔다리 같은 대칭 부위를 작업할 때는 오른쪽을 먼저 만든 다음 왼쪽에 미러링해야 합니다. 양쪽에 같은 텍스처를 사용하는가 그렇지 않은가에 따라 텍스처 생성 이전이나 이후에 미러링하면 됩니다.

모델 가동 부위의 뼈를 만들 때는 항상 부위가 어느 지점을 중심으로 회전하는지를 생각해야 합니다. 뼈를 선택하고 P를 눌러 회전축 도구를 얻습니다. 이 도구를 사용하면 뼈의 회전축을 옮길 수 있습니다. 또한 큐브에서 이 도구를 사용하면 큐브가 특정 지점을 중심으로 회전하게 할 수 있습니다.

텍스처링

템플릿

모델 모양이 완성되면 텍스처 템플릿을 만들 수 있습니다. 템플릿은 모델의 모든 큐브와 모든 면을 위한 고유한 공간이 있는 텍스처입니다. 큐브를 수동으로 UV 매핑할 수 있지만, 템플릿을 만들면 이 작업을 자동으로 수행하고 가장 공간 효율적인 배치를 찾을 수 있습니다. Minecraft는 고해상도 이미지를 좋아하지 않는다는 점을 기억하세요.

텍스처를 만들 때 텍스처 이름을 robot으로 입력하고 템플릿 옵션을 확인하세요. 템플릿 대화상자에서 해상도를 선택합니다. 16x가 Minecraft의 기본 해상도지만, 원한다면 더 높여도 됩니다.

기본 색상

템플릿이 생성되면 Blockbench의 페인트 탭으로 이동하세요. 텍스처를 수정할 수 있는 도구가 표시됩니다. 페인트 통 도구를 선택하고 도구 옆에 있는 큐브 채움 모드를 설정하세요. 오른쪽에 있는 색상 패널에서 색상을 선택하세요. 이제 큐브로 이동해 개별 기본 색상으로 칠하면 됩니다.

세부정보

이제 텍스처 작업을 시작하겠습니다. 이미지 편집 프로그램에서의 텍스처링 작업이 더 익숙하다면, 텍스처 옆에 있는 저장 아이콘을 클릭해 텍스처를 저장하세요. 그런 다음 이미지 편집기에서 텍스처를 엽니다. 텍스처를 저장하면 Blockbench에 모든 변경 사항이 표시됩니다. 하지만 모델에서 직접 작업하는 방식을 선호한다면, Blockbench의 기본 페인트 도구를 사용하세요.

Blockbench에서 그림 붓을 더 효율적으로 사용할 수 있는 몇 가지 방법이 존재합니다.

  • 넓은 영역을 칠하려면 붓 크기를 늘리세요.
  • 3D 프리뷰에서 바로 칠해도 되고, 왼쪽에 있는 UV 편집기에서 칠해도 됩니다.
  • 직선을 그리고 싶다면 선의 시작 부분을 클릭한 다음 선의 끝부분에서 Shift를 누르세요.
  • 덮여 있던 부분이 애니메이션에서 드러나는 일이 없도록, 큐브를 숨길 수 있습니다. 외곽선에 있는 눈 아이콘을 클릭하기만 하면 됩니다.

애니메이션

애니메이션 작업을 이용하면 모델의 모양을 움직이고, 나아가 소리와 입자 효과를 재생할 수 있습니다. 다음 섹션에서는 개체에 애니메이션을 추가하고, Blockbench에서 자체 애니메이션을 만들고, 마지막으로 애니메이션 컨트롤러를 사용하는 방법을 알아봅니다.

기본 애니메이션 사용

바닐라 리소스 팩에는 실제로 파일을 복사하지 않고도 팩에서 참조할 수 있는 일반 애니메이션이 포함되어 있습니다. 이러한 애니메이션은 바닐라 같은 개체를 만드는 좋은 시작 지점이지만, 사용자 정의 애니메이션이 훨씬 더 강력합니다. 바닐라 리소스 팩에 있는 모든 바닐라 애니메이션은 여기에서 확인할 수 있습니다.

이 예시에서는 둘러보기 애니메이션을 사용합니다. 이 애니메이션은 "머리" 뼈를 돌립니다. 따라서 모델의 머리는 반드시 동일한 이름을 사용해야 합니다.

또한 개체의 행동 파일에 둘러보기 구성 요소가 있어야 합니다. 이것은 소의 둘러보기 구성 요소입니다. 숫자를 마음대로 조정할 수 있습니다.

            "minecraft:behavior.look_at_player": {
                "priority": 7,
                "look_distance": 6,
                "probability": 0.02
            },
            "minecraft:behavior.random_look_around": {
                "priority": 9
            }

행동을 설정했으니, 클라이언트 개체 파일로 이동하겠습니다. 제대로 작동하려면 이 파일의 형식 버전을 1.10.0 이상으로 설정해야 합니다.

먼저 애니메이션을 연결해보겠습니다. 이 작업은 개체 설명 태그의 애니메이션 섹션에서 수행합니다. 두 번째 부분(animation.common.look_at_target)은 애니메이션의 전역 식별자입니다. 이 이름은 애니메이션 파일에서 정의되며 이 팩이나 다른 모든 팩에서 사용할 수 있습니다. 첫 번째 부분(look_at_target)은 약식 이름입니다. 이것은 개체 파일에서 애니메이션을 참조하는 방식으로, 이 개체의 범위 내에서만 유효합니다.

            "animations": {
                "look_at_target": "animation.common.look_at_target"
            }

지금부터는 애니메이션을 재생해야 합니다. 개체가 존재하는 동안에는 항상 활성화되는 단순한 애니메이션의 경우에는, 클라이언트 개체 파일의 스크립트/애니메이트 배열에 약식 이름을 나열하기만 하면 됩니다.

            "scripts": {
                "animate": ["look_at_target"]
            }

게임에서 로봇을 테스트하면, 로봇이 머리를 돌려 주위를 둘러보는 모습을 확인하게 됩니다.

애니메이션 만들기

개체 가이드 추가에서 우리는 로봇의 짧은 구동 애니메이션을 제작했습니다. 지금부터는 로봇의 발(바퀴)이 지면에 닿지 못할 때 재생되는 애니메이션을 만들어보겠습니다. 애니메이션을 만들기 전에 애니메이션을 트리거하는 방법이 있는지를 항상 확인해야 합니다. 이 로봇의 균형 상실 애니메이션은 쉽게 트리거할 수 있습니다. 몰랑 쿼리인 query.is_on_ground를 사용하며 로봇이 지면에 닿지 않는 순간을 테스트할 수 있기 때문입니다.

Blockbench에서의 애니메이션 제어

간단한 애니메이션은 텍스트 편집기에서 만들 수 있지만, Blockbench에서는 복잡한 키프레임 기반 애니메이션도 쉽게 만들 수 있습니다. 모델을 열고 오른쪽 상단 모서리에 있는 애니메이트 탭으로 전환합니다. 왼쪽의 애니메이션 패널에서 새 애니메이션을 만들고 이름을 animation.robot.sway로 지정합니다. 더 긴 이름을 선택하거나 다른 애드온과의 호환성을 보장하기 위해 네임스페이스를 포함해도 됩니다. 하지만 애니메이션 식별자는 snake_case, 문자열과 점만 지원하며 콜론이나 대시 기호는 사용할 수 없습니다.

애니메이션을 설정했다면 애니메이션 작업을 시작할 수 있습니다. 개체의 기본 뼈를 선택하세요. 타임라인에 있는 시간 커서를 0초로 옮기고 "회전" 옆에 있는 더하기 아이콘을 클릭하세요. 새 키프레임이 새 위치에서 생성됩니다. 이제 커서를 0.2초 부근으로 옮깁니다. 회전 도구를 선택하고 로봇 전체를 왼쪽으로 약간 돌립니다. 새 키프레임이 자동으로 생성됩니다. 화면 왼쪽에 값이 표시됩니다. 로봇을 10도 정도 돌립니다.

이제 0.5초 정도 시간을 앞으로 돌린 다음 로봇 뼈를 반대쪽으로 돌립니다. 마지막으로, 1초로 이동한 다음 로봇을 다시 0으로 돌립니다.

이제 커서를 시작 지점으로 옮기고 재생을 누르면 짧은 흔들림 애니메이션이 표시됩니다. 움직임을 부여하는 방식을 확인했으니, 이제 애니메이션을 개선할 수도 있습니다. 예를 들자면 안테나가 조금 흔들리게 하는 식이죠.

마지막으로 Ctrl + S를 눌러 모델과 애니메이션을 저장합니다. 리소스 팩의 animations 폴더에 애니메이션을 robot.animation.json으로 저장합니다.

둘러보기 애니메이션에서 했던 것처럼 클라이언트 개체 파일에 있는 애니메이션을 참조하고 재생합니다. 하지만 로봇이 지면에 닿지 못하는 상태일 때만 흔들림 애니메이션을 재생합니다. 다음과 비슷한 애니메이션이 표시될 것입니다.

            "animations": {
                "look_at_target": "animation.common.look_at_target",
                "sway": "animation.robot.sway"
            },
            "scripts": {
                "animate": [
                    "look_at_target",
                    {"sway":"!query.is_on_ground"}
                ]
            }

이제 로봇을 생성하고 가장자리에 밀어 넣으면 애니메이션이 재생됩니다. 하지만 애니메이션은 한 번만 재생됩니다.

스크립트 섹션에 있는 쿼리가 애니메이션용 혼합 값이기 때문입니다. 이 값은 애니메이션 재생 시점이 아닌 "재생 시간"을 정의합니다. 따라서 애니메이션은 !query.is_on_groundtrue/1이면 재생되며 재생이 멈추지 않습니다. 값이 다시 false/0이 되면 천천히 사라지며, 다음번에도 애니메이션은 다시 사라집니다. 처음부터 다시 재생되지는 않습니다.

이 행동은 시작과 끝이 존재하지 않는 정적 또는 무한 반복 애니메이션에 적합합니다. 하지만 쿼리가 변경될 때마다 애니메이션을 시작하고 싶다면, 다른 방식을 사용해야 합니다. 이때 필요한 것이 바로 애니메이션 컨트롤러입니다.

애니메이션 컨트롤러

애니메이션 컨트롤러는 상태를 바탕으로 작동합니다. 애니메이션 컨트롤러는 무한대의 상태를 가질 수 있습니다. 상태는 한 번에 하나만 활성화할 수 있습니다. 컨트롤러는 몰랑 식을 통해 다른 상태로 전환될 수 있습니다. 각 상태는 독특한 애니메이션, 사운드 및 입자 효과 모음을 재생할 수 있습니다.

(월드에 참가하는 등의 상황에서) 클라이언트가 개체를 로드할 때마다 애니메이션 컨트롤러는 최초 상태로 시작됩니다. 이 상태는 기본적으로 default라고 합니다.

애니메이션 컨트롤러를 설정하려면 리소스 팩에서 animation_controllers라는 새 폴더를 만들어야 합니다. 폴더에서 robot.animation_controllers.json이라는 새 파일을 만듭니다. 다음과 비슷한 애니메이션 컨트롤러를 만듭니다.

{
    "format_version": "1.10.0",
    "animation_controllers": {
        "controller.animation.robot.ground": {}
    }
}

지금부터는 최초 상태를 만들어야 합니다. 이 상태는 기본적으로 default라고 합니다. 애니메이션 컨트롤러는 개체가 로드되면 항상 이 상태에서 시작됩니다. 예를 들어 월드에 다시 참가한 후에 시작됩니다.

이 상태가 하는 유일한 작업은 개체가 지면에서 떨어지면 흔들림 상태로 전환하는 것입니다. 이 작업에 이러한 전환을 사용해보겠습니다. 컨트롤러는 query.is_on_ground 쿼리가 true가 아니게 되면 바로 이 상태로 전환됩니다.

{
    "format_version": "1.10.0",
    "animation_controllers": {
        "controller.animation.robot.ground": {
            "states": {
                "default": {
                    "transitions":[
                        {"swaying": "!query.is_on_ground"}
                    ]
                }
            }
        }
    }
}

이제 흔들림 상태를 추가하겠습니다. 이 상태는 흔들림 애니메이션을 재생하며, 이후에는 기본 상태로 돌아가 컨트롤러를 재설정합니다. query.all_animations_finished 쿼리를 사용하면 애니메이션이 재생된 후에만 전환할 수 있습니다. 이 쿼리는 현재 상태의 모든 애니메이션이 완전히 재생된 후에만 true를 반환합니다. 우리는 개체가 다시 지면과 접촉하는지도 테스트합니다.

{
    "format_version": "1.10.0",
    "animation_controllers": {
        "controller.animation.robot.ground": {
            "states": {
                "default": {
                    "transitions":[
                        {"swaying": "!query.is_on_ground"}
                    ]
                },
                "swaying": {
                    "animations":[
                        "sway"
                    ],
                    "transitions":[
                        {"default": "query.all_animations_finished && query.is_on_ground"}
                    ]
                }
            }
        }
    }
}

지금부터는 애니메이션 컨트롤러를 개체에 연결해야 합니다. 애니메이션 컨트롤러는 클라이언트 개체 파일에 있는 애니메이션과 같은 방식으로 연결할 수 있습니다. 컨트롤러는 애니메이션 섹션에 연결되며 스크립트에서 재생됩니다.

            "animations": {
                "look_at_target": "animation.common.look_at_target",
                "sway": "animation.robot.sway",
                "ground": "controller.animation.robot.ground"
            },
            "scripts": {
                "animate": [
                    "look_at_target",
                    "ground"
                ]
            }

게임 내에서 테스트하면, 애니메이션은 이제 한 번 이상 작동합니다. 하지만 애니메이션 길이에 따라, 로봇이 짧은 간격으로 지면에 두 번 떨어지는 경우 두 번째에는 애니메이션이 재생되지 않을 수도 있습니다. 첫 번째 애니메이션이 아직 끝나지 않아 컨트롤러가 기본 상태로 재설정되지 않았기 때문입니다.

이 문제를 해결할 수 있는 다른 해결책을 살펴보겠습니다. all_animations_finished 쿼리를 제거하면 개체가 지면에 다시 닿는 즉시 흔들림 상태가 종료됩니다. 다시 테스트하면 애니메이션이 갑자기 중단될 것입니다.

이를 방지하려면 설정된 시간 안에 애니메이션이 자연스럽게 전환될 수 있게 하는 blend_transition 옵션을 사용해야 합니다. 이 옵션은 애니메이션 컨트롤러의 가장 중요한 속성으로, 개체의 두 가지 고정 자세 사이를 간편하게 전환할 수도 있습니다.

가장 좋은 해결책은 사용 사례에 따라 달라집니다. 이 예시에서 애니메이션은 로봇이 지면에 다시 닿으면 자연스럽게 사라집니다.

                "swaying": {
                    "animations":[
                        "sway"
                    ],
                    "transitions":[
                        {"default": "query.is_on_ground"}
                    ],
                    "blend_transition":0.5
                }

다음 튜토리얼

지금까지 애니메이션을 적용할 수 있는 모델을 만들고 텍스처를 적용하는 방법을 알아보았습니다. Blockbench에서 기존 애니메이션을 모델에 연결하고 자체 애니메이션을 만드는 작업도 했습니다.

개체 외형에만 국한되지 않는 다른 기능을 추가하고 싶다면, 개체 행동에 관한 튜토리얼을 확인하세요.