내맴대루 블로그
maxscript : Balance Factor Control 본문
스크립트 설명
Biped com 컨트롤러의 Balance Factor 의 값을 0 또는 2로 변경합니다.
마우스 왼쪽 클릭은 현재 키프레임의 값만 수정하고, 마우스 오른쪽 클릭은 모든 키프레임에서 값을 수정합니다.
AutoKey가 켜져 있을때만 작동하며, Biped의 아무 부위를 잡고 해도 실행됩니다.
Script Description
This script changes the Balance Factor value of the Biped COM controller to either 0 or 2.
Left-clicking modifies the value only at the current keyframe.
Right-clicking modifies the value at all keyframes.
It only works when AutoKey is enabled and can be executed by selecting any part of the Biped.
Balance Factor란?
바이패드의 Com을 잡고, Key Info의 Body 섹션에 값 수정이 가능하다.
Com의 무게중심 옮길 수 있는 기능이다.
Pelvis에 있을 때 0값이고, Head에 가까워질때 2값이다.
스크립트 만든 과정.................................
단순히 balace factor값만 바꾸게 만들면 될 줄 알았는데,
메뉴를 통해서 직접 바꾸면 다른 바이패드는 가만히 있고, Com이 움직이는데(정상)
내가 만든 스크립트를 통해서 balancefactor값만 바꾸면 Com은 가만히 있고 다른 바이패드들이 움직이는 것이다!!!! (아주 비정상)
그래서 난관에 봉착했으나 여기저기 물어봐서 해결했다.
값을 바꾸고, Com과 Pelvis사이의 거리를 계산해서 그만큼 X/Y축으로 이동하게끔 했더니 메뉴로 값을 바꾸는 것과 똑같은 결과를 가져왔다.
구조
이거는 코드보다도 구조가 아주 GOOD
(구조 짜는건 내가 한거 아니고 기존에 어떤 분이 공유해주신 스크립트를 바탕으로 만들었다)
(참고 스크립트 : https://blog.naver.com/eeyoreu/222248530773)
fn_함수명 type var
(
if type == 2 then
(
if var == 0 then
(
type이 2면서 var이 0이면, 모든 키프레임 값을 0으로 변경
)
else if var == 2 then
(
type이 2면서 var이 2면, 모든 키프레임 값을 2로 변경
)
)
else if type == 1 then
(
if var == 0 then
(
type이 1이면서, var이 0이면, 현재 키프레임 값을 0으로 변경
)
else if var == 2 then
(
type이 1이면서, var이 2면, 현재 키프레임 값을 2로 변경
)
)
)
on btn1 pressed do
(
fn_함수명 1 2
)
on btn2 pressed do
(
fn_함수명 1 0
)
on btn1 rightclick do
(
fn_함수명 2 2
)
on btn2 rightclick do
(
fn_함수명 2 0
)
처음에 기존 스크립트를 뜯어보면서, 그냥 값만 바꾸면 되는데 키를 왜 Arraykey = #()에 모아둘까? 라는 의문과
(내가 이해못하니까) 몬가 복잡하다는 인상을 받았다.
그.런.데.
코드를 이해하고 나서 다시보니 진짜 갓크립트;;
단순하게 원하는 기능을 나열하는 방식이 아닌, 시스템을 짜고 함수화 시켜서 추후에 기능을 수정할때도 더 용이하고 관리가 쉬워보였다.
이 스크립트로 많이 배웠다!
나는 물론 거리를 계산해서 이동하는 것까지 넣다보니 더 스크립트가 길어지긴 했지만..
이런 간단하고 짧게, 그리고 효율적으로 뚝딱뚝딱 만들어버리게 되는 그날이 오기 까지~~~~ 화이탱
주요 코드
balance factor 값에 접근하려면, bip001노드 컨트롤러의의 horizontal 컨트롤러를 써야한다. (드럽게 복잡^^)
bipNode = $Bip001.controller
hCont = bipNode.horizontal.controller
hCont.balanceFactor = 0
Arraykey = #()
for i in (ans-ans)+1 to nk do
(
append Arraykey (biped.getkey bipNode.horizontal.controller i)
)
at time arraykey[k].time
(
arraykey[k].balanceFactor = var
move bipNode [dx,dy,0]
)
if arraykey[k].time == slidertime do
(
arraykey[k].balanceFactor = var
move bipNode [dx,dy,0]
)
대애략 이런 느낌이다.
Arraykey 리스트에 바이패드의 키를 모아놓고, 전부다 바꿀 때 이용한다!
만들땐 갱장히 힘들게 만들었는데, 만들고 보니 되게 단순해 보이네.... ㅋ
'공부 > max script' 카테고리의 다른 글
maxscript : Paste Animation ( mixer 기능 자동화 ? ) (0) | 2025.01.21 |
---|---|
maxscript : BIP Save and Load (애니메이션 bip파일 저장/로드) (0) | 2024.06.26 |
maxscript : 간단한 명령어 (0) | 2024.05.09 |