posted by cimple 2011. 1. 11. 03:42



Solid Skeleton 이 하루만에 버전 2.0 이 나왔습니다. 사용자 입장에서 조금 큰 폭으로 바뀌었기에 아예 버전을 2.0 으로 한 단계 높였습니다. 강화된 기능은 다음과 같습니다.


1. UI 제공
2. 조인트의 크기와 모양을 실시간으로 변환 가능


다음은 시연 동영상입니다.






쉐이더까지 자동으로 입힐 수 있으나, 렌더링은 각자 용도에 맞게 하시면 되리라 생각되어 구태여 넣지 않았습니다.

그럼 유용하게 사용하세요!





Version 2.1 로 업그레이드 되었습니다.

수정 사항은

- 캐릭터가 하나의 조인트 구조가 아닌 여러 개로 따로 떨어진 조인트 구조를 가졌을 경우, 각각의 조인트의 root 를 선택하고 generate 버튼을 계속 누르는 방식으로 추가할 수 있습니다.

- 물론 처음부터 root 에 해당하는 모든 조인트를 선택하고 generate 버튼을 눌러서 생성할 수도 있습니다.

아래는 시연 동영상입니다.




ThEnd.

posted by cimple 2011. 1. 10. 21:23




캐릭터의 Skeleton 을 렌더링 하고 싶을 때가 있지요. 하지만 조인트는 렌더링 되지 않습니다, 따라서 해당 위치에 sphere 와 cylinder 를 넣어주는 마야 파이썬 스크립트를 짜 보았습니다.

원래 Solid Skeleton 이라는 멜이 있지만, 해당 스크립트는 cone 을 생성하는 방식으로 되어 있어서, 파이썬 버전으로 새롭게 만들었습니다.

사용 방법은 간단합니다.



1. root 조인트를 선택
2. makeSolidSkeleton() 실행



이렇게 하면 됩니다,
(물론, 파이썬 스크립트이므로 스크립트 에디터의 파이썬 탭에서 실행해야 하는 건, 다들 아시죠?)

그리고 파라미터를 조절해서 스켈레톤의 구와 막대의 크기를 조절하는 것이 가능합니다.

makeSolidSkeleton(ballScale, edgeScale)

여기 ballScale 과 edgeScale 의 값을 바꾸어 주면 됩니다. 기본값은 둘다 1.0 으로 되어 있습니다.

ex) makeSolidSkeleton(2, 0.5)
이렇게 하면 구는 두배로 커지고 edge 는 절반으로 가늘어 질 것입니다.


마음껏 사용하시고, 버그나 수정사항이 발견되면 말씀해 주세요!

ThEnd.
posted by cimple 2010. 11. 15. 23:31

Maya 에서 스크립트를 작성하다 보면 무한 루프에 빠지는 경우가 있다.

for 문이나 while 문 (특히 while 이놈!) 을 잘못 쓰면 무한 루프에 빠져 버리는 경우가 있는데,

ctrl+break 가 통하는 것도 아니고 esc 를 아무리 연타해도 안 되고, 마야가 먹통이 되어 버려서 결국에는 작업관리자를 켜야만 하는 처지에 놓이게 된다.

이 때, 반복문 내에 무한루프를 방지할 수 있는 간단한 장치를 마련할 수 있는데, 방법이 조금 독특하다.

'외부 파일을 이용' 하는 방법이다. 


사용 방법은 다음과 같다.




1. 위에 첨부된 파일(BREAKMEL.bat) 를 받아서, 소중한 곳에 잘 간직해둔다.
2. 마야에서 MEL scripting 을 하면서, 무한루프가 의심되는 반복문 안에 다음 구문을 넣어준다.

import os
if os.path.exists("c:/breakMel") : break
3. 만약 스크립팅을 하다가 무한 루프에 빠지면, 첨부된 파일을 실행하기만 하면 반복문이 종료될 것이다.



간단한 예제는 다음과 같다.



위와 같은 구문을 스크립트 에디터에서 실행하면, 아마 지구가 멸망할 때까지 1을 찍어댈 것이다.
이 때, 첨부된 BREAKMEL.bat 를 실행시키기만 하면 무한루프를 중지시킨다.
이 때 임시로 생성되는 파일은 자동으로 삭제되니 신경쓰지 않아도 된다.




이 방식의 원리는 다음과 같다.

1. 반복문이 계속 돌면서, 컴퓨터 내부에 특정 파일이 존재하는지 계속 검사를 한다.
2. 만약 무한루프에 빠지면, 그 특정 파일을 생성시킴으로써 반복문을 종료시킬 수 있다.


여기에서 '컴퓨터 내부를 계속 검사한다' 라는 부분이 상당히 찜찜하게 느껴질 것이다.
하지만, 이 방식을 처음 제시한 저자에 따르면 거의 퍼포먼스의 저하가 없다고 한다.

첨부파일인 BREAKMEL.bat 는 뭐 복잡한 구조를 가지고 있는 것이 아니라, 다음이 전부이다.


즉, c:\ 에 breakMel 이라는 가상의 파일을 하나 만들고, 아무 키나 누르면 그걸 지운다는 거다.


재밌는 방식이고, 꽤나 괜찮은 아이디어이다.
하지만 퍼포먼스의 저하가 '전무' 하다는 것은 사실 믿을 수 없다;; 약간 궁여지책처럼 느껴지기도 하고, 의심이 많이 가는 반복문에서만 사용하는 것이 좋을 것 같다.



아이디어는 다음 블로그 포스팅에서 참고하였다.

http://www.naughtynathan.co.uk/?p=59



ThEnd.

posted by cimple 2010. 8. 17. 14:29

Python Script 로 처음 구현해 본 Fibonacci 수열이다.

List 를 사용해서 손쉽게 구현할 수 있었다.



fibonacci = [1, 1]
max_range = 7;

for i in range(0, max_range-2, 1):
   a1 = fibonacci[i];
   a2 = fibonacci[i+1];
   fibonacci.append(a1+a2);

print fibonacci



그리고 이 Fibonacci 수열을 이용해서 구를 extrude 시키는 기능을 구현해 보았다.


코드는 다음과 같다.





numFace = 0;

for i in range (0, len(fibonacci), 1): 
   mc.select(cl = True); 
   for j in range(0, fibonacci[i], 1):
      mc.select("pSphere1.f[%d]" % numFace, add=True)
      numFace = numFace+1   
   mc.polyExtrudeFacet(ltz = 0.1*fibonacci[i]);


그런데 이 때, 2번째 for 문의 range 를 1로 시작하는 실수를 했더니 계속해서 문제가 발생했다.
즉, 이런 형태의 for 문이 만들어지면

for i in range (1, 1, 1)

for 문은 아무런 기능을 하지 못하고, 만약 그 안에서 특정 기능을 수행해야 할 경우 error 를 발생시키게 된다.

좌우지간 위의 코드를 실행하면 다음과 같은 결과를 얻는다.








그리고 다음은 피보나치 수열을 11번 항까지, 그리고 extrude 에 keepFacesTogether = 0 을 주고 실행한 모습.




별 거 아니지만 재밌다.


ThEnd.

posted by cimple 2010. 8. 13. 16:03

(어쩐지 좀 두서없는 포스팅같기는 한데;; 그리고 요즘 R 프로그래밍을 함께 공부하고 있는데 Python 과 문법이 유사하다는 생각을 무척 많이 하고 있다.)


1. Python 의 List 생성.

Python 의  List 는 데이터를 저장하는데 훌륭한 자료구조를 제공해주고 있다.
일단 Python List 에 데이터를 저장하기 위해서는 다음과 같이 저장한다.


myFirstList = ["red", 21.00, 1]


myFirstList 라는 list 이름을 정해주고, 대괄호 [] 로 묶어주면 그 안에 원하는 data 를 넣어주면 된다. 이 때 data 의 type 이 위의 예제처럼 달라도 상관이 없다.

MEL 에서는 이것이 불가능했지만, python list 에서는 가능하고, 심지어 list 도 list 안에 들어가기 때문에 간편하게 데이터를 관리할 수 있다.


list 에 있는 데이터에 접근하기 위해서는 c 의 배열에 접근하는 방법과 비슷하게 접근하면 된다.

myFirstList[0];

위에는 "red" 가 들어있게 된다.



재미있는 것은, maya 에서 현재 내가 선택하고 있는 object 를 list 안에 등록할 수 있다.
다음과 같이 등록하면 된다.

import maya.cmds as mc;
listObject = mc.ls(sl=True);

MEL 커맨드로 ls -sl 을 하면 현재 내가 선택하고 있는 object 를 반환하는 기능을 이용한 것이다.
print 해 보면 다음과 같이 나온다.

print listObject;

[u'pSphere1', u'pCube1']


pSphere1 을 먼저 선택하고, pCube1 을 다음에 선택한 다음 list 에 등록하면 위와 같이 들어간다.

u가 붙은 이유는 잘 알수 없으나, 실제로 값을 빼 보면 u 는 빠져있고 pSphere1 만 나온다.






2. List 의 크기 받아오기

언제나 자료의 크기를 아는 것은 중요하다. Python Script 에서는 len() 이라는 함수를 사용한다.

len(custom_list);

이것으로 사용자가 생성한 list 의 크기를 알 수 있다.







3. List 의 data 에 iterative 하게 접근하기

List 의 data 에 대하여 iterative 하게 접근할 수 있다. 이는 for 문으로 가능한데, Python Script 에서 for  문은 다음과 같은 형태를 가진다.


for i in range(start, end, increment)


그리고 Python Script 의 for 문은 조금 독특한 문법을 가지고 있는데, for 문 다음에 콤마 (:) 로 시작해서 들여쓰기로 해당 scope 를 표시한다. 즉


for i in range(0, 5, 1) :
          print i
print "done"



위와 같은 코드가 있을 때, i 는 1, 2, 3, 4, 5 로 반복문을 돌면서 찍히겠지만 "done" 은 한 번만 찍힌다.


for i in range(0, 5, 1) :
          print i
          print "done"


위와 같은 경우는 done 도 5번 찍히는 것이다.

이 반복문을 이용해서 list 안에 있는 data 들에 접근하기 위해서는



for i in range(0, len(custom_list), 1):
          print(custion_list[i])




이렇게 하면 list 에 있는 요소들에 순차적으로 간편하게 접근할 수 있다.







ThEnd.




p.s. 다음 링크로 가면 파이썬의 기본 데이터 유형인 사전, 리스트, 터플에 대해서 소개하고 있다.

http://coreapython.hosting.paran.com/dive/chap03.html#d0e5887
 
posted by cimple 2010. 8. 12. 19:12

1. Python Scripting 시작하기

Maya 에서 Python Scripting 을 가장 간단히 할 수 있는 방법은 MEL 과 똑같이 Script Editor 를 사용하는 방법과 Command Line 을 사용하는 방법이다.

하지만 Python Script 를 실행하기 위해서는 해당 실행창에서만 실행 가능하다.

Script Editor 에서는 Python 탭에서 실행해야 하고,



Command Line 에서는 좌측의 MEL 글자를 클릭하면 Python 스크립트 입력창으로 바뀌게 된다.




2. Hello World 찍어보기

Script Editor 의 Python 탭에서 간략하게 Hello World 를 찍어보자.
다음과 같이 입력하면 된다.


print "Hello, World!"






이렇게 입력한 뒤 실행하면 위쪽의 History 창에 실행 결과가 표시될 것이다.
다음도 가능하다.


print 25
print 25 / 2
print 25.0 / 2
print 25 / 2.0






3. Cube 하나 만들어보기

Python Script 를 실행하기 위해서는 maya 의 특정한 모듈들을 import 해야 한다.
그리고 그 모듈 안에 들어 있는 명령어를 실행하는 방식으로 이루어진다.

요약하면

Step 1) 필요한 Maya 모듈 import
Step 2) 필요한 명령어 실행


순으로 이루어지는데, 큐브를 하나 생성하려고 하면

ex)
import  maya.cmds
maya.cmds.polyCube()


이런 식으로 실행해야 한다.



import 는 한 번만 해도 되지만, 명령어를 실행할 때에는 매번 위와 같이
maya.cmds.명령어()
의 형태로 입력해야 하며, 커맨드를 하나의 function 처럼 인식하므로 뒤에 괄호 () 를 붙여 주어야 한다.

물론 저렇게 입력하는 것이 tedious 한 일이므로, 좀더 간결하게 입력하기 위해서

import maya.cmds as mc

이렇게 mc 라는 단축어로 import 하면 앞으로

mc.polyCube()

로 실행해도 정상적으로 실행할 수 있다.





4. MEL command 의 Echo 를 Phython Command 에서 실행하는 방법
(Phython Command 에 각종 Flag 를 추가하여 실행하는 방법)


마야의 메뉴를 클릭하거나 Shelf 에 있는 버튼 등을 눌러서 특정 명령을 실행하면, Script Editor 에서 그에 해당하는 커맨드가 표시되는 것을 확인할 수 있다.

이러한 식으로 커맨드의 Echo 를 받아 스크립트를 작성하는 방법을 자주 활용하게 되는데, Python Command 에서 이러한 MEL command 의 Echo 를 받아서 실행하는 방법은 다음과 같다.

MEL command 에서는 polyCube 를 생성할 때

polyCube -w 1 -h 1 -sx 1 -sy 1 -sz 1 -ax 0 1 0 -cuv 4 -ch 1

이런 식으로 명령어가 호출되는데, Phython command 에서는 다음과 같이 하면 된다.

(위에서 import 를 단축어로 받아왔다고 가정한 후)

mc.polyCube (w=1, h=1, d=1, sx=1, sy=1, sz=1, ax = (0, 1, 0), cuv = 4, ch = 1)

여기서 ax = (0, 1, 0)  과 같이 하나 이상의 배열 형태로 되어 있는 Flag 에 주목하자.



이 외에, scale 을 조정할 때 Maya command 에는 다음과 같이 표현된다.

scale -r 4 4 4;

하지만 여기서 -r 은 numeric value 를 attribute 로 받는 Flag 가 아니라, relative 하게 크기를 조절할 것인지를 결정하는 Boolean type Flag 이다. 따라서 이를 Python script 에서 실행하고 싶으면

mc.scale(4, 4, 4, r=True)

이런 식으로 실행해야 한다.



또 한 가지. polyBevel 같은 명령어의 경우, 커맨드의 맨 마지막에 해당하는 오브젝트의 이름이 오게 된다.

polyBevel -offset 0.5 -offsetAsFraction 1  ......... -angleTolerance 180 -ch 1 pCube1;

python script 에서는 이 때 해당하는 오브젝트의 이름을 맨 앞으로 가지고 오고, 쌍따옴표를 붙인다.

mc.polyBevel ("pCube1", offset=0.5, ...., ch=1)



MEL 과 마찬가지로 Script Editor 에서 완성된 Python script 를 드래그 한 후 가운데 버튼을 클릭하고 shelf 에 드래그&드랍하면 아이콘이 생성된다. 이것을 클릭해서 스크립트를 실행할 수 있다.





Script Editor 에서 각종 명령어들 (예를 들면 scale 등) 의 flag 를 확인하고 싶다면 해당 명령어를 드래그하고, 우클릭을 하고 있으면 나타나는 메뉴에서 Quick Help 라는 메뉴를 확인할 수 있다. 클릭하면 우측 하단에 해당 명령어에 해당하는 flag 들이 표시된다. 하지만 어떤 type 을 사용하는지까지는 표시되지 않아서 효용성을 잘은 모르겠다;






ThEnd.