반응형

회사 모델러들이 맥스에서 엔진 버텍스를 바로 보고 싶다는 의견이 있어 혼자서 고민하며 만들어봤습니다.

여러가지 이유로 엔진과 동일한 수는 얻어 올 수 있지만, 아래와 같은 방법으로 비슷한 수치는 얻어 올 수 있었습니다.

첨부파일을 받으시면 사용하실 수 있습니다.



1. 모델링 버텍스가 아닌 언렙 버텍스를 계산하라!

언렙을 사용하면 한 버텍스에 두개의 UV정보를 가지게 되는 경우가 생기므로 이 때 버텍스가 증가하게 됩니다.

 

 

따라서 6200개의 버텍스의 모델링이

 

언렙된 버텍스의 수를 계산하면 8500여개가 됩니다.

 

따라서 언렙전과 언렙후에 엔진에서는 버텍스수가 달라지게 됩니다.

스크립트를 사용할 때도 반드시 언렙후에 사용해야 좀더 정확한 수치를 알게 됩니다.

 

 

 

2. 연속성이 떨어지는 메쉬를 재 연산하라.

엔진에서 불 연속성의 메시라고 파단될 경우 2배로 곱해져서 버텍스가 연산된다.

근데 그 기준을 잡기가 매우 애매하다.. 그래서 불연속성이 많이 발생할 것으로 예상되는 아웃라인 쪽의 메시를 한번더 연산했다.

선택하기가 매우 까다로워 약간의 꼼수를 사용했기 때문에 정확한 갯수는 집계가 어렵다.

현재는 이 두가지의 버텍스를 카운트 하여 제법 근사치에 가까운 결과를 얻었습니다.

유니티 9120 - 맥스 6248 = 2872 차이에서

유니티 9120 - 맥스 스크립트 9086 = 34 개 차이가 남


위 모델링 외에 5개를 더 테스트해봐도 꾀 만족스러운 결과를 얻었습니다.

테스트캐릭터   맥스 버텍스 엔진 버텍스 스크립트 사용시
samuro04  6248 (3000차이) 9120 9086 (40 차이)
Achilleus  699 (500차이) 1157 1155 (2 차이)
plane03  822 (700차이) 1568 1422(140 차이)
agentsmire  711 (400차이) 1162 1160 (2 차이)
akedb  685 (500차이) 1201 1152(50 차이)
alfina  783 (400차이) 1179 1203(20 차이)


하지만, 이 외에도 노멀벡터와 라이팅 등에 의해서 재 연산되는 엔진 버텍스를 정확히 재정의하는것은 무리가 있습니다.

위 정보에 따른 버텍스는 언리얼과 유니티도 버텍스수가 다릅니다.

EngineVertexCount.mse

 


 

반응형
반응형

제작한 스크립트를 메뉴에 등록하지 않으면 실 작업자들이 실제로 사용하는데 많은 제약이 따릅니다.

그런 문제가 없기 위해 제작한 스크립트는 반드시 메뉴에 등록을 해줘야하는데, 그 방법에 대한 가이드입니다.



맥스 스크립트 메뉴 등록 가이드

1. 맥스 스크립트 상단메뉴에 들어가려면 반드시 메크로 스크립트로 등록된 스크립트만 사용이 가능 합니다.

  • 현재 사내 매크로 스크립트는 맥스 설치폴더\\MacroSciprs\\Nlabs 폴더에 모여 있습니다.

  • 스크립트는 MacroScript 폴더에 모여있는 매크로 스크립트와 Script 폴더에 모여있는 보통 스크립트로 나뉘어 집니다..

  • 두 개의 차이점 : 

            (1) 매크로는 간단하게 실행가능한 원클릭 스크립트에 대부분 사용된다.  매크로는 맥스가 실행될께 함께 실행 되기 때문에 덩치가 커서는 안됩니다.

            (2) 일반 스크립트는 시퀀스 매니저나 애니메이션 라이브러리 같이 덩치가 큰 스크립트에 사용된다.

                내가 실행을 해야만 작동하기때문에 덩치가 커도 무리가 없습니다.

 

 

2.  매크로 스크립트를 만들기

- 현재 사내에 사용중인 매크로 스크립트들은 메뉴 등록에만 사용되고, 실제 만들어진 덩치큰 스크립트를 실행해주는 교두보 역할을 해주고 있습니다.

- 예) SequenceManeger가 메뉴에 등록될때는 매크로가 사용되고, 메뉴 버튼을 누르는 순간 실제 스크립트가 실행됩니다.

 

**사내에서 사용중인 본 메이커의 실행 매크로 스크립트

macroScript BoneMaker       --> 매크로 등록
category:"Nlabs"                    --> 카테고리 등록
buttonText:"Bone Maker"        --> 메뉴 버튼 이름 등록
tooltip:"Bone Maker"            --> 툴팁 등록
(
 on execute do
 (
   include "Nlabs/BoneMaker.ms"  --> 매크로 스크립트에 실제 스크립트가 실행되도록 연결해 줍니다.
  )
)



 

 

3. 위 매크로 스크립트를 메뉴에 등록시키기 위한 코드

- 아래 코드를 만든 후 Scripts\\Startup 폴더에 저장하시면 맥스가 실행될때 항상 메뉴가 나오게 됩니다.

스타트업에 들어간 스크립트는 맥스가 실행될때 항상 같이 실행되오니 꼭 필요한 것들만 넣어야 합니다.

 

--------------------------------------------------------------------------------------------------------

-- MainMenuClass

--------------------------------------------------------------------------------------------------------

struct MainMenuClass

(

 --------------------------------------------------------------------

 -- FindMenu

 --------------------------------------------------------------------

 fn FindMenu menuName = 

 (

             local menu = menuMan.findMenu menuName -- 없으면 undefined

             return menu

 ),

 

 --------------------------------------------------------------------

 -- AddMenu

 --------------------------------------------------------------------

 fn AddMenu menuName =

 (

             local newMenu

            

             -- 중복 추가 방지 --

             if FindMenu menuName != undefined then

              return undefined

            

             -- Menu 추가 --

             newMenu   = menuMan.createMenu menuName

             mainMenu  = menuMan.getMainMenuBar()

             subMenuItem = menuMan.createSubMenuItem menuName newMenu

             subMenuIndex = mainMenu.numItems() + 1

             mainMenu.addItem subMenuItem subMenuIndex

            

             return newMenu

 ),

 

 --------------------------------------------------------------------

 -- AddItem

 --------------------------------------------------------------------

 fn AddItem menuName item =

 (

             local newIndex

            

             menu = FindMenu menuName

            

             -- Menu가 없으면 패스 --

             if menu == undefined then

              return undefined

            

             newIndex = menu.numItems() + 1

             menu.addItem item newIndex

            

             return newItem

 ),

 

 --------------------------------------------------------------------

 -- RemoveMenu

 --------------------------------------------------------------------

 fn RemoveMenu menuName =

 (

             menu = menuMan.findMenu menuName

            

             if menu != undefined do

              menuMan.unRegisterMenu menu

            

             return ok

 ), 

 

 --------------------------------------------------------------------

 -- UpdateMenuBar

 --------------------------------------------------------------------

 fn UpdateMenuBar =

 (

             menuMan.updateMenuBar()

            

             return ok

 ), 

 

 --------------------------------------------------------------------

 -- CreateActionItem

 --------------------------------------------------------------------

 fn CreateActionItem macroScriptName categoryName =

 (

  local actionItem

 

  actionItem = menuMan.createActionItem macroScriptName categoryName

 

  return actionItem

 )

)

          

(

           menuName    = "Test"

           macroScriptName = "TestItem"

           categoryName   = "Nlabs"

 

           MainMenu = MainMenuClass()

 

           -- menu 만들기 --

           MainMenu.AddMenu menuName

 

           -- Item 만들기 --

           item = MainMenu.CreateActionItem  macroScriptName categoryName

 

           -- menu Item 등록 하기 --

           MainMenu.AddItem menuName item 

 

           -- 화면 갱신 하기 --

           MainMenu.UpdateMenuBar()

)



위 코드를 실행하면 아래 처럼 맥스 메인 메뉴에 원하는 스크립트가 등록이 됩니다.

 


위 상태에서 BoneMaker를 실행하시면 본 메이커 스크립트가 실행됩니다.

 

출처 - ​ http://hwanggoon.tistory.com/212

반응형
반응형

회사에서 맥스 스크립트를 많이 쓰게 되면서 스크립트 관리포인트가 상당히 많이 생겼습니다.

그러다보니 여기저기 버그도 발생하고, 누가 쓰고 있는지 알기도 힘들고, 업데이트 마다 mzp 파일 배포하는 것도 피곤하고..

그래서 SVN이 도입되어 사용되어 왔습니다. 제 선임이 멋지게 구축해 놓은걸 저는 인계받아 쓰고 있는데요

맥스 스크립트에서 SVN에 접근하는 방식에 대한 내용 정리입니다.

출처 -  http://hwanggoon.tistory.com/109

 

 

1. SVN Command Line 설치하기 

다운로드 경로 : http://tortoisesvn.net/downloads.html 

SVN 설치시에는 반드시 Comand 라인을 설치해 줘야만 맥스 설치폴더에서 접근할 수 있게 됩니다.

Command Line 이란? Dos 명령어를 사용해 Svn을 작동 시켜주는 방법입니다.

맥스도 Dos 명령어를 사용할 수 있기 때문에 Command Line을 설치함으로SVN을 맥스에서도 쓸 수 있게 됩니다.

 

 

2. 맥스에서 SVN 사용하기 

1) HiddenDOSCommand 

Dos 명령어를 사용하는 방법은 HiddenDOSCommand 함수를 사용하는 것이 일반적 입니다.

Dos 창이 보이지 않지만 Dos 명령어는 실행 되니깐 즐겨 사용 하는 방법 입니다.

그런데 HiddenDOSCommand는 기능 상 한계가 있는데요.

Log같은 정보를 받을 수 없습니다.

(return 되는 exitCode는 성공, 실패 같은 간단한 정보만을 보여줍니다.)

 

 

2) dotNet Process 

위와 같은 경우는 dotNet을 사용하면 해결 할 수 있습니다.

 

<예제 코드>

commandString = "info \"" + thePath + "\"" -- SVN 파일 경로

-- StartInfo -------------------------------------

 dno_ProcessStartInfo = dotNetObject "System.Diagnostics.ProcessStartInfo"
 dno_ProcessStartInfo.CreateNoWindow = true
 dno_ProcessStartInfo.UseShellExecute = false
 dno_ProcessStartInfo.RedirectStandardOutput = true
 dno_ProcessStartInfo.FileName = "svn"
 dno_ProcessStartInfo.Arguments = commandString
 ------------------------------------------------
 -- Process 적용 --------------------------------
 dnc_Process = dotNetClass "System.Diagnostics.Process"
 process = dnc_Process.Start dno_ProcessStartInfo
 process.WaitForExit()

------------------------------------------------

infoLine = process.StandardOutput.ReadLine()

-- infoLine : svn info 정보를 String으로 받아 볼 수 있음

 

dotNet Process를 사용해서 Dos 명령어를 실행 하는 방법입니다.

WaitForExit는 써주는 것이 좋은데요.

이걸 하지 않으면, Process가 끝나기 전에 MaxScript코드가 실행됩니다.

오류가 날 확률이 있으니 미리미리 방지해 봅니다.

 

 

 

3. User Name 찾기 

 

캐싱파일 분석하기 

SVN을 MaxScript로 만들다 보면 사용자 이름이 필요한 경우가 발생하는데요.

(사용자 정보를 수집할 때 필요하죠.)

SVN 명령어로 사용자 이름을 알 수는 없을 겁니다.

이럴 경우 캐싱 된 SVN파일을 열어 분석해줘야 하는데요.

 

SVN 사용자 정보

경로 : C:\Users\HwangGoon(개인마다 다름)\AppData\Roaming\Subversion\auth\svn.simple

안에 GUI로 되어 있는 파일이 있습니다.

이 파일을 텍스트 편집기에서 열어보면

다음과 같이 나오게 됩니다.

 

K 8
passtype
V 8
wincrypt
K 8
password
V 372
AQAAANCMnd8BFdERjHoAwE/ClK 15+.....
svn:realmstring
V 40
<http://100.100.100.100:80> VisualSVN Server
K 8
username
V 9
hwanggoon
END


 

svn:realmstring 값이 내가 사용하는 Url과 같은지 비교하는 것이 우선이 되겠죠.

(SVN을 2개 이상 사용하는 경우도 많기 때문에)

username 하위에 보시면 hwanggoon이 SVN username입니다.

 - K 8과 같은 코드는 무시하는 것이 좋습니다. 사용자마다 같다는 보장을 할 수 없어요.

 

  

3. SVN 설치 유무 알아내기 

1) TortoiseSVN 설치 알아내기 

특정 프로그램이 설치되어 있는지 확인하는 방법은 윈도우 레지스트리에서 찾을 수 있는데요. 

예제 코드를 보겠습니다.

dnc_Registry = dotNetClass "Microsoft.Win32.Registry"
registryKey = dnc_Registry.LocalMachine.OpenSubKey "SOFTWARE\\TortoiseSVN"

 

위와 같이 찾으면 TortoiseSVN이 설치 되어 있지 않다면 registryKey값은 undefined로 나오게 됩니다.

 

2) Command Line SVN 설치 알아내기 

TortoiseSVN이 설치되어 있어야 Command Line이 있을 수 있겠죠.

그렇다면 위에서 찾은 registryKey를 가지고 한번 더 하위를 찾아 봅니다.

 

dir = registryKey.GetValue "Directory"
svnFile = dir + "bin\svn.exe"

 

이제 svnFile이 있는지 여부만 판단하면 Command Line 설치를 확인이 가능해 지겠죠.

반응형
반응형

스크립트를 만들때 이름으로 서치하는 것은 매우 안좋은 습관이다.

하지만, 바이패드는 이름으로 서치하지 않으면 해당 오브젝트를 찾기 힘들다.

그래서 Script 헬프를 뒤져보니 바이패드의 고유 Node 넘버가 있는것을 확인했다.


biped.getNode $ #lArm link:4  라고 실행하면 아래 표에 따라 L Hand가 호출된다.


Index Limb Name Link Nodes in Link Index Order      
1 #larm L Clavicle L UpperArm L Forearm L Hand
2 #rarm R Clavicle R UpperArm R Forearm R Hand
3 #lfingers L Finger0 L Finger01 L Finger02 L Finger1
    L Finger11 L Finger12 L Finger2 L Finger21
    L Finger22 L Finger3 L Finger31 L Finger32
    L Finger4 L Finger41 L Finger42  
4 #rfingers R Finger0 R Finger01 R Finger02 R Finger1
    R Finger11 R Finger12 R Finger2 R Finger21
    R Finger22 R Finger3 R Finger31 R Finger32
    R Finger4 R Finger41 R Finger42  
5 #lleg L Thigh L Calf L HorseLink L Foot
6 #rleg R Thigh R Calf R HorseLink R Foot
7 #ltoes L Toe0 L Toe01 L Toe02 L Toe1
    L Toe11 L Toe12 L Toe2 L Toe21
    L Toe22 L Toe3 L Toe31 L Toe32
    L Toe4 L Toe41 L Toe42  
8 #rtoes R Toe0 R Toe01 R Toe02 R Toe1
    R Toe11 R Toe12 R Toe2 R Toe21
    R Toe22 R Toe3 R Toe31 R Toe32
    R Toe4 R Toe41 R Toe42  
9 #spine Spine Spine1 Spine2 Spine3
    Spine4      
10 #tail Tail Tail1 Tail2 Tail3
    Tail4      
11 #head Head      
12 #pelvis Pelvis      
13 #vertical Biped COM      
14 #horizontal Biped COM      
15 #turn Biped COM      
16 #footprints Footsteps      
17 #neck Neck Neck1 Neck2 Neck3
    Neck4      
18 #pony1 Ponytail1 Ponytail11 Ponytail12 Ponytail13
    Ponytail14      
19 #pony2 Ponytail2 Ponytail21 Ponytail22 Ponytail23
    Ponytail24      
20 #prop1 Prop1      
21 #prop2 Prop2      
22 #prop3 Prop3      
101 #lfArmTwist L ForeTwist L ForeTwist1 L ForeTwist2 L ForeTwist3
    L ForeTwist4 L ForeTwist5 L ForeTwist6 L ForeTwist7
    L ForeTwist8 L ForeTwist9    
102 #rfArmTwist R ForeTwist R ForeTwist1 R ForeTwist2 R ForeTwist3
    R ForeTwist4 R ForeTwist5 R ForeTwist6 R ForeTwist7
    R ForeTwist8 R ForeTwist9    
103 #lUparmTwist L UpTwist L UpTwist1 L UpTwist2 L UpTwist3
    L UpTwist4 L UpTwist5 L UpTwist6 L UpTwist7
    L UpTwist8 L UpTwist9    
104 #rUparmTwist R UpTwist R UpTwist1 R UpTwist2 R UpTwist3
    R UpTwist4 R UpTwist5 R UpTwist6 R UpTwist7
    R UpTwist8 R UpTwist9    
105 #lThighTwist L ThighTwist L ThighTwist1 L ThighTwist2 L ThighTwist3
    L ThighTwist4 L ThighTwist5 L ThighTwist6 L ThighTwist7
    L ThighTwist8 L ThighTwist9    
106 #rThighTwist R ThighTwist R ThighTwist1 R ThighTwist2 R ThighTwist3
    R ThighTwist4 R ThighTwist5 R ThighTwist6 R ThighTwist7
    R ThighTwist8 R ThighTwist9    
107 #lCalfTwist L CalfTwist L CalfTwist1 L CalfTwist2 L CalfTwist3
    L CalfTwist4 L CalfTwist5 L CalfTwist6 L CalfTwist7
    L CalfTwist8 L CalfTwist9    
108 #rCalfTwist R CalfTwist R CalfTwist1 R CalfTwist2 R CalfTwist3
    R CalfTwist4 R CalfTwist5 R CalfTwist6 R CalfTwist7
    R CalfTwist8 R CalfTwist9    
109 #lHorseTwist L HorseTwist L HorseTwist1 L HorseTwist2 L HorseTwist3
    L HorseTwist4 L HorseTwist5 L HorseTwist6 L HorseTwist7
    L HorseTwist8 L HorseTwist9    
110 #rHorseTwist R HorseTwist R HorseTwist1 R HorseTwist2 R HorseTwist3
    R HorseTwist4 R HorseTwist5 R HorseTwist6 R HorseTwist7
    RHorseTwist8 R HorseTwist9    

 

반응형

+ Recent posts