posted by cimple 2017. 9. 26. 17:15

Custom orient constrain node & command 를 구현하였다.


CustomOrientConstrain.py

setCustomOrientConstrain.py




위 파일로 다운로드 받으면 된다.



Warning


Maya 2017 에서 버그를 발견하였다. (내 버그가 아니라 Maya 버그)

노드를 생성하고 연결하는 CustomOrientConstrainCmd.py 에서,

현재 코드처럼 custom node 를 생성한 다음 MSelectionList 에서 dagPath 를 받으면 argument 가 부족하다는 에러가 뜬다.

에러 메시지를 뜯어보니 아마도 Maya Python API 1.0 에 있는 MSelectionList_getDagPath 가 호출되는 것으로 보이는데 이유는 불명이다.


그래서 순서를 일단 MSelectionList 에 dagPath 를 받은 다음 -> Custom node 를 생성하면 정상작동한다.



posted by cimple 2017. 9. 19. 18:55

thisNode = ClassName.thisMObject(self)


이렇게 하면 thisNode 에 만들어진 Maya Node 스스로를 얻어올 수 있다.

posted by cimple 2017. 9. 15. 13:30

1. Message attribute 의 개념에 대하여

Message attribute 의 개념에 대해서는 이 영상이 잘 설명해 주고 있다.

https://vimeo.com/45110586

Message attribute 가 하는 일은 "내가 누구다" 라고 inform 을 알려주는 일이 전부이다. 중요한 것은 어떠한 Data 도 실질적으로 전달되지 않는다는 것이다.


2. Message attribute 의 값 참조

Custom Node 에서 Message Attribute 를 만든 다음 getAttr() 로 들어있는 값을 참조해보려고 해도 되지 않는다. Message Attribute 에는 실질적으로 값이 들어있지는 않기 때문이다.

따라서 Maya Script 를 이용할 때도 그렇고, 노드 안에서 API 코드로 접근할 때도 그렇고 Message attribute 에 있는 값을 직접 읽어들이려고 해서는 안 된다. (API 의 경우 MDataHandle 로 attribute 를 읽어들인 후 type 체크를 해 보면 invalide 라고 뜨게 된다.)

따라서 Message attribute 에서는 connection 만을 확인해야 한다. 해당 attribute 에 무엇이 연결되어 있는지를 확인하는 용도이다.

python command 의 경우 mc.listConnections("MyMsgAttr") 하는 식으로 연결되어 있는 대상을 찾아야 한다.

API 경우 plug 에 connection 되어 있는 다른 node 들을 찾을 수 있을 것이다.


3. Message attribute 의 Array 의 활용

Message attribute 도 array 형태로 attribute 를 만들 수는 있다.

그러나 attribute editor 에서 array 형태의 message attribute 가 표시되지는 않는다. 지금 내 경우에는 src/tgt 의 정해진 갯수의 skeleton 만을 가지로 retarget node structure 를 구성하면 되므로 굳이 array 를 쓸 필요는 없을 것 같다.

posted by cimple 2017. 9. 13. 17:24

Mesh Surface 의 경우 input/output 은 inMesh / outMesh 이다.

Nurbs Surface 의 경우 input/output 은 create / local 이다.

Nurbs Surface 의 이름이 직관적이지가 않은데... 누가 처음에 이런 attribute 네이밍을 했는지 궁금할 따름이다.

posted by cimple 2017. 9. 12. 12:05
def compute_point_to_box_dist(minXYZ, maxXYZ, point):
    dx = max(minXYZ[0] - point[0], 0, point[0] - maxXYZ[0])
    dy = max(minXYZ[1] - point[1], 0, point[1] - maxXYZ[1])
    dz = max(minXYZ[2] - point[2], 0, point[2] - maxXYZ[2])
    return (dx*dx + dy*dy *dz*dz)**0.5


위 함수를 이용하면 axis-align 된 bondong box 와 point 사이의 distance 를 간단하게 구할 수 있다.

참고 : https://stackoverflow.com/questions/5254838/calculating-distance-between-a-point-and-a-rectangular-box-nearest-point

posted by cimple 2017. 9. 8. 11:12

다음과 같은 상황에 python 의 re(regex) 라이브러리를 활용하였다.


"pPlane1.v[10]"


이라는 string 정보를 Maya 로부터 입력받았을 때, 나는 여기에서 10 이라는 vertex 의 index 만 int 형태로 받고 싶다.

find 같은 명령어를 써서 10을 찾을 수도 있겠지만 re 라이브러리를 사용하면 1줄이면 가능하다.


import re

vtx_index = int(re.findall(r'\b\d+\b', "pPlane1.v[10]")[0])


자세한 사용법은 추후에 더 공부