티스토리

티스토리는 초대장인지 초대권인지가 있어야지 블로그 개설이 가능하군요.

하나 적선해주실 분 계시면 고맙겠습니다. (굽신)

^^;;


by kimsama | 2009/04/23 21:59 | General | 트랙백 | 덧글(4)

경기 불황

최근의 경기 불황을 실감케하는 사건 하나.

며칠 전 점심 시간에 일어난 일이다.

팀원들과 점심 먹으러 가는데 앞에서 걸어 오는 두 청춘 남녀가 있었다.

앗, 그런데 이 여자분 치마가 짧다 못해 숫제 팬티 아래 부분이 그냥 보이는게 아닌가. -_-

아니, 치마가 짧다는 표현보다는 팬티가 좀 내려왔다는 표현이 더 적합할 듯.

경기 불황에는 미니 스커트가 유행이라더만...

작금의 불황이 어느 정도인지 적나라하게 보여주는 사건이었다. ㅋ

(인증샷은 없음 -_-)



ps.
같이 목격한 두 총각 팀원들.
식사하면서 검정색이다 흰색이다 왈가왈부 하던데, 치마가 검정색이고 팬티는 베이색에 빨간색 꽃무늬였잖니
그리고, 레이스는 없었다. ㅡ,.ㅡ


by kimsama | 2009/04/23 21:57 | General | 트랙백 | 덧글(6)

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)

Nebula Device2 게임엔진 교육 과정

작년에 이어 올해에도 단기간의 Nebula Device2 직무교육이 있습니다. 게임 진흥원 산하 게임 아카데미에서 진행하는 것이라 예산 자체가 국고로 지원하기 때문에 교육비는 교재, 간식비 등의 실비 정도만 받는 것으로 알고 있습니다. (그래서 수강 인원도 20명 이하로 제한을 두고 있다고 합니다)

올해가 아마 Nebula2의 직무 교육이 마지막이 될 듯 합니다. 이런 저런 이유로 게임아카데미가 목동으로 이전하게 됨에 따라(그러기에 선거들 좀 하시지~) 이후의 직무교육 자체가 불투명하기 때문입니다. 이런 이유로 작년에는 굳이 이야기하지 않았습니다만 올해에는 블로그에 올려 봅니다. 작년에 몰라서 못오셨다고 아쉬움을 이야기하신 분들도 몇 분 계셨고 마지막이니 만큼 관심 있으신 분들은 한분이라도 더 오시면 좋겠다는 의미에서 낯뜨거운(?) 광고 문구마저 x팔림을 무릅쓰고 올립니다.

평소에 Nebula Device2에 대해서 관심이 많으셨던 분들 중 이것저것 궁금하신 내용이 많으셨던 분들은 이번 기회를 이용하면 좋겠습니다. ㅡㅡ;

ps. 그런 분은 없으시겠지만 교육에 대한 문의는 이 블로그에 올려지 마시길~ -_-;

국내 최고의 게임분야 직무교육과정을 개발, 운영하고 있는 게임아카데미는

게임업계 경쟁력 강화를 위해 다음과 같이 직무교육과정 교육생을 모집하고 있습니다.

많은 신청 부탁드립니다.

'08년도 최고의 인기과정, 최고의 교육만족도,  
국내 최고의 엔진전문가 저자 직강!!!

1. 과정명 : 오픈소스게임엔진교육과정 - Nebula Device2
              (온오프라인 혼합과정)

2. 교육기간 
   - 오프라인 : 2009. 4. 17~4. 29 (월, 수, 금)
   - 온라인 : 2009. 4. 17~5. 17 (1개월)

3. 교육비 : 20만원

4. 결재방법 : 카드 결재 및 현금 계좌이체
                  (카드결제는 직무과정 홈페이지에서 결재)

5. 할인 : 1사 2인이상 지원시 교육비 10% 할인

6. 특전 : 교재 제공, 저녁간식(샌드위치+음료), 다과제공,
            게임아카데미 발간도서 최대 80%할인 제공
            온라인과정 무료제공 (오픈소스게임엔진 온라인과정)

7. 자세한 사항은 게임아카데미 홈페이지(직무과정) 안내를 참고하시고 신청해주시기 바랍니다.

8. 문의 :  02-540-8194 (장광진 대리)  / kjjang@kogia.or.kr


http://www.gameacademy.or.kr/




by kimsama | 2009/04/12 16:07 | Nebula Device | 트랙백 | 덧글(2)

Anatomy of Nebula3 - Loading Custom Model

개요


Nebula3에서는 현재 .n2의 Nebula2 리소스 파일 형태만을 지원하고 있는데, 이 글에서는 Nebula3를 확장하기 위해서 새로운사용자 정의 리소스 파일(메쉬, 애니메이션, 등을 위한 모델 파일)을 추가하는 방법에 대해서 간단하게 살펴 본다.

StreamModelLoader


StreamReader는 ResourceLoader 클래스의 서브 클래스이며 리소스 파일을 스트리밍을 통해서 읽어 들이는 처리를 한다. 읽어 들일때에는 비동기적인 방법으로 읽어 들인다. 아래 소스에서 보듯이StreamModelLoader::SetupModelFromStream 함수에서 리소스 파일의 확장자에 따라 적절한ModelReader를 생성하고 생성한 ModelReader에서는 리소스 파일을 파싱해서 실제로 읽어 들이는 처리를 한다.


bool
StreamModelLoader::SetupModelFromStream(const Ptr<Stream>& stream)
{
    n_assert(stream.isvalid());
    n_assert(stream->CanBeMapped());

    // first decide what ModelReader to use
    bool isLegacyFile = false;
    String fileExt = this->resource->GetResourceId().Value().GetFileExtension();
    Ptr<ModelReader> modelReader;
    if (fileExt == "n3")
    {
        // Nebula3 binary format
        modelReader = (ModelReader*) BinaryModelReader::Create();
    }
    else if (fileExt == "xml")
    {
        // Nebula3 XML format
        modelReader = (ModelReader*) XmlModelReader::Create();
    }
    else if (fileExt == "n2")
    {
        // legacy Nebula2 binary format
        modelReader = (ModelReader*) N2ModelReader::Create();
        modelReader->SetModelResId(this->resource->GetResourceId());
        isLegacyFile = true;
    }
    else
    {
        n_error("StreamModelLoader: unrecognized file extension '%s' in '%s'!",
            fileExt.AsCharPtr(), this->resource->GetResourceId().Value().AsCharPtr());
        return false;
    }


메쉬 데이터


Direct3D9::D3D9StreamMeshLoader를 상속하는 CoreGraphics::StreamMeshLoader 클래스에서는 메쉬 데이터 메쉬 데이터를 읽어 들여 정점버퍼와 인덱스 버퍼를 생성하는 일을 담당한다.D3D9StreamMeshLoader::SetupResourceFromStream() 에서는 리소스의 리소스 아이디의 파일확장자를 검사해서 해당하는 메쉬 데이터 포맷을 읽어 들이는 함수를 호출한다. 리소스 파일의 확장자가 '.nvx2'인 경우에SetupMeshFromNvx2() 함수를 호출한다.

bool
D3D9StreamMeshLoader::SetupResourceFromStream(const Ptr<Stream>& stream)
{
    n_assert(stream.isvalid());
    n_assert(this->resource.isvalid());
    #if NEBULA3_LEGACY_SUPPORT
    if (this->resource->GetResourceId().Value().GetFileExtension() == "nvx2")
    {
        return this->SetupMeshFromNvx2(stream);
    }
    else
    #endif
    if (this->resource->GetResourceId().Value().GetFileExtension() == "nvx3")
    {
        return this->SetupMeshFromNvx3(stream);
    }
    else if (this->resource->GetResourceId().Value().GetFileExtension() == "n3d3")
    {
        return this->SetupMeshFromN3d3(stream);
    }
    else
    {
       n_error("D3D9StreamMeshLoader::SetupMeshFromStream(): unrecognized fileextension in '%s'\n",this->resource->GetResourceId().Value().AsCharPtr());
        return false;
    }
}


SetupMeshFromNvx2에서는 Legacy::Nvx2StreamReader를 통해서 .nvx2 파일을 읽어 들이고 이것을 정점 버퍼와 인덱스 버퍼에 연결한다.


bool
D3D9StreamMeshLoader::SetupMeshFromNvx2(const Ptr<Stream>& stream)
{
    n_assert(stream.isvalid());    
    Ptr<Legacy::Nvx2StreamReader> nvx2Reader = Legacy::Nvx2StreamReader::Create();
    nvx2Reader->SetStream(stream);
    if (nvx2Reader->Open())
    {
        const Ptr<Mesh>& res = this->resource.downcast<Mesh>();
        n_assert(!res->IsLoaded());
        res->SetVertexBuffer(nvx2Reader->GetVertexBuffer().downcast<CoreGraphics::VertexBuffer>());
        res->SetIndexBuffer(nvx2Reader->GetIndexBuffer().downcast<CoreGraphics::IndexBuffer>());
        res->SetPrimitiveGroups(nvx2Reader->GetPrimitiveGroups());
        nvx2Reader->Close();
        return true;
    }
    return false;
}


애니메이션 데이터


애니메이션 데이터도 메쉬 데이터와 크게 다르지 않다. 차이점이라고 하면 메쉬 데이터는 하드웨어쪽의 그래픽 디바이스드라이버(win32에서는 D3D)와 연결되어야 하지만 애니메이션 데이터는 그렇지 않다는 것과 최근의 애니메이션 처리와 관련한가장 중요한 이슈는 스트리밍이라는 점이다. 다시 말하면 애니메이션 데이터의 처리는 스트리밍에 훨씬 더 민감하다는 것이다.

현재(2009.03) 이 글을 쓰는 시점에서 Nebula3의 최신 버전은 2008년. Sep. 버전(9월 버전)인데 이 버전에서는이전 Nebula2의 애니메이션 데이터 파일인 .nax2 파일 포맷 지원이 생략되어 있다. 이는 이 후 버전에서CoreAnimation 모듈에서 기능이 강화된 애니메이션 모듈을 지원하기 위해서라고 한다. 대신에 2008. Feb. (2월)버전에서는 .nax2를 지원하는 코드를 살펴 볼 수 있다. 애니메이션 데이터의 처리 부분이 궁금하면 2008. Feb. 버전을보기 바란다.

결론


이상에서 살펴 본 클래스와 이들의 멤버 함수를 이해하면 원하는 사용자 정의 파일 포맷을 Nebula3에 쉽게 포팅해서 확장할 수 있다.

한가지 팁을 덧붙이자면 Nebula3에서는 모든 리소스를 읽어 들이는 처리가 기본적으로 비동기 방식으로 처리된다. 개발 단계에서는 이 방식이 디버깅 등에 불편한 경우가 있는데 이 때에는 Resource::ResourceMapper::SetAsyncEnabled() 함수로 비동기 처리를 비활성화할 수 있다.

by kimsama | 2009/03/28 09:37 | Nebula3 | 트랙백 | 덧글(0)

nebula2 3dsmax toolkit - 0.9

nmaxtoolbox version 0.9

- Modified to find 'nmaxtoolbox.ini' file in the '$3dsmax/scripts/nebula2' if it fails to read the file in the '$3dsmax/scripts/plugcfg' directory. Under Vista, the 'plugcfg' directory is located under different directory.

- Now it does not use custom attribute's vertex option. If an artist specify any unknown custom attribute which does not contain vertex option, the plug-in only exports vertex position.


ps. 한참만에 업데이트해 봅니다. ^^

by kimsama | 2009/03/27 21:25 | Nebula Device | 트랙백 | 덧글(0)

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