Saturday, July 11, 2009

connectAttr 로 각도 attribute 를 연결할때 자동으로 생성되는 unitConversion 노드

1. connectAttr 와 각도 attribute 
여기서는 connectAttr 로 각도 attribute 를 연결할때의 현상을 알아보자.

// 1. 물체 $a 와 $b 를 만든다.  
// $a 에는 angle 이라는 attribute 가 들어갈 것이다. 그 attribute는 // $b 의 rx 를 조절할 것이다. 
string $a = CreateSimpleObjUtil_Cube(); // polygon Cube 를 만들어준다. 
string $b = CreateSimpleObjUtil_Pipe(); // polygon Pipe 를 만들어준다. 

// 2. cube 에 "angle" 이라는 Attribute 를 slider와 함께 추가 
// (기본값 0, slider 최소값 0, slider 최대값 360) 
NodeUtil_AddAttr_Double_WithSlider $a "angle" 0 0 360; 

// 3. connect attribute 한다. 
connectAttr -f ($a + ".angle") ($b + ".rx");

이제 이렇게 하면 $a 의 angle 어트리뷰트를 슬라이더로 조절할 때 $b 즉 pipe 가 회전하는 것을 볼 수 있다.

2. unitConversion 노드

이제 다음과 같이 해보자.
connectionInfo -destinationFromSource ($a + ".angle"); 
이렇게 하면 아마 pPipe.rx 가 출력될거라고 예상할 것이다. 하지만 실제로는
// Result: unitConversion1.input // 
같은 값이 출력된다. 그 이유는 이 값이 angle 값이기 때문이다. (내부적으로 아마 라디안 값으로 변환하는 모양이다) 다른 보통의 attribute 들을 connectAttr 하면 unitConversion 노드 없이 바로 연결된다. 참고로
ls -type unitConversion; 
를 해보면 모든 unitConversion 노드를 list 해볼 수 있다.

3. disconnect 하는 방법 중간에 unitConversion 노드가 있기 때문에 모든 경우에 disconnectAttr 함수를 쓸수는 없다. 따라서 다음과 같이 해주면
NodeUtil_DisconnectAttr ($a + ".angle") ($b + ".rx"); 
unitConversion 노드가 있는 경우와 없는 경우 모두 connection 이 제대로 끊어진다.

4. Connected 여부 알아내기 중간에 unitConversion 노드가 있는 경우, MEL 에서 기본 제공되는 isConnected 함수를 쓸 경우 connect 되지 않았다고 나온다. 이는 매우 이상하게 느껴질 수 있다 왜냐하면 분명히
  • connect -f "A.rot" "B.rx"
와 같이 연결해놓은 것들이,
  • isConnected "A.rot" "B.rx"
하면 연결되지 않은 결과가 나오기 때문이다. 이는 매우 불편하다. 따라서 NodeUtil_IsConnected()  같은 함수를 만들어 쓰면 이런 경우 편하다. NodeUtil_IsConnected() 함수는 중간에 Unit conversion 노드가 있는 경우도 감안하여 connected 여부를 돌려주기 때문이다.

No comments:

Post a Comment