안녕하세요.
애니메이터가 들려주는 맥스 스크립트의 스크립팅하는 애님입니다.
요즘 오브젝트의 머지에 대해서 계속 이야기를 하고 있습니다.
오늘로 오브젝트의 머지를 마무리 지을까 했는데 내용이 길어져서 못 짓겠네요. ㅎㅎ
다음 시간까지 이어지겠습니다.
4. 바이패드의 레이어 문제
지금 머지하는 파일의 노드는 바이패드의 노드에 자식으로 링크가 됩니다.
바이패드로 링크를 할 때 애니메이션 포즈 때문에 부모 자식 간의 위치가 바뀔 수 있기 때문에 바이패드를 피겨 모드로 변환을 합니다.
그런데 애니메이션 작업을 하다보면 바이패드의 레이어를 사용하고 그냥 저장하는 경우가 있습니다.
이 경우 스크립트로 피겨모드를 실행하면 에러가 발생합니다.
해당 문제를 해결하는 스크립트를 추가해봅시다.
이번 작업은 맥스 파일 중에 레이어가 실행된 상태로 저장된 것이 있어야 합니다.
그리고 그 파일이 열린 상태에서 작업을 테스트하며 진행하는 것이 이해하기에 편할 것입니다.
새로운 Max Script Edit탭을 열어 주세요.
바이패드의 레이어를 조작하는 스크립트를 사용하겠습니다.
바이패드 레이어에 대해 자세히 알고 싶으시면 맥스 스크립트의 Search탭에서 Biped Layers를 찾으시면 됩니다.
biped.getCurrentLayer <biped_ctrl>
바이패드의 레이어 중에 현재 사용되고 있는 레이어의 번호를 돌려줍니다. 0은 Original레이어를 사용하는 것입니다.
<biped_ctrl>는 바이패드의 컨트롤러입니다. 바이패드의 노드에 .controller를 붙이면 됩니다.
biped.setCurrentLayer <biped_ctrl> <index>
바이패드의 레이어 중 어느것을 사용할지를 정합니다.
<biped_ctrl>는 바이패드의 컨트롤러입니다. 바이패드의 노드에 .controller를 붙이면 됩니다.
<index>는 사용할 레이어의 번호를 지정합니다.
스크립트의 구성은 다음과 같습니다.
우선 biped.getCurrentLayer를 사용하여 값이 0이 나오면 Original레이어를 사용하기 때문에 피겨 모드를 실행하도록 합니다.
biped.getCurrentLayer가 0 이외의 값이 나오면 추가 레이어를 사용하는 것이기 때문에
biped.setCurrentLayer를 사용하여 Original레이어로 이동 후 피겨 모드를 사용합니다.
링크까지 끝낸 후 biped.setCurrentLayer를 사용하여 원래 레이어를 지정합니다.
말은 그럴싸하게 썼는데 실제론 어떻게 되는 건지 확인해 볼까요?
우선 현재 레이어를 확인해 보기 위해 다음과 같이 입력하여 실행해 봅시다.
1
|
figLayerNum = biped.getCurrentLayer $'Bip001'.controller
|
cs |
MAXScript Listener에서 1이라는 결과가 나오나요?
그 값은 바이패드 레이어에 있는 숫자입니다.
이 값을 figLayerNum에 저장을 했습니다.
그럼 원본 레이어는 몇 번일까요? 위 이미지의 아래 화살표를 눌러봅시다.
원본(Original) 레이어는 0이네요.
즉 현재 레이어가 0이 나와야 피겨 모드가 가능합니다.
if문을 사용하여 figLayerNum가 0이 아니라면 원본 레이어를 선택하도록 해야겠죠?
다음과 같이 추가하고 추가한 라인을 실행해 봅시다.
2
|
if(figLayerNum != 0) do biped.setCurrentLayer $'Bip001'.controller 0
|
cs |
보통 if문을 사용하면 괄호를 넣고 그 사이에 실행될 스크립트를 입력하는데요.
실행될 스크립트가 1줄이라면 괄호를 생략하고 if문 바로 옆에 이어서 쓸 수 있습니다.
쓸데없이 줄 수를 낭비하지 않고 깔끔하게 표현할 수 있습니다.
실행 결과를 확인하면 뭘 잘했는지 MAXScript Listener에 'OK'라고 나옵니다.
결과는 Commomd패널의 모션 > Layers에 아까 봤던 숫자 값이 0으로 바뀐 것으로 알 수 있습니다.
뷰포트의 화면에 레이어용 빨간 줄도 없어졌습니다.
이상 태라면 피겨 모드가 가능해집니다.
피겨 모드도 하고 머지된 노드를 각 노드에 링크도 했다고 생각해 봅시다.
레이어를 하용한 뒤 합치지 않고 저장했다는 것은 레이어를 합치면 안 되는 이유가 있고, 레이어를 사용한 결과물이 최종 결과물일 필요가 있다는 것입니다.(아닐 수도 있고요.ㅎㅎ)
그렇다면 원래 상태로 돌려놓아야겠죠.
다시 한 줄을 다음과 같이 추가하고 확인해 봅시다.
3
|
if(figLayerNum != 0) do biped.setCurrentLayer $'Bip001'.controller figLayerNum
|
cs |
이 라인의 의미는 이전의 라인에서 입력받은 figLayerNum가 0이 아닌 경우 원래 사용하던 레이어가 있었던 것으로 판단하여 모든 작업을 진행하고 끝으로 레이어를 원래 상태로 돌려준다는 것입니다.
뷰포트 상에서는 업데이트가 덜 되는 문제가 있어서 이상해 보이지만 뷰포트를 움직이면 장상 출력됩니다.
열심히 떠들었지만 지금까지 작업한 내용이
레이어가 있으면 > 원본 레이어로 갔다 > 작업 후 원래 레이어로 간다
입니다. (간단한 얘기입니다. ㅎㅎ)
지금 작업한 내용 1,2번 라인이 이전에 작업한 스크립트의 바이 패드 피겨 모드 이전 라인에 입력되고
지금 작업한 내용 3번 라인이 이전에 작업한 스크립트의 저장 이전에 입력됩니다.
즉 다음과 같습니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
|
pName = getSavePath caption:"바뀔 파일" initialDir:"D:\\"
if(pName != undefined) then
(
-- pName에 값이 입력된다면
maxFiles = getFiles (pName + "\\*.max")
if((maxFiles.count > 0)and(doesFileExist (pName + "\\머지할.max") == true)) then
(
format "%\n" maxFiles
for i = 1 to maxFiles.count do
(
if(matchPattern maxFiles[i] pattern:"*머지할.max" == false) do -- 추가부분
( -- 추가부분
loadmaxfile maxFiles[i] quiet:on
figLayerNum = biped.getCurrentLayer $'Bip001'.controller
if(figLayerNum != 0) do biped.setCurrentLayer $'Bip001'.controller 0
$'bip001'.transform.controller.figureMode = true
mergeMAXFile "D:\\test\\머지할.max" quiet:true
$'Point Head'.parent = $'Bip001 Head'
$'Point Spine3'.parent = $'Bip001 Spine3'
$'Point L Hand'.parent = $'Bip001 L Hand'
$'Point R Hand'.parent = $'Bip001 R Hand'
$'Point L Pelvis'.parent = $'Bip001 Pelvis'
$'Point R Pelvis'.parent = $'Bip001 Pelvis'
$'bip001'.transform.controller.figureMode = false -- 추가부분
if(figLayerNum != 0) do biped.setCurrentLayer $'Bip001'.controller figLayerNum
saveMaxFile (maxFilePath + maxFileName)
resetMaxFile #noPrompt
) -- 추가부분
)
)
else
(
messagebox "맥스파일이 없습니다."
)
)
else
(
-- pName에 값이 없다면
messagebox "취소를 선택하셨습니다."
)
|
cs |
실행해 보면 정상 작동을 하며 레이어가 있는 맥스 파일도 잘 머지가 됐습니다.
다음 시간에는 이 스크립트를 UI를 추가하여 사용하기 쉽게 하는 방법에 대해서 이야기하겠습니다.
아마도 정말로 다음번에 머지를 마무리 지을 수 있을 것 같습니다. ㅎㅎ
'맥스스크립트 심화' 카테고리의 다른 글
오브젝트의 선택(2) (0) | 2019.09.13 |
---|---|
오브젝트의 선택(1) (0) | 2019.09.12 |
오브젝트의 머지(7) (0) | 2019.09.11 |
오브젝트의 머지(6) (0) | 2019.09.10 |
오브젝트의 머지(4) (0) | 2019.09.08 |
오브젝트의 머지(3) (0) | 2019.09.07 |
오브젝트의 머지(2) (0) | 2019.09.06 |
오브젝트의 머지(1) (0) | 2019.09.05 |