반응형

이번에 만든 툴은 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

반응형
반응형
 바이패드를 박스모드로 변환시켜주는 툴입니다. 이 툴은 애니메이터들에게 필요한 툴로서 바이패드를 박스형태로

변환시켜 모델 원본을 보는데 방해를 받지 않고 애니메이션 작업을 할 수 있도록 하는 툴입니다.

 

1. 툴 화면


 

2. 전체 바이패드 전환


 

3. 선택 바이패드 전환


 

- 이 스크립트 제작을 통해 배운 내용

1. for문의 사용법 숙지(반복문)

2. 주석처리 방식 숙지

3. true와 false 수치를 글로별변수로 선언하여 제어하는 방법 숙지

4. 메크로 버튼을 만들어 나만의 메뉴를 생성하는 방식

 

코드 원문

--==========================================================================================================
--==========================================================================================================

-- 바이패드 박스 전환툴 : 바이패드를 박스모드로 변환해 해주는 Tool입니다.
-- 버그나 관련 내용 문의 요청 언제나 환영

-- 제작 : Taeyo

--==========================================================================================================
--=====================================================================================================


--박스모드와 플로터에 대한 글로벌변수 선언---------
Global BipedToBoxFloater
Global isBoxMode = true


--===========================================================================================================

---롤아웃지정------

--===========================================================================================================
rollout BipChange "바이패드 박스모드로 변환"
(

 --================================================================================== 
 -----버튼 지정----
 --================================================================================== 
 button BtnBipToBox1 "선택바이패드만전환"
 button BtnBipToBox3 "바이패드 박스모드전환"

 
 --================================================================================== 
 -----선택된 바이패드만 전환시킴-----
 --==================================================================================
 on BtnBipToBox1 pressed do
 (
  
  ----------------------------------------------------
  --SelObj선언---
  ----------------------------------------------------
  SelObj = $
  

  ----------------------------------------------------
  --선택된거 없을때---
  ----------------------------------------------------
  if selection.count == 0 then
   (
    messagebox "선택된게 없습니다."
    return 0
   )
  
  ----------------------------------------------------
  --for문을 통해 선택된 오브젝트가 무엇인지 판별----
  ----------------------------------------------------
    for SelObj in $selection do
   ( 
  
   if iskindof SelObj Biped_Object then
   (
    SelObj.boxmode = isBoxMode
   )
   else
   (
    SelObj.boxmode = isBoxMode
    messagebox "바이패드가 아닙니다."
    return 0
   )
  
   
  )
  
  ---------------------------------------------------------------------
  --isBoxMode로 선언된  글로벌변수를 통해 on/off를 지정할수 있는 함수--------------------------
  ---------------------------------------------------------------------
  if isBoxMode then
  (
   isBoxMode = false
  )
  else
  (
   isBoxMode = true
   return 0
  )
  clearselection()
 )
 
 --==================================================================================
 -------전체 씬을 뒤져서 바이패드만 골라 박스모드로 변환시켜줌------------------------
 --==================================================================================
 on BtnBipToBox3 pressed do
 (
  
  
  ----------------------------------------------------
  --for문을 통해 전체 씬의 오브젝트를 검색함--------------------------
  ----------------------------------------------------
  for obj in objects do
  (
   if iskindof obj Biped_Object then
    obj.boxmode = isBoxMode
  )
  
  ----------------------------------------------------
  --isBoxMode로 선언된  글로벌변수를 통해 on/off를 지정할수 있는 함수--------------------------
  ----------------------------------------------------  
  if isBoxMode then
  (
   isBoxMode = false
  )
   else
  (
   isBoxMode = true
   return 0
  )
   
 )
   
  
)

--===========================================================================================================

------재실행시 기존 창 지우기 위해 트라이 캐치 실행---------------------------------------------

--===========================================================================================================
try(CloseRolloutFloater BipedToBoxFloater) catch()


--===========================================================================================================

---실행창 생성--------------------------------------------

--===========================================================================================================

BipedToBoxFloater = newrolloutfloater "바이패드 박스로 변환툴" 200 130
addrollout BipChange BipedToBoxFloater

반응형
반응형

 

1.메쉬 LOD 변환툴


- LOD를 적용할 메쉬를 선택하여 수치를 정하여 메쉬를 변환시켜주는 툴입니다.

 

1. 툴 화면

 

2. 비대칭 실행시 적용화면 - 원본 오브젝트의 50퍼센트의 LOD를 적용하여 비대칭 메쉬를 새로 생성합니다.


 

 3. 대칭 실행시 적용 화면 - 원본 오브젝트의 50퍼센트의 LOD를 적용하여 대칭 메쉬를 새로 생성합니다.

 

- 이 스크립트 제작을 통해 배운 내용

1. if문의 사용법 숙지(조건문)

2. roll과 button을 사용하여 메뉴 창 생성하는 법

3. 오브젝트의 모디파이의 속성을 제어하는 방법

  

코드 원문

global TEST

rollout noskin "스킨없을때"
 
(
 spinner noskin1 "버텍스수치" range:[0,100,50] type:#integer
 button btn1 "비대칭"
 button btn2 "대칭"
 
 
 on btn1 pressed do
 (
  if selection.count != 1 then
  (
   messagebox "한개만 선택하세요"
   return 0
  )
  
  if $.modifiers[#skin] == undefined then
  
  (
   local VF = noskin1.value
   
   a= $
   copyobj = copy$
   select copyobj
   
   --modPanel.setCurrentObject $.baseObject
   modPanel.addModToSelection (MultiRes ()) ui:on
   $.modifiers[#MultiRes].reqGenerate = on
   $.modifiers[#MultiRes].vertexPercent = VF
   maxOps.CollapseNodeTo $ 1 off
   
   clearselection()
   
   delete a
   
   select copyobj
  )   
  else
  (
   messagebox "스킨없애시오"
   return 0
  )
  
 )
 ----------스킨 없고 대칭 일때-------------------
 on btn2 pressed do
 (
  if selection.count != 1 then
  (
   messagebox "한개만 선택하세요"
   return 0
  )
  
  if $.modifiers[#skin] == undefined then
  
  (
   local VF = noskin1.value
   
   
   a= $
   copyobj = copy$
      
   
   ---헬퍼박스 생성----
   Box lengthsegs:1 widthsegs:1 heightsegs:1 length:5000 width:5000 height:5000  pos:[0,0,0]  name:"Helper_Box"
   select $Helper_Box
   max rotate
   toolMode.coordsys #local
   rotate $(angleaxis -90 [0,1,0])
   move $ [-0.1,0,0]
   macros.run "Modifier Stack" "Convert_to_Poly"
   
  
   select copyobj
   
   modPanel.addModToSelection (Vol__Select ()) ui:on
   $.modifiers[#Vol__Select].level = 1
   $.modifiers[#Vol__Select].volume = 3
   $.modifiers[#Vol__Select].node = $Helper_Box
   modPanel.addModToSelection (Edit_Poly ()) ui:on
   subobjectLevel = 1
   max delete
   maxOps.CollapseNode $ off 
   modPanel.addModToSelection (MultiRes ()) ui:on
   $.modifiers[#MultiRes].reqGenerate = on
   $.modifiers[#MultiRes].vertexPercent = VF
   modPanel.addModToSelection (symmetry ()) ui:on
   $.modifiers[#Symmetry].threshold = 0
   maxOps.CollapseNode $ off
    
   clearselection()
   
   delete a 
   delete $Helper_Box
      
   select copyobj
  )   
  else
  (
   messagebox "스킨없애시오"
   return 0
  )
    
 )

)


----------------스킨있을때-------------------------------------

rollout yeskin "스킨있을때"
 
(
 spinner yeskin1 "버텍스수치" range:[0,100,50] type:#integer
 button btn3 "비대칭"
 button btn4 "대칭"
 
 on btn3 pressed do
 (
  if selection.count != 1 then
  (
   messagebox "한개만 선택하세요"
   return 0
  )
  
  if $.modifiers[#skin] != undefined then
  (
   local VF = yeskin1.value
   
   a= $
   copyobj = copy$
   select copyobj
   
   $.modifiers[#Skin].Enabled = off
   modPanel.setCurrentObject $.baseObject
   modPanel.addModToSelection (MultiRes ()) ui:on
   $.modifiers[#MultiRes].reqGenerate = on
   $.modifiers[#MultiRes].vertexPercent = VF
   maxOps.CollapseNodeTo $ 2 on
   $.modifiers[#Skin].Enabled = on
   
   clearselection()
   
   delete a
   
   select copyobj
  )  
 
  else
  (
   messagebox "스킨을 넣으세요"
  )
 
 )
  
 ------------스킨 있고 대칭 일때---------------------------------------------------------------
 on btn4 pressed do
 (
  if selection.count != 1 then
  (
   messagebox "한개만 선택하세요"
   return 0
  )
  
  if $.modifiers[#skin] != undefined then
  
  (
   local VF = yeskin1.value
   
   
   a= $
   copyobj = copy$
      
   
   ---헬퍼박스 생성----
   Box lengthsegs:1 widthsegs:1 heightsegs:1 length:5000 width:5000 height:5000  pos:[0,0,0]  name:"Helper_Box"
   select $Helper_Box
   max rotate
   toolMode.coordsys #local
   rotate $(angleaxis -90 [0,1,0])
   move $ [-0.1,0,0]
   macros.run "Modifier Stack" "Convert_to_Poly"
   
  
   select copyobj
   
   $.modifiers[#Skin].Enabled = off
   modPanel.setCurrentObject $.baseObject
   modPanel.addModToSelection (Vol__Select ()) ui:on
   $.modifiers[#Vol__Select].level = 1
   $.modifiers[#Vol__Select].volume = 3
   $.modifiers[#Vol__Select].node = $Helper_Box
   modPanel.addModToSelection (Edit_Poly ()) ui:on
   subobjectLevel = 1
   max delete
   maxOps.CollapseNodeTo $ 2 off
   modPanel.setCurrentObject $.baseObject
   modPanel.addModToSelection (MultiRes ()) ui:on
   $.modifiers[#MultiRes].reqGenerate = on
   $.modifiers[#MultiRes].vertexPercent = VF
   modPanel.addModToSelection (symmetry ()) ui:on
   $.modifiers[#Symmetry].threshold = 0
   maxOps.CollapseNodeTo $ 2 on
   $.modifiers[#Skin].Enabled = on
    
   clearselection()
   
   delete a 
   delete $Helper_Box
      
   select copyobj
  )   
  else
  (
   messagebox "스킨을 달라"
   return 0
  )
 )
  
)


TEST = newrolloutfloater "공부용 LOD시스템" 200 200

addrollout noskin TEST
addrollout yeskin TEST

 

반응형

+ Recent posts