2014년 3월 24일 월요일

스프링개량 스크립트 Ver0.8

--------------- 스프링 루트 구간 시작---------------------
createRootPoint = point()
createRootPoint.name = "SpringRoot"
createRootPoint.size = 3.0
createRootPoint.box = true
createRootPoint.cross = false
createRootPoint.wirecolor = (color 200 10 10)
addModifier createRootPoint (EmptyModifier ())
--------------- 스프링 루트 구간 끝---------------------

--------------- 스프링 본 구간 시작---------------------
createBone = Bonesys.createBone[0,0,0][1,0,0][0,0,1]
createBone.name = "SpringBone"
createBone.width = 1
createBone.height = 2
createBone.length = 3
--createBone.boxmode = on
createBone.parent = createRootPoint

createEndBone = Bonesys.createBone[3,0,0][4,0,0][0,0,1]
createEndBone.name = "SpringEndBone"
createEndBone.width = 1
createEndBone.height = 1
createEndBone.length = 1
--createBone.boxmode = on
createEndBone.parent = createBone
--------------- 스프링 본 구간 끝---------------------

--------------- 스프링 포인트 구간 시작---------------------
createSpringPoint = point()
createSpringPoint.name = "SpringPoint"
createSpringPoint.size = 2.0
createSpringPoint.box = false
createSpringPoint.cross = true
createSpringPoint.wirecolor = (color 200 10 10)
createSpringPoint.position = [createBone.length, 0, 0]
createSpringPoint.parent = createRootPoint
createSpringPoint.position.controller =  SpringPositionController()
--------------- 스프링 포인트 구간 끝---------------------

--------------- ExposeTm 구간 시작---------------------
createExpTm = ExposeTm ()
createExpTm.name = "SpringExpTm"
createExpTm.size = 2.0
createExpTm.wirecolor = (color 170 170 170)
createExpTm.parent = createRootPoint
createExpTm.exposeNode = createSpringPoint
createExpTm.useParent  = false
createExpTm.localReferenceNode = createRootPoint
--------------- ExposeTm 구간 끝---------------------

--------------- attrivutes 구간 시작---------------------
springCA = attributes springData
(
parameters main rollout:params
(
yAxisMin type:#float ui:yAxisMin_spi default:-45.0
yAxisMax type:#float ui:yAxisMax_spi default:45.0
zAxisMin type:#float ui:zAxisMin_spi default:-45.0
zAxisMax type:#float ui:zAxisMax_spi default:45.0
forceVal type:#float ui:force_spi default:1.0
editBone type:#integer ui:editBone_cb default:0
)


rollout params "Spring Parameters"
(
spinner yAxisMin_spi "Y-AxisMin " type:#float Range:[-90.0,-1.0,-45.0]
spinner yAxisMax_spi "Y-AxisMax " type:#float Range:[0.0,90.0,45.0]
spinner zAxisMin_spi "Z-AxisMin " type:#float Range:[-90.0,-1.0,-45.0]
spinner zAxisMax_spi "Z-AxisMax " type:#float Range:[0.0,90.0,45.0]
spinner force_spi "Force " type:#float Range:[-100.0,100.0,1.0]
checkbutton editBone_cb "EditBone" checked:false

on editBone_cb changed state do
(
createSpringPoint.position = createEndBone.position
createSpringPoint.rotation = createEndBone.Rotation
editBone_cb.checked = false
)
)
)

ah = createRootPoint.modifiers[#'Attribute Holder']
CustAttributes.add  ah  springCA  #Unique BaseObject:false
--------------- attrivutes 구간 끝---------------------

---------------스프링본에 Rotation_Script_Controller추가 구간 시작------------------
createBone.rotation.controller = rotation_script()
createBone.rotation.controller.script = 
"
y = -(createExpTm.'local Position Z')
z = createExpTm.'local Position Y'
forc = createRootPoint.modifiers[#Attribute_Holder].springData.forceVal
yMinNum = createRootPoint.modifiers[#Attribute_Holder].springData.yAxisMin
yMaxNum = createRootPoint.modifiers[#Attribute_Holder].springData.yAxisMax
zMinNum = createRootPoint.modifiers[#Attribute_Holder].springData.zAxisMin
zMaxNum = createRootPoint.modifiers[#Attribute_Holder].springData.zAxisMax

y = y * forc
z = z * forc

if (y > yMaxNum) do y = yMaxNum

if (y < yMinNum) do y = yMinNum

if (z > zMaxNum) do z = zMaxNum

if (z < zMinNum) do z = zMinNum

rot = eulerAngles 0 y z

rot

"
---------------스프링본에 Rotation_Script_Controller추가 구간 끝------------------

=================================================================================

기존의 맥스 스프링의 경우 포스의 형태가 월드 축을 기준으로 적용되기 때문에 스프링 효과의 X, Y, Z 축을 셋팅하다고 해도 부모노드의 축이 변경된다면 셋팅값이 슬모가 없게 된다.

오토데스크사에서는 왜 이것을 그대로 두는지 모르겠다.
딱히 같은 기능을 하는 다른 명령도 없는데 말이다.

평소에도 가슴본 셋팅을 하면서 이것에 대해 뭔가 해결책이 있을것 이라고 생각했는데, 그간 제대로 고민해 본적은 없다. (물론 이것도 아직 완벽한 스크립트는 아니지만 ㅎㅎ)

이것에 대한 아이디어는 간단했다.
1 스프링 컨트롤러가 적용된 포인터의 Y, Z축의 이동값을 본의 회전값으로 전달한다.
2 회전되는 본의 Rotation Controller를 Script Controller로 특정 각도 이상 회전하지 못하게 한다.

글런데 알고 보니 이미 케릭터 페이셜 리깅에 이런 개념이 있었다. (난 페이셜 컨트롤러를 만들어 본적이 없었기 때문에 이런 간단한것도 몰랐다. ㅠ,.ㅠ)

구현을 해보니 큰 문제가 있었다.
1 이동거리가 회전값이다보니 노드의 크기가 차이가 나면 적용이 너무 작아지거나 너무 커진다.(2미터 짜리 캐릭터의 가슴 움직임 위치값과 20M짜리 캐릭터의 가슴 움직임 위치값은 당연히 차이가 있다)
2 한계 각도가 있기 때문에 한계각도를 넘으면 멈추는것이 당연하지만, 한계값을 넘어가면 스무스하게 멈추지를 못하고 딱 멈춰 버린다.

1번은 내가 수학을 잘한다면 자동으로 해결될 수 있게 할 수 있지만 나는 수학을 못한다. 그래서 공부를 할까 했는데 '낫 놓고 ㄱ자를 모른다.'는 속담이 뭔지 느낄수 있는 계기가 됐다.
그래서 받은값을 곱하기로 증폭하는 수치를 넣었다.(싸게 먹히니까!!!)
2번은 해결방법을 모르겠다.
적당한 함수를 찾아 보려했지만 구할 수가 없었다.
이 두개가 해결된다면 'Ver1.0'이 되겠지만 어쩔 수 없이 'Ver0.8'이다.
뭐 그래도 이정도면 훌륭하게 써먹을 수 있는 녀석이다.

생성되는 오브젝트는 다음과 같다.
SpringRoot - 최종부모이기 때문에 가슴에 이용한다면 바이패드의 Spine에 자식으로 링크를 걸면 된다. 셋팅옵션을 넣을 수 있는 'Attrribute Holder'가 포함된다.
SpringBone - 실제 흔들리는 결과 값을 표현하는 본
SpringEndBone - 본툴을 이용해 'SpringBone'본의 길이를 조정할때와 'SpringPoint'의 위치값을 위한 본
SpringPoint - 'SpringBone'의 흔들리는 가이드를 하는 스프링포인트
SpringExpTm - 'SpringPoint'의 위치값을 부모노드와 얼만큼 멀어지는지를 구하는 역활

생성된 모습에서 빨간 박스형 포인트를 선택하면모디파이어에서 다음과 같은 옵션을 볼 수 있다.

Y, Z - 축의 한계값 셋팅
Force - 가중치를 조정(0은 넣지 말자)
EditBone - 본툴로 본 사이즈를 조절한 후 누르면 스프링포인트위치가 정렬됨



사용법은
1 스크립트를 실행한다.
2 적당한 노드에 링크한다.(단독으로 테스트할때는 필요 없음)
3 메쉬나 오브젝트에 맞게 사이즈 조절한다.(스케일로는 하지는 말것)
4 본 길이가 변경되면 'EditBone'를 한번 누른다.
5 흔들릴 각도를 셋팅한다.
6 스프링포인트가 적당한 값을 갖도록 스프링 셋팅을 한다.
7 본이 스프링에 비슷하게 움직이도록 Force값을 적는다.(스프링포인트가 많이 흔들리는 프레임에서 적용하면 쉽다. 단 적용된값은 바로 표시되지 않으므로 이전프레임으로 갔다가 다시 원래 프레임으로 온다._
8 중간에 본길이를 조정한다면 스프링값이 적용되 않는 프레임(대부분 0프레임)에서 조정하자

언제 수정될지는 모르겠지만 큰 버그가 없는 이상 버전업은 없을것 같다.

2014년 3월 8일 토요일

Boy


Boy from Nlbo75 on Vimeo.

2008년에 작업한 타이페로라는 게임의 작업물이다. 캐쥬얼게임의 캐릭터로 이런저런 공부도 많이했고 애니메이션의 반응도 나쁘지 않았는데 결국 사장이 된게임. 회사를 나온 후에 들은 풍문으론 본전은 뽑았다는것 같다. 무료 툴인 버처덥으로 동영상들을 끼워 맞추려니 튀는 부분이 있다.

2014년 3월 3일 월요일

쫀득리깅


쫀득 from Nlbo75 on Vimeo.

예전에 잠시 진행했던 프로젝트의 캐릭터.
쫀득함을 살리고 파츠교환이 되는 캐릭터의 테스트 모션.
모델링은 다른 분이 작업하셨다.

이때부터 천둥벌거숭이가 리깅에대해 생각하게 된것 같다.
그래도 아직까지 미흡한 부분이 많은것 같다.

타란튤라 테스트


Tarantula from Nlbo75 on Vimeo.

모바일게임용 테스트 몹 타란튤라.
소녀와 다르게 상당히 리얼한 느낌이다.
바이패드 두개를 이어붙여서 실제로 필요없는 본이 꽤 들어있다.
작업한 바이패드 흉내내기 스크립트로 필요한 것만 뽑을 수 있도록 수정해야 할것 같다.
모델링은 다른분이 진행하셨다.

이 몹을 작업하면서 '바이패드 흉내내기 본' 작업을 생각했다.
모델링과 원화를 받고 리얼한느낌에 '보스몹이구나!' 하고 작업을 했는데
나중에 구현된것을 보니 쪼랩 몹이었다.ㅋㅋㅋㅋ
덕분에 애니메이션은 어느정도 덩치가 있는 몹으로 상정하고 작업을 했다.

소녀 테스트 모션


Girl from Nlbo75 on Vimeo.

모바일게임용 테스트 캐릭터.
개인적으론 손발이 작아서 수정을 해야 할것 같다.
(손발의 움직임이 잘 않보인다.)
또한 게임 캐릭터로서 개성이 약한 느낌이다.
모델링은 다른분이 작업하셨다.

테스트를 위해 작업된 모델링이기에 면의 수도 적고, 본의 수도 적기 때문에
표현의 한계가 있다.
색상또한 밝은 색이 대부분이고, 손이 작은 상태에서 옷과 색이 겹치며 동작이 확실히 보이지 않는 느낌이다.

개인적으론 '록맨'이나 '덴마'의 캐릭터같이 손발이 크고 선이 더 굵은 것이 모바일 화면에서 더 좋은 퀄리티를 낼수 있을것 같다.

나중에 여건이 된다면 유니티로 작업된 파일도 올리고 싶다.