반응형


안녕하세요~


3D 캐릭터 모델 가지고 에니메이션 중에 상체 움직이기 (본 움직이기)를 하고 싶은경우가 있는데요 

저같은경우 FPS 개발중에서 총을 하늘이나 바닥으로 향할떄 상체가 위쪽이나 아래쪽으로 향하게 혹은 
허리를 굽혀지게 하고 싶었는데요 


아래와 사진과 같이 캐릭터 모델 FBX 파일을 눌시면 아바타를 찾을수 있습니다. 아바타를 눌러보시면 configure Avatar 를 찾을수 있어요 
(단, 캐릭터 모델이 Humonoid 이어야 합니다.)










아래 사진과같이 제가 선택한 본이름을 확인할수 있는데요 

휴머노이드의 Upper Chest 해당하는 부분이 Bip01 Spine2 라는걸 알수가 있네요 




이렇게 에니메이션중 움직일 본이름을 확인한 후


스크립트로 가셔서 제어하시면 됩니다. 



아래 스크립트 한번볼게요~~~







void Start()

{

animator = GetComponent<Animator>();

if (animator)

playerChestTr = animator.GetBoneTransform(HumanBodyBones.UpperChest); // 해당 본의 transform 가져오기

}


public void LateUpdate()

{

Operation_boneRotation();

}



Vector3 ChestOffset = new Vector3(0, -40, -100);

Vector3 ChestDir = new Vector3();

void Operation_boneRotation()

{

//카메라가 보고있는 방향

ChestDir = mainCameraTr.position + mainCameraTr.forward * 50f;

playerChestTr.LookAt(ChestDir); //상체를 카메라 보는방향으로 보기

playerChestTr.rotation = playerChestTr.rotation * Quaternion.Euler(ChestOffset); // 상체가 꺽여 잇어 상체로테이션을 보정하기 

}






위 코드를 보시면 Animator 컴포넌트로부터 해당 본부분의 transform를 가져올수가 있습니다.

 =>playerChestTr = animator.GetBoneTransform(HumanBodyBones.UpperChest);


그리고 Update를 통해서 카메라 보는방향 (저같은경우 FPS 게임이라 카메라 보는방향으로 움직여야해서  카메라방향으로 상체를 움직이도록 햇습니다)

으로 상체를 움직이도록 햇습니다.


여기서 중요한게 LateUpdate() 로 하셔야 적용이되고 본이 움직인다는것을 알아주세요!



playerChestTr.LookAt(ChestDir); 는 상제 transform 이 카메라가 보는 방향으로 하게 한것입니다 .


playerChestTr.rotation = playerChestTr.rotation * Quaternion.Euler(ChestOffset); 는 보정 해주는 코드인데요,


카메라 보는방향으로 LookAt 하게 되더라도 월래 본의 로컬 좌표때문에 허리가 거의 꺽이다시피 상체가 구부러지게 되더라구요 

상체를 세우고 로컬좌표를 다시 맞추기위해 ChestOffset을 추가해서 보정 한겁니다.


이상입니다.



반응형

+ Recent posts