태그 : 3dsmax

Nebula2 3DS Max Toolkit Update

Nebula2 3dsmax Toolkit의 새롭게 업데이트된 내용입니다. 또 새로운 N3 업데이트도 곧 있다고 합니다.(오늘밤!) 이번에는 n2converter도 포함된다고 하니 n3 파일 포맷의 내용이 드러나면 Nebula3 3dsmax Toolkit의 작업도 시작할 수 있을 듯 합니다.

아래는 새로 업데이트된 내용입니다. 이제 ncharacter3skinanimator를 익스포트할 수 있어 개별 애니메이션 데이터들을 읽어 들여서 전체 애니메이션을 구성할 수가 있습니다. 작업할 때에는 이쪽이 훨씬 편리하죠.
  • Now, it can solely export animation data file(.nax2 or .nanim2) without .n2 or mesh files.
  • Changed to export nskinanimator first so it locates before any ntransformnode or its derived node in .n2 file.
  • It now supports ncharacter3skinanimator (but now ncharacter3skinshapenode yet)
  • Fixed a few minor bugs around here and there.
문서는 곧 업데이트할 예정입니다.

by kimsama | 2009/04/15 22:13 | Nebula Device | 트랙백 | 덧글(0)

아이디어 - BodyPaint를 사용한 지형 편집기 제작

몇 달 전에 Nebula와 관련한 이야기를 하면서 지형 편집기(Terrain Editor)에 대한 이야기가 나왔는데,

> "Nebula에는 지형 편집 기능이 가진 에디터가 없나요? 아니면 쉽게 할 수 있는 방법이라도..."
> "글쎄요, CLOD 등을 이용한 Terrain Renderer는 몇 종류 있는데, 에디터에 대해서는 저도 아는 바가 없습니다."

마야 툴킷에서는 유사한 기능을 제공하고 있지만 3ds Max 툴킷에서는 지원하지 않는 기능이었다.

<Nebula2 Maya Toolkikt Multi Layering Feature>


UnrealEditor 에서 제공하는 것과 유사한 브러쉬(brush)를 사용한 terrain mesh deformer 및 texture splatting 기능을 가진 에디터를 제공하는 것이 레벨 맵 제작의 생산성을 높이기 위한 중요한 일이긴 한데, 문제는 그러한 에디터를 요구 사항에 모두 맞게 개발하려면 시간이 너무 많이 걸린다는 점이다.

그래서 생각한 것이 mesh deform 기능은 3ds Max에 이미 있으니 이것을 사용하면 원하는 형태의 지형 편집은 해결이 되었고, 다음으로는 텍스쳐인데 이 부분은 메쉬 페인팅 샘플이 3ds Max의 SDK에 소스까지 포함이 되어 있기는 한데 이 놈을 빌드해서 테스트해보니 신통치 않은데다 버그도 있고, 원하는 기능을 가진 플러그인으로 바꾸려면 시간도 많이 걸릴 듯 해서 고민하다 머리에 떠 오른 방법이 바로 BodyPainter3D 이다.

3ds Max에 deformming한 지형 메쉬 데이터를 원하는 텍스쳐를 가지고 쓱쓱 붓질해서 4개던 8개던 레이어로 추출할 수 있으면 간단하면서도 강력한 지형 편집기가 완성된다!...라는 아이디어이다.

우선 BodyPaint3D 데모를 다운 받아서 설치한 후 살펴 보니 SDK를 제공하는데다 SDK의 문서를 읽어 보니 편집하는 텍스쳐를 포토샵의 레이어로 임포트할 수 있도록 되어 있었다.
실제로 작업해서 확인해 보지는 않았지만 Terrain의  메쉬 및 텍스쳐에 대한 편집을 3ds Max의 인터페이스를 이용해서할 수 있고, 편집이 끝난 데이터는 메쉬의 경우 MAXScript를 이용해서 Heightmap으로 저장하면 엔진에서 사용할 수 있을 테고, 텍스쳐는 splatting에 대한 정보를 가진 텍스쳐를 얻을 수 있으므로(BodyPaint3D의 SDK를 이용) 엔진에서 지형의 텍스쳐를 처리하는 부분도 해결이 된다.

지형 렌더링과 관련한 자료는 알고리즘 종류별로 엄청난 자료가 있기 때문에 구현에 어려움이 없겠지만 문제는 툴링이다. 시간도 없고 사람도 없다면 (이 경우에 돈도 없는 경우가 대부분이더라 -_-) 이 방법이 좋은 방법이 될 수 있을 듯.

 
참고

Nebula2 Maya Toolkikt, Multi Layering feature, http://www.radonlabs.de/technology/toolkit/toolkitdocs_html/MultilayerPaintingHowTo.html

by kimsama | 2007/12/16 16:06 | Development | 트랙백 | 덧글(1)

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)

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