Version: 2017.1
메시 렌더러(Mesh Renderer)
텍스트 메시

스킨드 메시 렌더러(Skinned Mesh Renderer)

5.6 문서에 추가된 초안
이 기능에는 Unity 5.6에서 추가 또는 변경된 기능이 포함되어 있습니다. 아래 링크는 이러한 추가 또는 변경된 기능의 첫 번째 초안 문서입니다. 따라서 이 문서의 정보는 최종 릴리스 전에 변경될 수도 있습니다.

첫 번째 초안 광원 모드 문서를 참조하십시오.

Unity는 메시의 모양이 미리 정의된 애니메이션 시퀀스에 따라 변형되는 Bone 애니메이션의 렌더링을 위해 Skinned Mesh Renderer 컴포넌트를 사용합니다. 캐릭터 뿐만 아니라 (조인트가 힌지처럼 기능하는 기계와 달리) 조인트가 구부러지는 다른 오브젝트에도 유용한 기법입니다.

스킨드 메시 렌더러는 임포트할 때 이를 필요로 하는 모든 메시에 자동으로 추가됩니다.

프로퍼티

프로퍼티: 기능:
Cast Shadows 활성화되면 메시는 광원이 적당히 비출 때 그림자를 드리웁니다.
Receive Shadows 활성화되면 메시는 다른 오브젝트 때문에 생긴 그림자를 나타냅니다.
Motion Vectors 이 옵션을 활성화하면 선은 카메라 모션 벡터 텍스처에 렌더링된 모션벡터를 가집니다. 자세한 내용은 스크립팅 API 레퍼런스 문서에서 Renderer.motionVectors를 참조하십시오.
Materials 메시와 함께 렌더링될 Materials 의 리스트입니다.
Light Probes 프로브 기반 조명 보간 모드입니다.
Reflection Probes 활성화한 경우 반사 프로브가 씬에 있으면 반사 텍스처가 이 게임 오브젝트에 대해 선택되고 빌트인 셰이더 유니폼 변수로 설정됩니다.
Anchor Override Transform은 라이트 프로브 또는 반사 프로브 시스템 사용시에 보간 포지션을 결정하는 데 사용됩니다.
Quality 스키닝하는 동안 버텍스당 사용되는 최대 뼈대 수를 정의합니다. 뼈대의 수가 많을수록 렌더러의 품질이 높아집니다. Quality SettingsBlend Weights 값을 사용하려면 QualityAuto 로 설정해야 합니다.
Skinned Motion Vectors 활성화되면 메시 스키닝 데이터가 이중 버퍼되어 스킨된 모션이 보간될 수 있고 모션 벡터 텍스처에 배치될 수 있습니다. GPU 메모리 오버헤드가 많지만 더 정확한 모션 벡터를 유도합니다.
Update When Offscreen 활성화되면 스킨드 메시는 모든 카메라에서 볼 수 없을 때에도 업데이트 됩니다. 비활성화되면 게임 오브젝트가 스크린 밖에 있을 때 애니메이션도 실행을 멈춥니다.
Mesh 이 렌더러가 사용하는 메시를 설정합니다.
Root Bone 애니메이션의 “루트”가 되는 뼈대입니다(즉, 다른 모든 뼈대의 움직임에 관련된 뼈대입니다).
Bounds 언제 메시가 화면 밖으로 나가는지를 결정하는 바운딩 영역입니다. 바운드는 모델 파일의 애니메이션과 메시에서 임포트할 때 미리 계산되며 씬 뷰에서 모델 주변의 와이어프레임으로 나타납니다.

세부 정보

Bones 은 애니메이션 도중 메시가 변형되는 방법에 영향을 미치는 스킨드 메시 내부의 보이지 않는 오브젝트입니다. 뼈대는 합쳐져서 계층 구조의 “스켈레톤”을 형성하고 애니메이션은 스켈레톤이 움직이게 하는 조인트의 회전으로 정의된다는 것이 기본 개념입니다. 각각의 뼈대는 주변 메시의 일부 버텍스에 붙어있습니다. 애니메이션이 플레이되면 버텍스는 연결된 뼈대와 함께 움직이고 “스킨”이 스켈레톤을 따라 움직입니다. (예를 들어 팔꿈치처럼)간단한 조인트에서 메시 버텍스는 거기서 만나는 뼈대 모두의 영향을 받으며 메시는 조인트가 구부러짐에 따라 사실적으로 늘어나고 회전합니다. 보다 복잡한 상황에서는 두 개 이상의 뼈대가 메시의 특정 영역에 영향을 미쳐 미묘한 동작이 가능케 합니다.

스킨드 메시는 보통 미리 정의된 애니메이션과 사용되지만 Rigidbody 컴포넌트를 스켈레톤의 각 뼈대에 붙여 물리 엔진의 제어를 받게 할 수도 있습니다. 일반적으로 캐릭터의 팔다리가 폭발에 의해 내던져지거나 부딪힐 때 마구 흔들리는 “래그돌” 효과를 주는 데 활용되는 방식입니다.

품질(Quality)

Unity는 각 버텍스를 하나, 둘, 또는 네 개의 뼈대로 스킨할 수 있습니다. 뼈대 네 개를 사용하면 최상의 결과물이 나오지만 이는 프로세싱 오버헤드를 높입니다. 게임에서는 보통 두 개의 뼈대 웨이트를 사용하는데 이 경우 화질과 퍼포먼스 사이에 균형이 잘 이뤄집니다.

QualityAuto 로 설정되면 Quality SettingsBlend Weights 값이 사용됩니다. 최종 사용자는 스스로 품질 설정을 선택할 수 있고 애니메이션 품질과 프레임 속도 사이에서 적절한 균형을 이룰 수 있습니다.

오프스크린일 때 업데이트(Update When Offscreen)

기본적으로 어떤 카메라에도 보이지 않는 스킨드 메시는 업데이트 되지 않습니다. 메시가 스크린에 다시 나타날 때까지 스키닝은 업데이트 되지 않습니다. 이는 시스템을 절약하기 위해서입니다.

오브젝트의 가시성은 메시의 Bounds 에서 결정됩니다(전체 바운딩 영역은 모든 활성화된 카메라의 뷰 밖에 있어야 합니다). 하지만 애니메이션 메시의 트루 바운딩 영역은 애니메이션이 재생되면서 변경될 수 있습니다(예를 들어 캐릭터가 공중으로 손을 들어 올리면 영역은 커집니다). Unity는 최대 바운딩 영역을 계산할 때 첨부된 모든 애니메이션을 고려하지만 일어날 만한 모든 경우를 예측하기 위해 바운드를 계산할 수 없는 경우도 존재합니다.

다음의 각 예제 상황은 뼈대나 버텍스를 미리 계산된 바운딩 영역 밖으로 밀어낼 때 문제가 됩니다.

  • 런타임에 애니메이션이 추가된 경우
  • 추가 애니메이션
  • 스크립트에서 뼈대의 포지션을 순서대로 바꿀 때
  • 버텍스를 미리 계산된 바운드 바깥으로 밀어내는 버텍스 셰이더를 사용할 때
  • 래그돌을 사용하는 경우

이런 문제에는 두 가지 해결책이 있습니다.

  1. 바운드를 수정해 메시의 잠재적 바운딩 영역을 일치시키기
  2. Update When Offscreen 을 활성화해 스킨드 메시를 항상 스킨 및 렌더링합니다.

일반적으로 퍼포먼스가 더 나은 첫 번째 옵션을 사용해야 합니다. 하지만 퍼포먼스가 주요 관심사가 아니거나 (래그돌을 사용할 때처럼)바운딩 영역의 크기를 예측할 수 없는 경우에 두 번째 옵션을 추천합니다.

스킨드 메시가 래그돌과 더 잘 작동하기 위해 Unity는 임포트할 때 스킨드 메시 렌더러를 루트 뼈대에 자동으로 리맵합니다. 하지만 이는 모델 파일에 스킨드 메시 렌더러가 하나일 때만 해당됩니다. 이는 스킨드 메시 렌더러 전체를 루트 뼈대이나 자식에 첨부하지 못하고 래그돌을 사용하면 이 최적화를 해제해야 함을 뜻합니다.

스킨드 메시 임포트

현재 스킨드 메시는 다음으로부터 임포트할 수 있습니다.

  • Maya
  • Cinema4D
  • 3D Studio Max
  • Blender
  • Cheetah 3D
  • XSI
  • FBX 포맷을 지원하는 툴

모바일 디바이스에서 Unity는 CPU의 스키닝을 직접 손으로 코딩한 NEON/VFP 어셈블리로 처리합니다. 여기서 제한 사항은 노멀 및 탄젠트가 정규화 되지 않기 때문에 직접 셰이더를 작성하는 경우 정규화도 직접 처리해야 한다는 것입니다. 표면 셰이더를 사용한다면 Unity가 정규화를 자동으로 처리합니다.

주의: 최적화된 메시는 최적화되지 않은 메시와 다르게 뼈대를 정렬해 애니메이션에 심각한 문제가 발생할 가능성이 있습니다. 최적화되지 않은 메시는 애니메이션할 때 뼈대 순서에 의지하는 반면 최적화된 메시는 뼈대 이름을 사용하지만 뼈대 순서와는 무관하기 때문입니다.

단순히 FBX 파일을 임포트해 사용한다면 Unity는 트랜스폼의 순서를 살필 것입니다.

고급 사용자가 SkinnedMeshRenderer.sharedMesh를 변경하려는 경우.

  1. ‘비최적화’ 모드에서는 SkinnedMeshRenderer.bonesSkinnedMeshRenderer.sharedMesh와 정확하게 일치하는지 확인해야 합니다. 참조된 트랜스폼의 경우 순서가 정확해야 합니다.
  2. ‘최적화’ 모드에서는 훨씬 간단합니다. 아바타가 참조된 뼈대를 가지고 있는 한 렌더링은 문제 없습니다. 이 경우 SkinnedMeshRenderer.bones는 항상 비어 있습니다.
메시 렌더러(Mesh Renderer)
텍스트 메시