5. Importing Objects From 3D Studio Max - 3DS Max에서 오브젝트 불러오기.

Unity3D 2012. 6. 19. 11:42
반응형

Importing Objects From 3D Studio Max

3dsMax에서 작업했을 경우, 당신은 프로젝트에 .max파일을 바로 집어넣거나 Autodesk의 .fbx포맷으로 변환하여 넣을 수 있다. 변환없이 .max파일로 넣는것을 권장한다.

Unity currently imports from 3ds Max => 유니티에서 3DS 맥스로부터 불러오는 것들.

위치, 회전, 크기의 모든 노드, Pivot points와 이름도 불러온다.

정점 색상과 노멀값 그리고 한개 또는 2개의 UV 세트.

재질은 diffuse 텍스처와 색상과 함께 불러오며 메쉬마다 여러개의 재질을 포함할 수 있다.

애니메이션 (뼈대 기반 애니메이션).

To manually export to FBX from 3DS Max => 3DS 맥스로부터 FBX로 수동으로 내보내기.

Autodesk website로 부터 최신의 fbx 추출기를 다운로드 받아 설치하라.

File > Export 또는 File > Export Selected 를 이용하여 기본 옵션을 이용하여 내보내라.

추출된 fbx 파일을 유니티 프로젝트 폴더로 이동하라.

유니티의 화면에 fbx파일이 자동으로 불러와질 것이다.

불러온 파일을 프로젝트 뷰로부터 장면 뷰로 드래그하라.

FBX 추출기의 기본 설정값. (2009. 3 버전)

Exporting Bone-based Animations => 뼈대 기반 애니메이션 내보내기.

뼈 구조를 설정하라.

FK 그리고/또는 IK를 이용하여 당신이 원하는 애니메이션을 만들어라.

모든 뼈 그리고/또는 IK solver를 선택하라.

Motion > Trajectories 로 가서 Collapse를 눌러라. 유니티는 키 필터를 만든다. 그러므로 당신이 내보내는 키의 총량은 관계가 없다.

새로운 FBX 포맷으로 Export 또는 Export selected 하라.

평소처럼 FBX 파일을 Assets 안으로 집어넣어라.

유니티에서 불러온 후, 재질(Materials 폴더 생성)이 새로 생성이 되면 그곳에 텍스처를 재할당해야 한다.

3DS 맥스에서 유니티로 메쉬와 애니메이션과 함께 뼈대 계층을 내보낼 때, 게임오브젝트의 계층은 맥스의 Schematic View에서 볼 수 있는 것과 일치되게 생성될 것이다. 한가지 다른 점은 새로운 루트로써 애니메이션을 포함한 게임오브젝트를 위치시킬 것이다. 그리고 루트 뼈안에 메쉬와 재질정보를 위치시킬 것이다.

같은 유니티 게임오브젝트에 애니메이션과 메쉬 정보를 가지기를 선호할 경우, 맥스의 계층 뷰로 가라. 그리고 뼈대 계층에서 메쉬노드를 뼈의 부모로 설정하라.

Exporting Two UV Sets for Lightmapping => 라이트맵핑을 위한 2개의 UV 세트 내보내기.

유니티에 내장된 lightmapper을 참고하라. 하지만 당신이 3DS 맥스를 사용하기를 더 선호한다면 작업흐름을 더 알맞게 할 수 있다. 일반적으로 UV 세트는 메인 텍스처 또는 노멀 맵을 위해 사용된다. 그리고 또다른 UV 세트는 라이트맵 텍스처를 위해 사용된다.  두개의 UV 세트가 적절하게 들어가기 위해서는, 3DS 맥스에서 재질은 Standard 여야 하고, (메인 텍스처를 위해) 양쪽 다 Diffuse 여야 하며, (라이트 맵을 위해) Self-Illumination 맵 슬롯이 설정되어야 한다.

3DS 맥스에서 라이트맵핑을 위한 재절 설정, Self-Illumanation을 이용.

만약 오브젝트가 Shell 재질 타입을 사용한다면, 현재의 Autodesk사의 FBX 추출기는 UV 세트를 정확하게 내보내지 못한다는 것을 주의하라.

대체하기 위해, 당신은 Multi/Sub 오브젝트를 사용할 수 있고 아래 보여지는 이미지처럼 확산 맵 슬롯(diffuse map slots)에서 메인 텍스처와 라이트 맵을 사용하는 2개의 하위 재질을 설정할 수 있다. 그러나 모델안에서 하위 재질의 아이디를 다르게 사용하는 것을 보게 되면, 이것은 성능을 위해 최적화 되지 못하고 복수 재질을 내보내는 결과를 나타낼 것이다.

3DS 맥스에서 라이트맵핑을 위한 대체 재질(Alternate Material) 설정, multi/sub 오브젝트 재질을 이용.

Troubleshooting => 문제해결

만약 어떤 모델을 불러오는데 문제가 있다면, 가장 최신의 FBX 플러그인을 설치했는지 확인하라.

Importing The Animations using Animation Splitting => 애니메이션을 분리하여 불러오기.

애니메이터가 작업하기 가장 편안한 방법은 하나의 모델이 모든 애니메이션을 가지는 것이다. 애니메이션을 가진 모델을 불러올 때, 당신은 애니메이션의 각 파트를 프레임별로 정의할 수 있다. 유니티는 자동적으로 각각의 파트로 애니메이션을 분리하여 애니메이션 클립(Animation Clips)을 만든다.

모델을 프로젝트안의 Assets폴더안에 이동하면 유니티가 자동으로 불러오는데 프로젝트 뷰에서 그것을 선택하고 Inpector창의 Import Setting에서 편집할 수 있다.

메쉬를 위한 불러오기 설정 대화창

Name

        유니티에서 사용할 애니메이션 클립의 이름을 정의.

Start Frame

        애니메이션의 시작 프레임.

Stop Frame

        애니메이션의 마지막 프레임.

WrapMode

        클립이 재생범위를 넘어섰을 때 어떻게 할 것인가를 정의. (Once, Loop, PingPong, ClampForever)

Loop Frame

        선택하면, 특별한 반복 프레임(loop frame)이 애니메이션의 마지막에 삽입된다. 이 프레임은 클립의 시작프레임과 매치된다. 만약 당신이 반복되는 애니메이션을 만들기를 원하고 시작과 처음 프레임이 정확하면 매칭되지 않을 경우 이것을 사용하라.

Bring the character into the Scene => 장면에 캐릭터 가져오기.

프로젝트 뷰에서 애니메이션 클립을 캐릭터로 드래그하여 애니메이션을 추가할 수 있으며 이것은 또한 기본 애니메이션으로 설정이 될 것이다.

Animating the Character

캐릭터의 실질적인 애니메이션은 유니티의 스크립트 인터페이스를 통해 이루어진다.

Animation Blending => 애니메이션 혼합.

이 시대의 게임에서 애니메이션의 혼합은 부드러운 애니메이션을 가진 캐릭터를 위한 필수 요소이다. 애니메이터는 걷기(walk), 달리기(run), 평상시(idle) 또는 슈팅(shooting) 애니메이션을 분리한다. 특정 지점에서 알맞은 타이밍에 평상시 애니메이션이 걷기 애니메이션으로 부드럽게 변환될 수 있어야 한다.

모든 애니메이션은 마지막 애니메이션을 생성하기 위해 함께 추가되거나 혼합될 수 있다.

일단계는 평상시 애니메이션과 걷기 애니메이션 사이를 부드럽게 전환하는 캐릭터를 만드는 것이다. 스크립트를 작성할 때 이것을 간단히 하기위해, 가장 먼저 오브젝트의 Inspector 창에서 애니메이션의 Wrap Mode를 Loop로 설정할 것이다. 그리고 나서 우리는 스크립트로만 애니메이션을 재생할 수 있도록 하기 위해 오브젝트로 만든 인스턴스의 Inspector 창에서 자동재생(Play Automatically)을 끌 것이다.

캐릭터를 애니메이션시키기 위한 우리의 첫번째 스크립트는 매우 간단하다. 우리는 단지 우리의 캐릭터가 얼마나 빨리 움직이는지 알아내는 몇가지 방법만이 필요하다. 그리고 나서 걷기과 평상시 사이를 전환한다.

using UnityEngine;

using System.Collections;

public class Move : MonoBehaviour

{

        // Use this for initialization

        void Start()

        {

        }

        // Update is called once per frame

        void Update()

        {

                if (Input.GetAxis("Vertical") > 0.2)

                        animation.CrossFade("walk");

                else

                        animation.CrossFade("idle");

        }

}

이 스크립트를 실행하기 위해,

        Assets > Create > C Sharp Script 로 스크립트 파일을 생성하고 이름을 Move로 변경하라.

        위의 코드를 작성하라.

        스크립트를 캐릭터 위로 드래그하라.

게임을 실행하고, UP 화살표키를 누르면 캐릭터를 걷기 시작할 것이고, 키를 놓으면 다시 평상시 상태로 돌아올 것이다.

Animation Layers => 애니메이션 레이어.

레이어는 당신이 애니메이션을 그룹짓고 가중치에 우선순위를 두게 허용하는 믿을 수 없을 만큼 유용한 컨셉이다.

유니티의 애니메이션 시스템에서, 당신은 많은 애니메이션 사이를 혼합할 수 있다. 당신은 수동적으로 가중치 혼합을 지정할 수 있다. 또는 자동적으로 가중치 애니메이션이 되도록 단순히 animation.CrossFade() 함수를 사용할 수도 있다.

가중치 혼합은 적용되기 전에 언제나 일반화 된다.

당신이 걷기와 달리기를 가지고 있고, 양쪽 다 100%의 가중치를 가지고 있다고 하자. 유니티가 마지막 애니메이션을 생성할 때 그것은 가중치로 일반화될 것이다. 이것은 걷기가 50%를 기여하고, 달리기도 마찬가지로 50%를 기여한다는 뜻이다.

이것은 매우 훌륭하다. 하지만 당신은 종종 두 애니메이션이 재생될 때 많은 가중치를 받는 애니메이션에 우선순위를 매기기를 원할 수가 있다. 당신은 수동적으로 가중치의 합이 100%가 되게 할 수 있지만, 이를 위해 레이어를 사용하면 매우 쉬워진다.

Layering Example => 레이어 예제.

당신은 슈팅, 일반, 걷기의 세가지 애니메이션을 가지고 있다고 하자. 당신은 플레이어의 스피드에 따라서 일반 애니메이션과 걷기 애니메이션이 끊김없이 전환되기를 원할 것이다. 그러나 플레이어가 총을 쏠때는 슈팅애니메이션만을 보여주기를 원한다. 이와같이 슈팅 애니메이션은 매우 높은 우선순위를 가지고 있다.

이를 하기 위해 가장 쉬운 방법은 총을 쏘는 동안에 단순히 걷기와 일반 애니메이션을 계속 재생하는 것이다. 그런다음 우리는 걷기와 일반 애니메이션보다 슈팅 애니메이션이 더 높은 레이어에 있게 만들 필요가 있다. 이것은 슈팅 애니메이션이 가중치를 가장 먼저 받는다는 것을 의미한다. 걷기와 일반 애니메이션은 오로지 슈팅 애니메이션이 가중치의 100%를 모두 사용하지 않을 경우에만 가중치를 받을 것이다. 그러므로 슈팅 애니메이션으로 전환될 때, 100%가 되는 짧은 기간동안 가중치는 0부터 시작될 것이다. 처음에는 걷기와 일반 애니메이션이 여전히 가중치를 받을 것이다. 하지만 슈팅 애니메이션으로 완전히 전환되면, 그들은 가중치를 전혀 받지 못할 것이다.

using UnityEngine;

using System.Collections;

public class Move : MonoBehaviour

{

        // Use this for initialization

        void Start()

        {

                // 모든 애니메이션에 루프 설정.

                animation.wrapMode = WrapMode.Loop;

                // 슈팅 애니메이션만 루프 제외.

                animation["shoot"].wrapMode = WrapMode.Once;

                // Put idle and walk into lower layers (The default layer is always 0)

                // 걷기(walk)와 일반(idle)을 하위 레이어로 넣기.(기본값은 0이다.)

                // This will do two things

                // 이것은 2가지를 할 것이다.

                // - Since shoot and idle/walk are in different layers they will not affect

                // - 걷기/일반은 슈팅과 다른 레이어에 있으므로

                //   each other's playback when calling CrossFade.

                //         CrossFade 호출시 서로간의 재생에 영향을 주지 않을 것이다.

                // - Since shoot is in a higher layer, the animation will replace idle/walk

                // - 슈팅이 더 상위 레이어에 있으므로,

                //   animations when faded in.

                //         전환시 걷기/일반을 대체할 것이다.

                // 슈팅 애니메이션을 상위 레이어로 설정하기 위해 1을 준다.

                // 다른 애니메니션은 기본 값이 0이므로 자동으로 하위 레이어가 된다.

                animation["shoot"].layer = 1;

                // 이미 재생중인 애니메이션을 종료. (유저가 자동재생 옵션을 끄지 않았을 경우,)

                animation.Stop();

        }

        // Update is called once per frame

        void Update()

        {

                // Based on the key that is pressed,

                // play the walk animation or the idle animation

                // 눌려진 키에 기반하여 걷기 애니메이션 또는 일반 애니메이션을 재생.

                if (Mathf.Abs(Input.GetAxis("Vertical")) > 0.1)

                        animation.CrossFade("walk");

                else

                        animation.CrossFade("idle");

                // Shoot

                // 쏘기.

                if (Input.GetButtonDown("Fire1"))

                        animation.CrossFade("shoot");

        }

}

기본적으로 animation.Play() 과 animation.CrossFade()는 같은 레이어에 있는 애니메이션으로 전환(FadeOut)되거나 애니메이션을 멈출것이다. 이것은 대부분의 경우에 정확히 우리가 원하는 것이다. 우리의 예제에서는 일반/걷기 애니메이션은 슈팅 애니메이션에 영향을 주지 않고 그 반대이다.

Additive Animations and Animation Mixing => 첨가 애니메이션과 애니메이션 섞기.

추가적인 애니메이션과 애니메이션 섞기는 당신이 당신의 게임을 위해 생성해야할 애니메이션의 수를 줄이도록 허용할 것이고, 이는 얼굴 애니메이션을 생성하는데 중요하다.

달리다가 회전할 때 한쪽으로 쏠리는 캐릭터를 생성하기 원한다고 하자.

당신은 이미 걷기 및 달리기를 만들었고, 이제 당신은 개별적으로 왼쪽으로 쏠린 걷기, 오른쪽으로 쏠린 걷기, 왼쪽으로 쏠린 달리기, 오른쪽으로 쏠린 달리기를 만들어야 한다.

이런식으로 매우 많은 양의 애니메이션을 만드는 것은 거의 불가능이다. 첨가 애니메이션과 애니메이션 섞기가 당신을 구해줄 것이다.

Additive Animation Example => 첨가 애니메이션 예제.

첨가 애니메이션은 당신이 재생되어질 다른 어떤 애니메이션의 위에라도 애니메이션의 효과를 중첩할 수 있도록 허용할 것이다. 첨가 애니메이션을 만들 때, 유니티는 애니메이션 클립의 첫번째 프레임과 현재 프레임 사이의 차이를 계산할 것이다. 그런 후 모든 다른 재생중인 애니메이션에 이 차이를 적용할 것이다.

이제 당신은 왼쪽 쏠림과 오른쪽 쏠림 애니메이션을 만들어야만 한다. 유니티는 이 애니메이션의 레이어를 걷기, 일반 또는 달리기 위에 둘 것이다.

여기 이것을 만드는 코드가 있다.

using UnityEngine;

using System.Collections;

public class Move : MonoBehaviour

{

        private AnimationState leanLeft;

        private AnimationState leanRight;

        // Use this for initialization

        void Start()

        {

                // 에디티브(첨가) 애니메이션 구현

                leanLeft = animation["leanLeft"];

                leanRight = animation["leanRight"];

                // 다른 애니메이션의 전환에 의한 호출이 영향을 주지 않도록 쏠림 애니메이션을 다른 레이어에 넣기.

                leanLeft.layer = 10;

                leanRight.layer = 10;

                // 첨가 애니메이션으로 설정.

                leanLeft.blendMode = AnimationBlendMode.Additive;

                leanRight.blendMode = AnimationBlendMode.Additive;

                // 첨가 애니메이션의 warpMode를 ClampForever로 설정.

                // ClampForever는 클립의 끝에 도달했을 때 자동적으로 멈추지 않는다.

                leanLeft.wrapMode = WrapMode.ClampForever;

                leanRight.wrapMode = WrapMode.ClampForever;

                // 애니메이션을 활성화하고 가중치를 100%로 준다.

                // Upate함수에서 수동적으로 시간을 적용시킬 것이므로 여기서는 animation.Play를 사용하지 않는다.

                leanRight.enabled = true;

                leanLeft.enabled = true;

                leanRight.weight = 1.0f;

                leanLeft.weight = 1.0f;

                // 테스트를 위해 걷기 애니메이션을 루프설정하고 재생시킨다.

                animation["walk"].wrapMode = WrapMode.Loop;

                animation.Play("walk");

        }

        // Update is called once per frame

        void Update()

        {

                float lean = Input.GetAxis("Horizontal");

                // normalizedTime은 클립의 첫 프레임에서는 0이고 마지막 프레임에서는 1이다.

                leanLeft.normalizedTime = -lean;

                leanRight.normalizedTime = lean;

        }

}

팁 : 첨가 애니메이션을 사용하는 경우, 첨가 애니메이션을 사용하는 것과 마찬가지로 모든 변환에 몇몇 비첨가 애니메이션을 재생하는 것 역시 중요하다.

Procedurally animating characters => 절차 애니메이팅 캐릭터

가끔씩 당신은 캐릭터의 뼈를 절차적으로 애니메이션하기를 원한다. 예를 들면, 캐릭터의 머리가 3D 공간상의 특정 지점을 바라보도록 하고 싶어할지도 모른다. 이것은 스크립트와 함께 하는게 최고이다. 다행스럽게도, 유니티는 이것을 매우 쉽게 만든다. 유니티에서 모든 뼈는 단지 스킨드 메쉬를 다루는 변환(Transforms)일 뿐이다. 이와같이 당신은 캐릭터의 뼈를 다른 어떤 게임오브젝트와 마찬가지로 스크립트로 제어할 수 있다.

당신이 알아야 할 한가지 중요한 점은 Update() 함수 이후에 그리고 LateUpdate() 함수 이전에 애니메이션 시스템이 변환(Transforms)을 업데이트 한다는 것이다. 이와같이 만약 당신이 LookAt()함수를 사용하기를 원한다면 애니메이션 중첩을 보장하기 위해 당신은 LateUpdate()함수 안에서 해야한다.

래그돌(물리효과 적용되는 인체모형)은 같은 방식으로 만들어진다. 당신은 단순히 RigidBodies, Character Joints와 Capsule Colliders를 다른 뼈에 첨부해야 한다. 이것은 당신의 스킨드 캐릭터가 물리적으로 애니메이션되게 할 것이다.

Finally => 마지막으로...

캐릭터 애니메이션의 수준 높은 예제를 위한 프로젝트와 애니메이션 스크립트 인터페이스를 살펴봐라.

반응형
: