Damn 3dsmax, Retrieving Custom Attributes

3dsmax에서는 노드(Node)의 기본적인 기능 외에 사용자가 원하는 형태로 확장해서 사용할 수 있도록 하기 위해서 custom attributes라는 것을 제공한다. 그런데 3dsmax 노드의 custom attribute는 삽입 방법에 따라 얻어 오는 방법도 모두 틀리다.



INode* inode = boneLevelArray[i].node;
Object* obj = nMaxUtil::GetBaseObject(inode, 0);
// Base Object의 custom attributes를 얻는다.
GetCustAttrib(obj);
...
// INode의 custom attributes를 얻는다.
GetCustAttrib(inode)
...

// Modifier에 적용된 custom attributes를 얻는다.
if(inode->GetObjectRef() != obj)
{
    GetCustAttrib(inode->GetObjectRef())
    ...
}


예를 들어 3dsmax7부터는 Parameters Editor라는 것을 지원하는데 이것을 이용하면 MAXScript를 사용하지 않고도 원하는 파라미터를 손쉽게 생성해서 노드에 삽입할수 있다. 이렇게 Parameters Editor를 이용해서 삽입된 custom attributes는 INode에 삽입이 되어 있기 때문에 이를 익스포트시 얻어 오기 위해서는INode로부터 얻어와야 한다.

다음으로는 MAXScript를 사용해서 scripted plugin 형태 등으로 오브젝트에 custom attributes를 삽입하는 경우를 살펴 보자. 이런 경우의 custom attributes는 보통 오브젝트의 Modifier 패널에 나타나게 되는데 이렇게 Modifier 패널에 나타나는 custom attributes는 INode::GetObjectRef()를 통해 얻어진 ObjectRef에 삽입이 되어 진다. 그러므로 ObjectRef에서 custom attributes에 접근해야지 Modifier 패널에 나타나는 custom attributes를 얻어 올 수 있다.

GetcustAttrib()함수는 다음과 같다.


bool nMaxBoneManager::GetCustAttrib(Animatable* obj)
{
    if (obj && obj->SuperClassID() == GEN_DERIVOB_CLASS_ID)
    {
        IDerivedObject* derivedObj = (IDerivedObject*) obj;
        for (int i = 0; i < derivedObj->NumModifiers(); i++)
        {
            Modifier* mod = derivedObj->GetModifier(i);
            if (mod)
            {
                GetCustAttrib(mod);
            }
        }

        Object* refObj = derivedObj->GetObjRef();
        if (refObj != obj)
        {
            GetCustAttrib(refObj);
        }

        BaseObject* baseObj = derivedObj->FindBaseObject();
        if (baseObj != obj && baseObj != refObj)
        {
            GetCustAttrib(baseObj);
        }
    }
    ...
}


결론은...참 일관성이 없다는 것이다. ㅡㅡ+

- 코드는 Nebula2 3dmax Toolkit에서 발췌.

by kimsama | 2007/03/06 22:22 | Development | 트랙백 | 덧글(0)

트랙백 주소 : http://kimsama.egloos.com/tb/1521709
☞ 내 이글루에 이 글과 관련된 글 쓰기 (트랙백 보내기) [도움말]

:         :

:

비공개 덧글

◀ 이전 페이지다음 페이지 ▶