본문 바로가기

PMX용 블렌더 튜토리얼

강체와 조인트 구성해서 내보내기 - 2

레퍼런스 - Pymeshio(변종) 다운로드 및 사용법 요약

튜토리얼 - 강체와 조인트 구성해서 내보내기 - 1

튜토리얼 - 강체와 조인트 구성해서 내보내기 - 2


강체와 조인트 정보를 블렌더에서 구성한 다음에 PMX로 내보내는 과정입니다.


총 2회로 나누었으며, 1회차는 우선 PMX에서 import해서 어떻게 데이터가 구성되어 있는지 확인하는 것을 해봅니다.

2회차는 물리연산이 적용될 본을 만들고 weight를 칠한다음, 조인트와 강체를 배치하고 내보내는 예시입니다.


▲ 새로운 개체로써 간단한 Cone을 준비하고 수직방향 edge만 골라서 선택한 다음, subdivide를 사용하는 작업을 반복해서 다단계로 만들었습니다.



▲ 음, 일단 버텍스를 2줄씩 잘라서 각각의 vertex group으로 assign 해주었습니다. 블렌더에서 vertex group은 weight랑 같은 데이터로 처리가 되기 때문에 이렇게 edit mode에서 간단하게 weight를 칠할 때도 있습니다.



▲ 각진 모션은 어색하니까 야들야들하게 움직이게 하기위해서 weight를 smooth하는 작업을 했습니다.

웨이트를 블러(blur)하는 것 같은 효과인데, 이 작업을 Weight Paint mode에서 하려면, 하단 아이콘 중에서 Vertex selection masking for painting을 켜고 전체선택(단축키 A)을 해서 모든 버텍스를 지정합니다.

스크린샷에 보이는대로, 2단계 뻗어나가도록 Iteration을 2로 했습니다. All Groups에 대해서하면 보이지 않아도 나머지 모든 버텍스 그룹에 똑같은 작용이 적용됩니다.



▲ 생각해보니까, 제일 앞에있는 녀석은 머리에 찰싹 붙어있어야하므로 이름이 head가 되어야합니다.



▲ 고깔인지 머리(카락)인지 모르지만 머리라고 하겠습니다. 머리의 버텍스의 위치에 맞는 정확한 위치에 본을 배치하고 싶다면, snap(단축키 Shift+S)기능을 이용합니다. 피벗포인트를 Median으로 설정하면 선택된 버텍스의 평균위치(무게중심)에 해당하는 위치가 기준점이 되는데 이 때, Cursor to Selected를 하게되면 그 기준점으로 Cursor가 이동합니다.



▲ 첫번째 본의 헤드만 선택한 다음에 Selection to Cursor를 하면 헤드의 위치가 아까 선택했던 버텍스의 무게중심으로 정확히 위치하게 됩니다.



▲ 첫번째 본의 꼬리를 위치시키기 위해서 자리를 가늠하고 있습니다.



▲ 여기가 좋겠군요.



▲ 이런 식으로 나머지의 위치를 칼같이 잡아주고, 이름을 머리 모델의 버텍스 그룹과 일치시킵니다.



▲ 강체와 조인트를 아까 import한 뒤 정리해둔 것에서 복사해옵니다.



▲ 강체와 조인트를 따로 구분해서 정리해줄 parent용도로 쓸 Empty 개체를 하나 만들어줍니다.

이 Empty 개체의 위치는 0,0,0으로 계속 고정시키는것이 편합니다. 자물쇠로 모든 파라메터를 걸어잠그세요.



▲ 우측 상단의 Outliner에 예의주시하면서 이름을 적당히 지어줍니다. 적당히 지으면 됩니다. 얘네들은 export안되니까요.



▲ 붙여넣기 했던 강체와 조인트의 부모개체를 아까의 Empty개체로 삼습니다.



▲ 조인트를 duplicate해서 배치합니다. 본의 마디에 정확히 배치하고 싶으면 Shift+S의 snap기능을 써도되고, 모델은 감추고 아마추어가 있는 레이어만 보이게 한 다음에 Magnet을 켜고, Vertex에 스냅되도록 한 다음에, Snap Target을 Median으로 하면, translate할 때, 조인트의 Median포지션이 본의 마디에 착 하고 달라붙습니다. 다 쓰고 난 다음엔 Magnet을 꼭 다시 꺼주세요. 실수의 원인이 됩니다.



▲ 조인트를 다 배치하고 정확하게 사용될 개체의 이름을 지어주었습니다.



▲ 본 중심부분에 강체를 배치하기 위해서 좌표를 따는 모습입니다. 이 위치는 마그넷으로 해결이 안되므로 하나하나 위치를 땁니다.



▲ 복사해온 강체를 위치시키고, Bounds를 Sphere로 표현해봤습니다. scale도 적당히 조절해봤구요.



▲ 강체를 duplicate해가면서 반복해서 전부 배치했습니다. 이름도 정확한 이름들로 바꾸어 주었습니다.

끝에 두 마디는 구형태로 하기엔 무리수가 있어서 실린더(PMX에서는 캡슐)로 할 예정입니다.



▲ 머리 모델과, 조인트의 부모, 강체의 부모를 아마추어 개체의 아이로 넣어주었습니다. 이렇게 해야만 아마추어를 내보내기할 때, 다같이 내보내기 됩니다.



▲강체와 조인트의 파라메터를 수정하기 위한 파이썬 코드를 작성했습니다.

코드를 작성하면서 디버깅을 용이하게 하려면 System Console을 켜세요. 단, System Console을 끌 때, X버튼을 눌러서 끄지 않도록 주의합시다. 저장할건지 묻지않고 바로 꺼져요.(블렌더 2.78a기준)


소스코드는 아래를 클릭하면 보이므로 복사해서 변형하여 이용하세요.

파이썬 문법을 모른다면 인터넷을 통해 간단한 파이썬 문법을 공부하면서 사용해보세요. 정말로 간단한 구문밖에 사용되지 않았습니다.



▲ 변경사항을 적용하고 내보내기 해봅니다.

?? 오류? KeyError: 'head'라고 하네요. head가 없다거나 뭐 그런가봐요.



▲ hair1j 조인트의 const_a = 'head' 인데도 불구하고 head라는 이름의 강체가 없는게 문제였습니다.

머리 빼먹었습니다. 머리... 머리 강체도 만들어줍니다. 머리는 물리연산이 아닌 본추종(rigid_process_type = 0)으로...

이 정도는 그냥 수동으로 입력했습니다.



▲ 변경사항을 적용하고 export해봤습니다.

잘 나왔네요.



강체와 조인트(스프링 6DOF만) 배치해서 내보내는것은 이 예제를 응용하면 뭐든지 다 만들 수 있습니다.

파이썬으로 접근을 쉽게만들면 아무리 복잡해도 다 만들고 쉽게 파라메터를 관리할 수 있죠.


수고하셨습니다.