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에 찍히는 값이 나온다.

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