피벗 페인터 툴 2.0

버텍스 안에 모델 피벗 및 회전 데이터를 저장하여 인터랙티브 애니메이션에 쓸 수 있도록 해주는 Pivot Painter 2.0 MAXScript 안내서입니다.

Choose your operating system:

Windows

macOS

Linux

Pivot Painter 2.0 MAXScript 는 모델의 텍스처에 피벗 및 회전 정보를 저장합니다. 그 후 그 텍스처를 언리얼 셰이더 시스템에서 참조하여 인터랙티브 이펙트를 만듭니다.

샘플 비디오에 보이는 모션은 버텍스 셰이더를 사용하여 실시간 절차적 생성된 것입니다. 피벗 페인터 머티리얼 함수는 모델의 잎과 가지 각각에 대한 모션 상속 정보를 이룹니다. 각 엘리먼트에 적용되는 애니메이션에는 자체 개별 피벗 포인트, 방향 벡터, 바운드 사이즈, 상속 모션이 사용됩니다. 그 결과 부드럽고 사실적인 애니메이션이 나옵니다.

이러한 머티리얼 유형 제작은 피벗 페인트 2 의 머티리얼 함수 가 추가되어 훨씬 간편해졌습니다. 콘텐츠 예제에 제공된 것과 같은 샘플 콘텐츠로 위와 같은 특징을 지닌 애니메이션을 어떻게 만드는지 보여줍니다. 이제 서브 오브젝트 피벗 포인트를 구하는 것은 3D Studio Max 에서 피벗 페인터 스크립트로 메시를 처리하고, 파일을 임포트하여 적당한 피벗 페인터 함수를 사용하여 머티리얼을 만들기만 하면 되는 간단한 일입니다. 샘플 폴리지 모션 머티리얼 함수에는 최대 4 단계까지의 계층구조와 3만 개의 모델 엘리먼트까지 지원합니다.

이런 식으로 모션을 만들면 좋은 점이 있습니다. 이 기법으로 처리한 모델은 표준 스태틱 메시보다 UV 채널을 단 하나 더 쓰게 되지만, 스켈레탈 애니메이션보다 비용이 훨씬 싼데, 실시간 계산하기 때문입니다. 버텍스 셰이더 인스트럭션 수는 보통 픽셀 인스트럭션 수보다 그래픽 측면의 퍼포먼스 우려가 덜하게 마련인데, 모델에 있는 버텍스 수가 그 모델이 그리는 픽셀 수보다 훨씬 적기 때문입니다.

이 페이지에 선보인 데모를 몇 가지 살펴보려면, Content Examples 프로젝트를 에픽 게임스 런처에서 받아 PivotPainter2 맵을 열어보면 됩니다.

CE_PivotPainter2Map.png

피벗 페인터 2.0 에서 새로워진 점

피벗 페인터 2.0 릴리즈 이후, MAXScript 에 약간의 개선 및 변화가 보일 것입니다. (하이어라키 페인터처럼) 제거되거나 (오브젝트 별 페인터 에서 버텍스 알파 페인터 처럼) 이름이 바뀐 옵션도 있는 반면, 디테일한 애셋 유형을 만드는 프로세스를 단순화시킨 전반적인 작업방식 개선입니다. 이는 피벗 페인터 2 역량 강화를 위한 일환으로 전보다 훨씬 나은 결과를 내기 위함이며, 결과적으로 콘텐츠 제작 시 폭넓은 옵션을 제공해 드릴 수 있을 것입니다! 추가된 다른 개선사항 관련해서는 아래를 참고하시기 바랍니다.

작업방식 개선

리깅 사전 처리 단계는 Autodesk 3ds Max 의 표준 Link 툴을 통해 이루어집니다. 단순히 나무 모델링은 별도로 하고, 잎과 가지는 논리적 엘리먼트로 합니다. 피벗 위치와 방향이 (오브젝트 전체 길이가 X 축 아래 방향으로) 잘 되어있는지 확인한 뒤 전통적인 릭처럼 하나로 묶어줍니다.

결국, 복잡한 폴리지를 만드는 작업이 훨씬 간단해집니다. 가지 하나에 리깅을 하고, 복제한 뒤, 배치합니다. 부모를 변경한 가지는 자식 계층구조 배치도 유지됩니다.

나무 리깅과 모델링이 다 되었으면 나무의 엘리먼트 아무거나 선택한 뒤 Render Options (렌더 옵션) 섹션 아래 Process The Selected Object Hierarchy (선택 오브젝트 계층구조 처리) 버튼을 누릅니다. 스크립트가 선택된 엘리먼트 계층구조를 자동 탐색하여 루트를 알아낸 뒤 체인을 거슬러 올라가며 자손 전부를 수집하고 처리한 다음, 최종적으로 선택된 렌더 옵션이 무엇이든 그 데이터를 사용하여 텍스처를 렌더링합니다.

ScriptMotion_UI.png

이 메서드는 개별 엘리먼트도 링크된 엘리먼트도 동시에 지원합니다. 풀과 나무가 합쳐진 모델의 경우, 모든 풀잎을 한꺼번에 선택한 뒤 나무에서 엘리먼트를 하나 선택하고 Process Selected Object Hierarchy (선택 오브젝트 계층구조 처리) 버튼을 누릅니다.

텍스처 좌표 제어

이제 어느 UV 세트에 쓸 것인지 제어할 수 있습니다. 이 시스템을 버텍스 애니메이션 툴 과 같은 다른 것에 합칠 수 있는 것입니다. 또 피벗 페인터 2.0 에서 선택한 개인설정은 최종 출력 텍스처 이름에 명시되어 있어 기억을 되살려 줍니다.

자동 작명 규칙은 다음과 같습니다:

[메시이름]_rgb_[현재 텍스처 RGB 선택]_a_[알파 선택]_[UV 채널]

최종 출력 예제는 다음과 같습니다.

ExampleMesh_rgb_PivotPos_a_ParentIndex_UV_2

확장성

처리 및 렌더링 코드를 철저히 추상화시켜, 앞으로 새로운 렌더링 옵션을 추가하는 데 필요한 노력을 최소화시켰습니다.

새 렌더링 옵션

MAXScript 개선사항의 일부로써, 내부적으로 인티저를 플로트 데이터로 저장하는 데 사용되는 비트 시프트 알고리즘이 새로 생겼습니다. 이를 통해 계층구조화가 가능해지고 최대 오브젝트 수가 3,000 에서 30,0000 으로 늘어, 복잡한 폴리지 표현이 용이해졌습니다.

이 나무 애셋에는 14,431 개의 서브 모델이 들어있습니다.

  • 16 비트 RGB:

    • 피벗 포인트 위치

    • 원점 위치

    • 원점 규모(extent)

  • 8 비트 RGB:

    • 오브젝트 기본 벡터 (한 번에 벡터 하나)

  • 16 비트 알파:

    • 부모 인덱스 (Int 를 float 로)

    • 루트에서 여러 단계

    • 엘리먼트 당 0-1 랜덤 값

    • 바운딩 박스 지름

    • 선택 순서 (Int 를 float 로)

    • 0-1 정규화된 계층구조 위치

    • 피벗 위치에서부터 오브젝트 X,Y, Z 바운드 길이

    • 부모 인덱스 (Float - 최대 2048)

  • 8 비트 알파:

    • 계층구조에 0-1 정규화된 위치

    • 엘리먼트 당 0-1 랜덤 값

    • 오브젝트 X,Y,Z 바운드 길이 (최대 2048)

바운딩 박스 재생성

3ds Max 를 사용할 때, 모델링 프로세스 도중 그 서브 오브젝트 지오메트리 시프트가 일어나면서 모델의 바운딩 박스가 확장됩니다. 이 프로세스 도중 오브젝트의 바운딩 박스는 더이상 메시와 평행이거나 방향이 맞춰지지 않습니다. 메시의 피벗 트랜스폼을 변경할 때도 같은 일이 벌어집니다. 이에 대한 처리를 위해 Recreate Bounding Boxes (바운딩 박스 재생성) 섹션으로 선택된 메시의 바운딩 박스를 메시 피벗 포인트에 제대로 평행 및 방향이 맞춰진 것으로 대체하여, 다른 데이터 수집 (버텍스 알파 페인터 및 바운드 정보 등의) 기능 스크립트에 매우 좋습니다.

BoundingBox.png

왼쪽에서, 모델의 피벗 트랜스폼이 변경되었지만 바운딩 박스의 평행 및 방향 설정이 제대로 되어있지 않습니다. Recreate Bounding Boxes (바운딩 박스 재생성) 섹션 아래 Process Selected Objects (선택 오브젝트 처리) 버튼을 사용한 이후에는, 가장 오른쪽 모델의 바운딩 박스 평행 및 방향 설정이 잘 되어있습니다.

선택된 모델의 노멀 병합

Merge Selected Model's Normals (선택된 모델의 노멀 병합) 기능은 다수의 열린 에지 버텍스가 서로 위에 놓이게 된 경우 그 모델들의 노멀을 평균해 내는 기능입니다. 하나의 모델을, 특히나 피벗 페인터에서 쓰기 위해 여러 조각으로 나눌 때 발생하는 노멀 이음새 관련 문제가 해결됩니다.

MergeMeshNormalsButton.png

이전

이후

Merge Mesh Normals (메시 노멀 병합) 버튼을 눌러 접해있는 열린 면의 노멀을 조정합니다.

노멀을 병합하기 전 각 면에 평행을 맞춥니다. 병합 이후 평행이 더욱 잘 맞아 에지가 보다 자연스럽게 어우러집니다.

3ds Max 버전 및 스크립트 정보

이 툴은 현재 3ds Max 2015 2016 으로 테스트했습니다. 다른 3ds MAX 버전을 구체적으로 테스트하지는 않았기에 문제가 발생할 수 있다는 점 참고하시기 바랍니다.

MAXScript 설치 방법은, [UE4Directory]/Engine/Extras/3dsMaxScripts/PivotPainter2.ms 의 그 위치에서 드래그 앤 드롭으로 3ds Max 뷰포트에 놓으면 알아서 실행됩니다.

이 스크립트를 자주 실행해야 하는 경우, 언제든지 툴바나 쿼드 메뉴에 추가하면 됩니다. 그 방법을 잘 모르겠으면, Autodesk 사이트의 매우 자세한 안내(영문) 를 참고해 주시기 바랍니다.

3ds Max 단위 설정

툴을 사용하기에 앞서 먼저 3ds Max 에서 사용하는 척도 단위가 UE4 에서 사용하는 척도 단위에 잘 맞도록 해줘야 합니다. 이런 식으로 3ds Max 툴로 익스포트한 데이터가 UE4 안에서도 같은 방식으로 작동하도록 할 수 있습니다. UE4 에는 기본 척도 단위로 센티미터를 사용하므로, 3ds Max 에서도 그렇게 되어 있는지 확인해 줘야 합니다. 3ds Max 에서 그 설정을 바꾸는 방법은 다음과 같습니다:

  1. 3ds Max 를 열고 메인 툴바에서 Customize > Unit Setup 을 선택합니다.

  2. 다음, System Unit Scale 섹션 아래 System Unit Setup 버튼을 클릭합니다. 드롭다운을 사용하여 세팅을 inches 에서 centimeters 로 변경합니다. 그리고 OK 버튼을 클릭합니다.

  3. 마지막으로 Display Unit Scale Generic Units 로 변경하고 OK 버튼을 누릅니다.

애셋 임포트

애셋을 임포트할 때, 최적의 결과를 얻기 위해 알아둬야 하는 것이 몇 가지 있습니다. 스태틱 메시 텍스처 셋업의 경우 아래와 같습니다.

스태틱 메시

Import Options (임포트 옵션) 창에서 Skeletal Mesh (스켈레탈 메시) 체크를 해제하고 Combined Meshes (메시 합침) 옵션을 켭니다.

Static Mesh Import Options

스태틱 메시 임포트 옵션

이미지를 클릭하면 원본을 확인합니다

  • Skeletal Mesh: 스켈레탈 메시 - 체크 해제

  • Combine Meshes: 메시 합침 - 켜짐

[OPTIONAL] Static Mesh Build Settings

[선택사항] 스태틱 메시 빌드 세팅

이미지를 클릭하면 원본을 확인합니다

  • 프로젝트에 Mesh Distance Fields (메시 디스턴스 필드) 옵션을 켠 경우, 스태틱 메시 에디터 빌드 세팅에서 Generate Distance Field as if Two-Sided (양면인 것처럼 디스턴스 필드 생성) 옵션을 켜는 것이 좋을 것입니다. 콘텐츠에 따라 디스턴스 필드를 전혀 켜지 않는 것이 좋을 수도 있습니다. 그런 경우 Distance Field Resolution Scale (디스턴스 필드 해상도 스케일)을 0 으로 설정하거나, 레벨 디테일 패널에서 Affect Distance Field Lighting (디스턴스 필드 라이팅에 영향) 옵션을 끄면 됩니다.

  • 일부 콘텐츠는 잎이 제 위치를 벗어나는 것이 보이는 경우 Full Precision UVs (최대 정밀도 UV) 옵션을 켜줘야 할 수도 있습니다.

업데이트를 할 때는 리임포트 옵션 대신 항상 "풀" 리임포트(기존 모델 덮어쓰기)를 추천합니다. 머티리얼 관련 문제를 예방하는 가장 안전한 방법입니다.

텍스처

피벗 페인터 2.0 으로 만든 생성 텍스처를 임포트한 이후에는, 텍스처 애셋을 열고 다음과 같이 설정해 줘야 합니다:

8-bit BMP Texture Settings

8 비트 BMP 텍스처 세팅

이미지를 클릭하면 원본을 확인합니다

  • Mip Gen Settings: 밉 젠 세팅 - NoMipMaps

  • Compression Settings: 압축 세팅 HDR (RGB, sRGB 없음)

  • sRGB: sRGB - 체크 해제

  • Filter: 필터 - Nearest (가까운 순)

16-bit EXR Texture Settings

16 비트 EXR 텍스처 세팅

이미지를 클릭하면 원본을 확인합니다

  • Mip Gen Settings: 밉 젠 세팅 - NoMipMaps

  • Compression Settings: 압축 세팅 - VectorDisplacementMap(RGBA8)

  • sRGB: sRGB - 체크 해제

  • Filter: 필터 - Nearest (가까운 순)

셰이더 작성

피벗 페인터에서 렌더링되는 모든 텍스처는 나무의 서브 오브젝트(가지와 잎)에 대한 단순 수학 표현을 만드는 툴을 제공해 줍니다. 그 정보를 가지고, 바람 근원지에 대한 각 서브 애셋의 반응 추정을 시작하여 매우 디테일한 요소의 계층구조를 만들어 자연스러운 모션을 낼 수 있습니다.

셰이더를 자체 제작하려는 경우, 언패킹할 데이터 유형을 몇 가지 알아야 합니다. 언패킹 함수의 작명 규칙은 다음과 같습니다:

ms_PivotPainter2_*

PivotPainter2FolaigeShader (피벗 페인터 2 폴리지 셰이더) 머터리얼 함수는, 말 그대로, 요구에 맞는다면 그 자체를 유용한 머티리얼로 사용할 수 있으며, 자체 폴리지 셰이더를 만들기 위한 발판 역할을 할 수도 있습니다. 피벗 페인터에 사용할 수 있는 머티리얼 함수 관련 자세한 정보는 피벗 페인터 툴 1.0 머티리얼 함수 문서를 참고하세요.

피벗 페인터 2 폴리지 셰이더

머티리얼 안에서 피벗 페인터 2.0 애니메이션을 구현하는 것은 꽤나 간단한데, 백엔드 작업 다수가 이미 구성되어 있기 때문입니다! 단순히 PivotPainter2FoliageShader 를 머티리얼 코드에 삽입한 뒤 머티리얼 어트리뷰트 입력 핀에 최종 연결해 주기만 하면 됩니다. 머티리얼 디테일 패널에서 Tangent Space Normals (탄젠트 스페이스 노멀) 옵션이 꺼졌는지도 확인합니다.

PivotPainter2FoliageShader.png

이 머티리얼 함수는 피벗 페인터의 기본 UV 및 텍스처 세팅으로 애셋을 처리했다 가정합니다.

머티리얼 인스턴스를 생성한 후 접할 수 있는 Wind Settings (바람 세팅)을 통해 서브 오브젝트 계층구조를 제어할 수 있습니다. 이 옵션을 활용하기 위해서는 먼저 영향을 주고자 하는 레벨에서 Wind Setting (바람 세팅)을 켜줘야 합니다.

EnableWindSettings.png

바람 세팅이 켜지면, 해당 계층구조 깊이에 사용할 수 있는 옵션이 보여 편집할 수 있을 것입니다.

이제 Shared Wind Settings (공유 바람 세팅)에 접근하여 피벗 페인터에서 렌더링된 텍스처를 할당할 수 있을 것입니다.

SharedWindSettings.png

  • Position and Index Texture: 위치 및 인덱스 텍스처 - 이 슬롯에 렌더링된 Pivot Positional (피벗 위치) 텍스처를 할당합니다.

  • X-Vector and X-Extent Texture: X 벡터 및 X 익스텐트 텍스처 - 이 슬롯에 렌더링된 X 벡터 및 X 익스텐트 텍스처를 할당합니다.

텍스처가 제대로 할당되었으면, Wind Settings (바람 세팅) 그룹을 열고 원하는 기능을 켜면 됩니다. 각 바람 세팅 그룹은 특정 계층구조 깊이의 메시를 제어합니다. 나무를 예로 들면, 바람 세팅 1 은 몸통을, 다음 그룹은 가지를, 식입니다.

바람 난기류 및 돌풍

이 옵션으로 꽤나 멋진 폴리지 애니메이션을 낼 수 있을 것입니다. 원하는 대로 알맞게 나오지 않는다면, 바람 난기류(turbulence) 및 돌풍(gust) 세기 텍스처를 새로 만들면 됩니다. 그 방법은 벡터의 RGB 값을 사용하여 윈드 벡터에 오프셋을 준 뒤, 알파를 사용하여 바람 세기를 조절합니다. 이 두 채널 세트가 셰이더에서 각각 별도로 샘플링됩니다.

텍스처를 사용하여 바람의 벡터 오프셋 및 세기를 조절하여 다양하게 할 수 있습니다.

최적화

결과물 최적화를 시도할 때는 머티리얼 작동 방식을 이해하면 도움이 됩니다. PivotPainter2FoliageShader 머티리얼 함수는 일반적인 방식으로 디자인되었습니다. 동일한 바람 반응 코드를 4 회 실행합니다. 매 번 다른 세팅 세트를 사용하며 계층구조 깊이가 한 단계씩 깊어집니다. PivotPainter2FoliageShader 머티리얼 함수를 열어보면 그 작동방식을 확인할 수 있습니다.

PivotPainter2FolaigeShader 머티리얼 함수를 열어보면, 머티리얼 인스턴스를 생성할 때 노출되는 Wind Hierarchy Depths (바람 계층구조 깊이)에 대한 셰이더 기능 망을 찾을 수 있습니다.

최적화 기법에 대한 이해를 돕기 위해 아래 섹션을 참고하시기 바랍니다.

머티리얼 인스턴스

모든 셰이더 기능이 활성화되면 꽤나 비싼 머티리얼이 나올 수 있습니다. 셰이더 최적화는 애니메이션이 필요치 않은 바람 세팅 그룹( 또는 나무의 계층구조 수준)을 비활성화시키면 됩니다. 예를 들어, 바람 세팅 4 를 활성화시켜 모델의 잎 자체만 애니메이션을 적용시킬 수 있습니다. 계층구조 깊이로 바람 반응 세팅 그룹을 만든다는 것은, 그 모델의 요소가 같은 방식으로 그룹이 된다는 것을 뜻합니다. 모든 잎은 루트 오브젝트에서 "X" 단계 떨어져 있게 됩니다. 비슷하게 작동하는 가지는 마찬가지로 전부 같은 그룹이어야 할 것입니다. 이런 이유로, 나무같은 애셋에 대해 "부모" 또는 "마스터" 머티리얼 인스턴스를 구성해 두면, 다중 계층구조를 쉽게 만들 수 있어 좋습니다.

InstanceParents.png

베이스 머티리얼 인스턴싱을 통해 "마스터" 머티리얼 인스턴스를 만들고, 이를 사용하여 한 곳에서 모든 바람 세팅을 정의할 수 있습니다. 그 후 머티리얼 인스턴스를 추가로 만들어 계층구조의 픽셀 셰이더 컴포넌트를 정의합니다. 이를테면 몸통, 가지, 잎에 쓸 베이스 컬러 텍스처 같은 것입니다. 이런 식으로, 해당 계층구조 깊이에 필요치 않은 프로퍼티를 비활성화시켜 최적화 작업을 할 수도 있습니다.

예를 들어 잎 머티리얼 인스턴스는 몸통, 가지 양쪽 세트, 잎 자체를 시뮬레이션해야 나무 나머지 부분과 제대로 움직이도록 할 수 있습니다. 반면 몸통 부분은 몸통 애니메이션만 시뮬레이션하면 됩니다. 즉 필요치 않은 잎과 가지에 대한 계층구조는 비활성화시킬 수 있다는 뜻입니다.

벤드 노멀

또 한가지 고려해 볼 최적화라면, 특히나 별도 셰이더를 작성중이거나 수정해서 쓰려는 계획이 있는 경우, 벤드 노멀을 사용하는 것입니다. PivotPainter2FoliageShader 머티리얼 함수는 사용자가 셰이더 안에서 노멀을 업데이트하도록 했을 때 표면 노멀에 실제 회전을 적용합니다. 이 작업은 커스텀 UVs 및 BlendAngleCorrectedNormals 머티리얼 함수를 사용하면 (부작용이 생길 위험은 있지만) 보다 저렴하게 해낼 수 있습니다.

부가 사용 예

위치 정보와 계층구조 깊이를 사용하면 아래와 같은 절자적 성장 또는 빌딩 애니메이션을 만들 수 있습니다. 콘텐츠 예제 맵 PivotPainter2 에서도 이러한 예제 유형을 어떻게 구성했는지 살펴볼 수 있습니다.

이 예제는 에픽게임즈 런처 학습 탭에서 받을 수 있는 Content Examples 프로젝트에서 찾을 수 있습니다. PivotPainter2.umap 을 열어보면 이 맵을 포함해서 다른 예제도 확인할 수 있습니다.

기타 참고사항

  • Wind Actor (윈드 액터)는 UE4 에서 폐기되었으며, 머티리얼 파라미터 컬렉션 및 블루프린트를 사용하여 대체될 것입니다. float 4 윈드 액터 파라미터로 머티리얼 파라미터 컬렉션을 업데이트하는 블루프린트를 만들 수 있습니다. 그 후 주어진 폴리지 머티리얼에서 윈드 액터 대신 그 머티리얼 파라미터 컬렉션을 참조하면 됩니다.

문제해결

모델 애니메이션이 조악해 보이는 경우, 시도해 볼 수 있는 해법은 다음과 같습니다:

  • 애셋을 리임포트합니다.

  • 모델 및 텍스처 세팅을 확인합니다.

  • 머티리얼에 Tangent Space Normals (탄젠트 스페이스 노멀) 옵션이 꺼져있는지 확인합니다.

  • 3ds Max 에서 비균등 스케일 메시는 잘못된 트랜스폼 값을 반환하여 결과가 깨질 수 있습니다. 그런 경우로 판단되면 "Reset XForm" 명령을 시도해 보세요. 비균등 스케일 메시는 오브젝트 레벨에서 보다는 서브 오브젝트를 통하는 것이 항상 안전합니다. 이 작업은 모델 엘리먼트 복제, 부모설정, 배치를 시작하기 전에 해 주는 것이 좋습니다.

  • 셰이더 내 최적화를 통해 메시 워프 현상이 나타날 수 있습니다. 가지에서 바람의 효과를 제대로 계산하기 위해서는, 각 잎의 피벗과 그 벡터에서 바람의 효과를 계산해 줘야 각각의 메시 회전을 실행할 수 있습니다. 모든 회전 및 오프셋 작업은 비싸므로, 각 엘리먼트에 대한 메시 회전은 로컬 스페이스에서 (다른 회전을 고려하기 전) 수행합니다. 그 후 회전에서의 결과 메시 오프셋을 다른 트랜스폼에 더합니다. 이 방식의 정확도는 떨어지지만 비용이 훨씬 저렴합니다. 가끔 이렇게 감소된 정확도가 오프셋 조합에 따라 약간의 폴리지 스케일 변동이 있을 수 있습니다. 그래서 이러한 현상이 발생하면 시도해 볼 수 있는 조치는 다음과 같습니다:

    • 바람 시뮬레이션 강도를 낮춥니다.

    • 애니메이션을 적용할 계층구조 수준 수를 줄입니다.

    • 그러한 우연 발생 빈도가 낮아지도록 메시를 회전시킵니다.

언리얼 엔진 문서의 미래를 함께 만들어주세요! 더 나은 서비스를 제공할 수 있도록 문서 사용에 대한 피드백을 주세요.
설문조사에 참여해 주세요
건너뛰기