손의 스켈레탈 매시가 좀 이해안되서 블랜더로 내뺴서 보려고함

 

uasset 스켈레탈매시 내보내는 방법은 여기참고

https://forums.unrealengine.com/t/how-can-i-open-a-uasset-file-in-blender/309306

 

How can I open a .uasset file in Blender?

I would like to open the SM_HatTemplateRibbon.uasset file in Blender but I can’t figure out how to import it.

forums.unrealengine.com

 

 

 

 

좀 이상하게 나온다

 

 

 

 

 

 

 

 

 

 

b_l_index2 rot 0, 0,0 설정시

 

 

 

 

 

 

 

 

 

 

b_l_index2의 디폴트 rot -2.9, 0.8, -0.39

 

 

하지만 월드 좌표계기준 90, 5, 3

 

 

r이 90인것은 루트본의 r부터가 90이기때문.

 

 

 

 

 

 

 

 

 

 

루트본인 b_l_wrist와 연결된

b_l_index1의 컴포넌트 좌표계 회전은 3.42, 2.31, -4.89

 

 

루트본 b_l_wrist에서 r로 90도 회전한 상태이어선지

b_l_index1의 r은 90(루트본r) + 3.4(컴포넌트r) = 93.6 인가?

 

 

 

 

 

 

 

 

일단 손목 회전부터 본다고 하는데

월드나 로컬 좌표계 회전이나 똑같이 나온다.

 

로컬좌표계 요를 줬는데, 로컬좌표계 뷰로해도 요가 안오르고 피치가 오른다.

글로벌 좌표계에서 피치가 오르는게 맞긴한데 

왜 동일하게 나오는지 모르겟음 

 

 

 

 

롤 90도 회전하여

전역 좌표계가 지금의 로컬 좌표계로 변환

 

 

 

 

전체 관절의 월드좌표계 회전 0,0,0 으로 했을때 왼손

검지 중지 약지는 맞아보이긴한데

엄지, 소지가 손등에 붙어버린다.

 

 

실제 인게임에도 이렇게 해보자

 

 

 

 

 

 

전체 뼈를 보려고하는데 all bone 대신 all socket 네임즈가 있길래 

socket이 bone과 비슷한거같긴한데 뭔진 잘몰라서 출력해보니

뼈로 알고있던 것들 전체가 나온다.

 

 

 

생각해보니 

어제 사용하는 뼈이름목록을 맵으로 만들어둔게 있었으니 이거쓰면될듯

 

 

 

어제 만들어둔 뼈이름목록맵으로 월드공간 0,0,0 설정하는 bp 작성

 

 

아까 스켈레탈메시를 했던거랑 다르게되는데

생각해보니

이 맵에 전체 뼈 이름을 넣은게 아니엇음.

 

블라즈핸드로 랜드마크가 21개가 나오지만 

뼈랑 매칭이 안되고 몇개를 뺏기때문

 

 

 

 

void ADesktopGameModeBase::make_map_bone()
{
	MapBoneLeft.Add(2, FString("b_l_thumb2"));
	MapBoneLeft.Add(3, FString("b_l_thumb3"));
	MapBoneLeft.Add(4, FString("b_l_index1"));
	MapBoneLeft.Add(5, FString("b_l_index2"));
	MapBoneLeft.Add(6, FString("b_l_index3"));
	MapBoneLeft.Add(7, FString("b_l_middle1"));
	MapBoneLeft.Add(8, FString("b_l_middle2"));
	MapBoneLeft.Add(9, FString("b_l_middle3"));
	MapBoneLeft.Add(10, FString("b_l_ring1"));
	MapBoneLeft.Add(11, FString("b_l_ring2"));
	MapBoneLeft.Add(12, FString("b_l_ring3"));
	MapBoneLeft.Add(13, FString("b_l_pinky1"));
	MapBoneLeft.Add(14, FString("b_l_pinky2"));
	MapBoneLeft.Add(15, FString("b_l_pinky3"));


	MapBoneRight.Add(2, FString("b_r_thumb2"));
	MapBoneRight.Add(3, FString("b_r_thumb3"));
	MapBoneRight.Add(4, FString("b_r_index1"));
	MapBoneRight.Add(5, FString("b_r_index2"));
	MapBoneRight.Add(6, FString("b_r_index3"));
	MapBoneRight.Add(7, FString("b_r_middle1"));
	MapBoneRight.Add(8, FString("b_r_middle2"));
	MapBoneRight.Add(9, FString("b_r_middle3"));
	MapBoneRight.Add(10, FString("b_r_ring1"));
	MapBoneRight.Add(11, FString("b_r_ring2"));
	MapBoneRight.Add(12, FString("b_r_ring3"));
	MapBoneRight.Add(13, FString("b_r_pinky1"));
	MapBoneRight.Add(14, FString("b_r_pinky2"));
	MapBoneRight.Add(15, FString("b_r_pinky3"));



	MapBoneLeft.Add(16, FString("b_l_wrist"));
	MapBoneLeft.Add(17, FString("b_l_thumb0"));
	MapBoneLeft.Add(18, FString("b_l_thumb1"));
	MapBoneLeft.Add(19, FString("b_l_pinky0"));
	MapBoneRight.Add(16, FString("b_r_wrist"));
	MapBoneRight.Add(17, FString("b_r_thumb0"));
	MapBoneRight.Add(18, FString("b_r_thumb1"));
	MapBoneRight.Add(19, FString("b_r_pinky0"));
}

 

 

 

나머지 뼈 이름들도 추가하면 이제 좀 제대로 나온다.

 

 

 

그런데 이해가 안되는게 시작전 손이 이렇게 되있었지만 전부 같은 방향을 향하도록 바뀌엇다.

 

 

월드 스페이스 기준 0,0,0 해서인듯한데

컴포넌트 스페이스로 바꿔서 하면

 

 

액터의 rot이 반영된 상태로 0,0,0 했을때 비슷하게 됫다

 

 

 

엄지가 손 중간으로 파고들어간게

b_l_thumb0를 0,0,0으로 했기때문이었는데

rpy를 디폴트대로 60, -44, -25 로 고정시켜놔야할듯

 

 

 

 

 

 

썸0는 맵 키로 17을 햇으므로

* string eqaul이 안되길래 int인 key사용

MapBoneLeft.Add(17, FString("b_l_thumb0"));

 

 

 

 

이러면 손비슷하게 나오긴할듯 싶었지만

아까 실행할때보다 낫긴한데, 바로 스켈레탈매시 편집기에서 했을때랑 좀 다르게 나온다.

 

 

 

 

 

rot이 다른가 싶어 프린트 추가

 

 

했더니 RPY가 여러가지가 나온다

같은게 4개뜰줄알아슨ㄴ데

 

 

 

뭔가 이상하니 이름도 출력하도록 수정

 

이름은 다같지만 rpy가다르다

 

다시보니 겟 로테이션에서 월드 로했기때문 컴포넌트로 바꿔서 하면

 

 

이제 다 똑같이 나온다.

근데 왜 스켈레톤에디터랑 다르게나오는지 모르겟다.

그래도 대충 원래 손모양이랑 비슷하니

 

썸0 빼고 rpy 조절하면 되지않을까싶다.

 

싶다가

손이 자꾸 롤 90도 회전된게 풀려버리니 b_l_wrist 16도 빼줘야할듯

 

 

 

원래 배치한 방향대로 나오긴한데 

썸1부분이 문제인지 손가락이 사라져보인다.

 

 

썸1도 rpy 0,0,0 안하게 하면

뭔진 모르겟지만 엄지가 계속이상하게나온다.

 

 

일단 넘어가서 기존에 제어하던 모든 손가락을 30도씩 접도록 해보자

키 인트값이 15이하이므로 이 조건으로 하면될거고

 

	MapBoneLeft.Add(2, FString("b_l_thumb2"));
	MapBoneLeft.Add(3, FString("b_l_thumb3"));
	MapBoneLeft.Add(4, FString("b_l_index1"));
	MapBoneLeft.Add(5, FString("b_l_index2"));
	MapBoneLeft.Add(6, FString("b_l_index3"));
	MapBoneLeft.Add(7, FString("b_l_middle1"));
	MapBoneLeft.Add(8, FString("b_l_middle2"));
	MapBoneLeft.Add(9, FString("b_l_middle3"));
	MapBoneLeft.Add(10, FString("b_l_ring1"));
	MapBoneLeft.Add(11, FString("b_l_ring2"));
	MapBoneLeft.Add(12, FString("b_l_ring3"));
	MapBoneLeft.Add(13, FString("b_l_pinky1"));
	MapBoneLeft.Add(14, FString("b_l_pinky2"));
	MapBoneLeft.Add(15, FString("b_l_pinky3"));

 

 

롤로 90도 회전했기때문에 

x는 그대로지만 z축이 오른쪽 y축이 아래를 향하고 있다.

손가락을 접으려면 y축으로 회전해야하므로 피치 30을 주면될듯하다.

 

 

 

컴포넌트 공간 피치 30도 2 ~ 15번 뼈 회전 처리하는 bp

 

 

 

접힌듯하지만 좀 아쉽다 

70도로 수정하면

주먹쥔듯 될줄 알았는데

1번 관절들만 접힌것 같이 됨

 

 

 

 

 

이름이랑 rpy 출력하도록 고쳐서보면

 

 

 

정상적으로 나오긴한다.

 

 

각 관절 피치 70주면 손이 접혀야 될텐데

 

싶다가 지금보니 파란색 z축이니 요인걸 잊엇다.

또 이해안가는건 오른손법칙 생각하면 + 70으로 가야 접힐탠대 여기선 -70으로 가야한다.

 

 

컴포넌트 공간 요로 70도 회전시켯더니 이번엔 이상한 방향으로 간다.

뭐가 문젤까.

 

 

 

16미만은 0,0,90

16이상은 0,0,0 을 줫더니 이런식으로 된다.

 

 

 

 

하다보니 이해된게 나는 set bone rotation by name의

bone space에서

component space를 그냥 컴포넌트 공간에서 묻는건데 

로컬 좌표계 기준으로 회전한다는걸로 오해하고 있었다.

 

월드 스페이스야 월드좌표계 기준으로 간다는거고

일단 뭐가 문젠지 이해했으니 다음글에서 다시정리

 

 

 

 

 

 

 

 

 

 

 

 

 

 

+ Recent posts