posted by cimple 2017. 8. 31. 12:07

Maya Node 를 개발할 때, attribute 로 모든 데이터를 저장하기에는 무겁고 처음 한번만 initialize 하면 되는 경우, 별도의 멤버변수를 만들어서 저장해 줄 수 있다.

그러나 이 때, Scene 을 저장했다가 open 할 때 initilize 가 되어 있지 않아서 연산되지 않는 경우가 발생한다. 이를 위해 Scene 이 열릴 때 한 번 더 업데이트를 해주면 된다.

이 때 사용되는 것이 MSceneManager 콜백 함수이다.

나는 다음과 같은 예제에서 활용하였다.


먼저 pluginMain.cpp 에

..

#include <maya/MSceneMessage.h>

MCallbackId openCallback;

..

MStatus initializePlugin(MObject obj){

...

openCallback = MSceneMessage::addCallback(MSceneMessage::kAfterOpen,  lightFollicleNode::sceneOpenSetup)

...

}

MStatus uninitializePlugin(MObject obj){

...

MSceneMessage::removeCallback(openCallback);

...

}


위와 같이 Plugin 에서 Callback 함수를 add 해 주고, Plugin 을 deregister 할 때 반드시 removeCallback 을 해주어야 한다.

이제 Scene 이 열렸을 때 sceneOpenSetup() 이라는 함수를 호출하게 된다.


void lightFollicleNode::sceneOpenSetup(void *data){

  cout << "***lightFollicleNode:scene open***" << endl;

  isSceneOpen = true;

}

위와 같이 단순하게 flag 를 바꾸어주는 함수이다. 이를 통해서 compute function 에서 간단하게 업데이트 컨트롤을 해 줄수 있다.

posted by cimple 2017. 8. 28. 20:21

Centos 의 yum package install 이 안 될 경우에는 repository 주소를 확인하자.

내 경우 /etc/yum.repository.d/ 안에 있는 CentOS-Base.repo 가 사내 주소로 변경되어 있었다.

이러면 제대로 package install 이 될 리가 없지.

기본 Centos repository 나 국내 저장소(다음카카오) 등으로 변경해 주어야 한다.

posted by cimple 2017. 8. 17. 14:17

Maya API 에서 outRotate 값을 array attribute 로 만들어 주려면  compound array attribute 를 활용하면 된다.


initialize(){

...

MFnUnitAttribute uAttrFn;

MFnCompoundAttribute cAttrFn;


aOutRotateX = uAttrFn.create("outRotateX", "orx", MFnUnitattribute::kAngle, 0.0);

addAttribute(aOutRotateX);

aOutRotateY = uAttrFn.create("outRotateY", "ory", MFnUnitattribute::kAngle, 0.0);

addAttribute(aOutRotateY);

aOutRotateZ = uAttrFn.create("outRotateZ", "orz", MFnUnitattribute::kAngle, 0.0);

addAttribute(aOutRotateZ);


aOutRotateArr = cAttrFn.create("outRotateArr", "orarr");

cAttrFn.addChild(aoutRotateX);

cAttrFn.addChild(aoutRotateY);

cAttrFn.addChild(aoutRotateZ);

cAttrFn.setArray(true);

cAttrFn.setUsesArrayDataBuilder(true);

addAttribute(aOutRotateArr);

...

}


compute(){

...

MArrayDataHandle outRotateHndArr = data.outputArrayValue(aOutRotateArr);

MarrayDataBuilder outRotateBldArr = outRotateHndArr.builder();

unsigned int nOutRotate = (int)outRotateHndArr.elementCount();

for (unsigned int i=0 ; i<nOutRotate < i++){

  MDataHandle outHandle = outRotateBldArr.addElement(i);

  outHandle.set3Double(outRotArr[i][0], outRotArr[i][1], outRotArr[i][2]);

}

outRotateHndArr.set(outRotateBldArr);

outRotateHndArr.setAllClean();

...

}


그런데, 여기에서 Rotate 를 set 하는 value 가 angle 임에 주목해야 한다.


현 재 작성한 node 에서 vector 와 vector 사이의 사잇각을 rotateTo() 를 사용해서 MQuaternion 으로 찾고 이를 다시 MEulerRotation 으로 변환, MVector 에 저장한 다음 outRotate Attribute 에 set 해 주었다.

그런데 이 때 log 를 찍어보면 MEulerRotation 의 x,y,z 값과, 이를 MVector에 저장한 다음 찍히는 x,y,z 값이 달랐는데, 이 MVector 를 outRotate 에 set 해 보면 Maya 에는 MVector 에 찍히는 값이 아니라 MEulerRotation에 찍히는 값이 나온다.

아마도 라디안 계산을 하는 것으로 보이는데 자세한 사항은 향후 수정바람