본문 바로가기
3DMAX/Script

SpaceWarpToMorph(스페이스워프 투 모프)

by tartist 2015. 12. 14.

이번에 만든 툴은 SpaceWarpToMorph(스페이스워프 투 모프)

라는 툴로서

맥스의 스페이스 워프 툴을 활용하여 물결치는 메시를 제작했지만, 엔진(유니티,언리얼)에는 들어가지지가 않습니다.

유니티나 언리얼에도 이런 애니를 넣도록 해주는 기능도 없습니다.

그럴때 맥스에서 제작된 스페이스 워프 애니를 모핑 애니데이터로 변경하여 버텍스애니를 적용하면

엔진에 불러올수 있습니다.

하지만, 이것을 수동으로 애니를 넣으려면 매프레임마다 오브젝트를 복사하여 키를 찍어주는 엄청난 노가다

작업을 해야하는데, 이 툴을 활용하면 버튼한방에 마무리됩니다.

 

 

 

문제의 발생과 피드백 상황

1. try( )catch( ) 명령어를 잘못사용하여 문제 발생
-catch 옆에 ( ) 안쳐서 버그 발생

2. 오브젝트에 모핑 모디파이를 추가하기 위해서는 반드시 오브젝트가 선택되어 있어야 하고
 모디파이 모드임을 알려줘야 하는데 빼먹었음.
max modify mode
select morpherObj

3. 모핑의 오브젝트를 등록하고도 Autoload 를 활성화 시키지 않으면 갱신이 안되는데 빼먹음

morpherObj.modifiers[#Morpher].Autoload_of_targets = 1

1값이면 true 0값이면 false

Default가 false라 발생한 문제

4. for문에서는 ( ) 를 한줄정도 생략이 가능한데, 어느 부분에서 쓰고 빼는지에 대해서 어려움을 느낌.

5. 버그가 엄청 발생했는데, print문을 활용하는 능력이 떨어져 버그 잡는데 많은 시간이 소요됨

 

 

본 공부를 통해 깨닫고 배운 내용

1. 함수 선언의 개념에 대해서 학습 - fn 을 통해 함수를 정의할 수 있고, 함수를 파일로 저장하여
include 명령어로 활용할수 있다.

2. for문과 if문에 대한 반복학습을 통해 개념 파악
- for문으로 곱하기 조차 어려워하던 수준인데.. 이제야 그 수준을 살짝 탈피해 가는거 같습니다..ㅠ

3. 레퍼런스 찾기 연습을 통해 버그나 코딩이 막힐때 해결방법에 대해 숙지
- 여전히 더 많은 훈련이 필요함.

4. 배열의 사용법과 append의 사용법 숙지

5. animationRange 활용법 숙지

6. print 문을 활용하여 버그 잡기

 


스크립트 코드



global g_MeshToMorph


try(destroydialog g_MeshToMorph)catch()


rollout g_MeshToMorph "버텍스애니를 모핑으로"
(
 --로컬로 픽 오브젝트 변수 선언--------------------------------------------------------- 
 local setMainObj
 ----------------------------------------------------------------------------------- 
 
 -- FilterMesh ---------------------------------------------------------------------------
 fn FilterMesh obj =
 (
  if iskindof obj PolyMeshObject or iskindof obj Editable_Mesh then
   return true
  else
   return false
 )

 -----------------------------------------------------------------------------------
 --레이아웃
 -----------------------------------------------------------------------------------
 pickbutton pkn_MeshButton "오브젝트 선택" witdh:180 Filter:FilterMesh
 spinner spn_StartFrame "시작프레임: " range: [-9999,9999,0] type:#integer
 spinner spn_EndFrame "끝프레임: " range: [-9999,9999,10] type:#integer
 button btn_make_morph "모핑시작"
 hyperLink hlnk_Frame "100f" color:(color 28 28 177) align:#left offset:[65,1]
 -----------------------------------------------------------------------------------
 
 -----------------------------------------------------------------------------------
 --한계치 넘어가면 색깔 변하게__
 -----------------------------------------------------------------------------------
 fn SetFrameHlink =
 (
  -- String --
  intervalFrame = spn_EndFrame.value - spn_StartFrame.value + 1
  hlnk_Frame.text = "" -- 한번 지워줘야 잔상이 생기지 않음
  hlnk_Frame.text = (intervalFrame as string) + "f"
  
  -- Color --
  if intervalFrame > 0 and intervalFrame < 101 then
   hlnk_Frame.color = color 28 28 177
  else
   hlnk_Frame.color = color 141 7 58
 )
 
 -----------------------------------------------------------------------------------
 --모핑버튼 활성화 조건--
 -----------------------------------------------------------------------------------
 fn IsValidMorpher =
 (
  startFrame = spn_startFrame.value
  endFrame = spn_endFrame.value
  
  if  startframe - endframe < 0 and abs(startFrame - EndFrame) <100 then
  (
   if SetMainObj != undefined then
    btn_make_morph.enabled =  true
   else
    btn_make_morph.enabled =  false
  )
  else
  (
   btn_make_morph.enabled =  false
  )
  
 )
 
 -----------------------------------------------------------------------------------
 --픽 버튼 누를때 
 -----------------------------------------------------------------------------------
 on pkn_MeshButton picked obj do
 (
  pkn_MeshButton.text = obj.name
  SetMainObj = obj
  
  IsValidMorpher()
  
 )
 -----------------------------------------------------------------------------------
 --시작프레임 수치는 아래 함수를 따른다
 -----------------------------------------------------------------------------------
 on spn_StartFrame changed val do
 (
  IsValidMorpher()
  SetFrameHlink()
  
 )
 -----------------------------------------------------------------------------------
 --끝프레임 수치는 아래 함수를 따른다 
 -----------------------------------------------------------------------------------
 on spn_EndFrame changed val do
 (
  IsValidMorpher()
  SetFrameHlink()
 )
 -----------------------------------------------------------------------------------
 --가장 중요한 모핑시작 버튼을 누를때의 반응설정--
 -----------------------------------------------------------------------------------
 on btn_make_morph pressed do
 (
  startFrame = spn_startFrame.value
  endFrame = spn_EndFrame.value
  
  --애니메이션 구간설정
  animationRange = interval startFrame endFrame
  
   
  targetObjs = #()  --복사될 오브젝트들을 배열로 변수 선언.  배열 번수는 복수형으로 쓰자
  objCount = 0
  
  --프레임 수 만큼 오브젝트 복사  
  for i = startFrame to endFrame do
  (
   slidertime = i
   objCount += 1
   newObj = snapshot SetMainObj
   append targetObjs newobj
   
   --복사된 오브젝트와 원본 오브젝트를 숨겨야 중간에 디버그하기가 편함
   newobj.ishidden = true
   setMainObj.ishidden = true
  )
  
  --모핑추가할 오브젝트 제어
  morpherObj = copy SetMainObj
  convertto morpherObj Editable_Poly
  addmodifier morpherObj(morpher())
  
  
  --모핑 리스트를 자동으로 갱신하기 위해서 필요한 명령어
  morpherObj.morpher.Autoload_of_targets = 1
 
   
  --모핑 오브젝트에 복사된 오브젝트 프레임순으로 등록
  for i=1 to targetObjs.count do  --모핑되는 인덱스를 반복문으로 설정하여 각 인덱스별로 오브젝트가 설정되도록 하기위한 반복문
  (
   WM3_MC_BuildFromNode morpherObj.morpher i targetObjs[i]  -- 모핑 오브젝트의 인덱스 i  그 인덱스에 들어갈 타겟 오브젝트 역시 i
  )
  
  --아래 두 명령어 없으면 실행 안됨
  max modify mode
  select morpherObj
  
  --적용된 모핑리스트들에 키 값 추가
  morpherCount = 0
  for i = startFrame to endFrame do
  (
   morpherCount += 1
   for k = -1 to 1 do
   addnewkey morpherObj.Morpher[morPherCount].controller.keys(i + k) --for문에 ()한개쯤은 생략할 수 있다.
   
    morpherObj.Morpher[morPherCount].controller.keys[2].value= 100
  )
  
  delete targetObjs
  delete SetMainObj
   
  
 )
    
   
)

createdialog g_MeshToMorph width:200 height:200