'게임 프로그래밍/cal3d'에 해당되는 글 3건

  1. 2008.08.21 cal3D Core&Instance
  2. 2008.08.15 cal3D Direct버전
  3. 2008.07.16 cal3D 컴파일방법 (1)
2008.08.21 11:12

Cal3D 에서는 Core 하나로 여러개의 instance에서 애니메이션을 재생 시킬수 있다.
CoreModelLoading->InstanceModelSetting->Blend
식으로 말이다.
아 그리고
OpenGL은 자세히 안해봐서 모르겠지만 DirectX 에서는 Core를 하나 불러와서 코어 하나로 여러개의 instance를 돌리려면 intance마다 버텍스 버퍼와 인덱스버퍼를 따로 가지고 있어야된다.

아래 클래스는 CoreModel을 관리 하는 클래스이다.

class
kwCoreModel
{
protected:
    bool m_bCreate;
    std::string m_strFileName;
    std::string m_strPathName;
    std::string m_strSubPathName;

    CalCoreModel* m_pCalCoreModel;
    float m_fScale;
public:
    kwCoreModel();
    kwCoreModel(std::string FileName, std::string PathName,const  LPDIRECT3DDEVICE9 &pDev);
    ~kwCoreModel();

    HRESULT CreateModel(std::string FileName, std::string PathName,const LPDIRECT3DDEVICE9 &pDev);
    void DestroyModel();

    void SetFileName(std::string FileName);
    void SetPathName(std::string PathName);
    void SetSubPathName(std::string SubPathName);
    void SetScale(float Scale) { m_fScale = Scale; }
    void SetCreate(bool Create) { m_bCreate = Create; }

    LPDIRECT3DTEXTURE9 LoadTexture(std::string& strFileName,const  LPDIRECT3DDEVICE9 &pDev);

    CalCoreModel* GetCoreModel() { return m_pCalCoreModel; }

    inline bool GetCreate() { return m_bCreate; }
    std::string GetFileName() { return m_strFileName; }
    std::string GetPathName() { return m_strPathName; }
    std::string GetSubPathName() { return m_strSubPathName; }
};

위 클래스! 위 클래스는 Cal3D 에서 Core 모델의 정보를 담고 있는 클래스이고,

// AnimationModelBase클래스를 상속 받은 Cal3DModel 클래스
class kwAnimationModelCal3D : public kwAnimationModelBase
{
public:
    enum AnimationStat { STATE_IDLE, STATE_MOTION, STATE_FANCY };
protected:
    bool m_bPaused;                 // 애니메이션 중지 여부
   
int m_iAnimationCount;          // 애니메이션의 갯수,
   
int m_iCurrentAnimationID;      // 계속 애니메이션 반복 시킬 베이스 ID
   
int m_iAnimationState;          // 지금 현재 상태 - 대기인지 모션블렌딩 상태인지
   
int m_iMotionBlendID[3];        // 모션블렌딩할 아이디 담아놓은 배열 현재는 3개

   
float m_fBlendTime;             // 기본적인 블렌딩 타임
   
float m_fLodLevel;             
    float m_fElapsedTime;
    float m_fScale;
    float m_fMotionBlend[3];        // 모션블렌딩의 정도 값

   
CalModel* m_pCalModel;

    unsigned int m_lastTick;

    LPDIRECT3DVERTEXBUFFER9 m_pVB;              //cal3D 모델 정점 버퍼
   
int m_VBCursor;
    LPDIRECT3DINDEXBUFFER9  m_pIB;              //cal3D 모델 인덱스버퍼
   
int m_IBCursor;

    LPDIRECT3DVERTEXBUFFER9 m_pSkeletonVB;
    int m_SkeletonVBCursor;
    LPDIRECT3DINDEXBUFFER9  m_pSkeletonIB;
    int m_SkeletonIBCursor;

    LPDIRECT3DVERTEXBUFFER9 m_pBoundingBoxVB;
    int BoundingBoxVBCursor;
    LPDIRECT3DINDEXBUFFER9  m_pBoundingBoxIB;
    int BoundingBoxIBCursor;

public:
    kwAnimationModelCal3D();
    kwAnimationModelCal3D(const kwAnimationModelCal3D& rhs);
    kwAnimationModelCal3D(kwCoreModel *pModel);
    ~kwAnimationModelCal3D();


    virtual void SetDevice(const LPDIRECT3DDEVICE9 &pDev);
    virtual void SetModel(kwCoreModel* pModel);
    virtual void DestroyModel();
    virtual void UpdateModel();
    virtual void RenderModel();
    virtual void RenderSkeleton();
    virtual void RenderBoundingBox();
    virtual bool CreateVertexBuffer();

    virtual void SetMotionBlend(float *pMotionBlend, int *pMotionBlendID, float delay);
    virtual void SetState(int state);

    virtual LPDIRECT3DDEVICE9 GetDev()      {   return m_pDev;      }

    CalModel*        GetCalModel()      {   return m_pCalModel;     }
};

위 클래스는 Instance클래스를 제어하기 위한 클래스이다. 위 kwCoreModel 클래스는 CoreModel의 정보등을 관리 하는 역할을 하는 클래스이고, kwAnimationModelCal3D 클래스는 CoreModel을 가져다가 애니메이션을 재생시키고, 관리 하는 클래스이다. 이름이 좀 길어서 쓸때는
typedef kwAnimationModelCal3D       kwModel;
이렇게 해서 간단하게 줄여서 쓴다.

위 두 클래스 사용 예는

kwCoreModel *pCoreModel = new kwCoreModel;
CreateCoreModel(pCoreModel, FileName, PathName);

kwModel* pModel = new kwModel;
pModel->SetDevice(m_pDev);
pModel->SetModel(pCoreModel);
kwModel* pModel2 = new kwModel;
pModel2->SetDevice(m_pDev);
pModel2->SetModel(pCoreModel);

위와 같이 CoreModel을 불러온 뒤 InstanceModel에 셋팅을 해준다음

Instance 클래스 안에 있는 SetState라는 함수로 모델의 상태(모션블렌딩, 대기, Nomal애니메이션 등) 설정 한뒤에 UpdateModel이라는 함수로 애니메이션을 업데이트 해주고, RenderModel이라는 함수로 그려주면 된다. 그리고 다 사용한 뒤에는 메모리 해제 시켜주는 것은 꼭 잊지 말자.

신고
Posted by 우엉 여왕님!! ghostkyow
2008.08.15 21:42
사용자 삽입 이미지

위는 miniviewer를 실행시키면 나는 링크에러다. 링크에러가나는 이유는 cal3D lib를 추가 안시켜줘서 나는 에러다.
사용자 삽입 이미지

그래서 위처럼 프로젝트 속성창을 켠뒤 링커 -> 일반 으로 들어가서, 아래와같이
사용자 삽입 이미지

cal3d_d.lib를 써넣은뒤 확인을 누른 뒤에 컴파일을 시키면 아래와같이 성공 메시지가 뜬다.
사용자 삽입 이미지

성공메시지가 떳지만 여기서 컴파일을 시켜보면
사용자 삽입 이미지

에러메시지가 뜨는데 이건 모델을 못불러와서인데
사용자 삽입 이미지
위 블록 건 소스 부분안에 parse...("경로") 라는 함수를 호출 하지 않아서 인데 이것들을 다 지운뒤에
사용자 삽입 이미지

위와 같이 소스를 바꿔주면
사용자 삽입 이미지
위와같이 실행화면이 든다. 위 모델은 cally 예제에 있는 cally 애니메이션을 로드하여 띄운것이다.

참고로 cal3d_miniviewer_d3d 는 모션블렌딩을 지원하지 않지만 d3d에서도 모션 블렌딩은 가능하다.
신고
Posted by 우엉 여왕님!! ghostkyow
2008.07.16 22:33
사용자 삽입 이미지

맨처음 cal3D 프로젝트 파일을 키면 이렇게 손상됐다고 나오지만 꿋꿋이 확인버튼을 눌러준다!
사용자 삽입 이미지
이것도 꿋꿋이 확인 !! 여러개 뜰꺼다 그치만 꿋꿋이 엔터!!
사용자 삽입 이미지

이렇게 화면이 뜬뒤
사용자 삽입 이미지

위처럼 드래그 하고! 드래그 한 프로젝트들을 딜리트!!
사용자 삽입 이미지

재확인 하지만 그래도 무시하고 확인!!
사용자 삽입 이미지

그리고 위처럼 실행 프로젝트를 아래로 바꿔준다!! 그리고!!
사용자 삽입 이미지

컴파일을 해보면 위처럼 링크에러가 뜬다 ㅜㅡㅜ 이거때문에 내가 얼마나 미치도록 고생을 했는지...
하지만 해결 방법은 너무 간단했다!!
사용자 삽입 이미지

바로 위처럼 검색창에 저 단어들을 쓴뒤
사용자 삽입 이미지

아래것들을 cal3D 프로젝트에 포함 시킨다!! 그리고!!
사용자 삽입 이미지
다시 컴파일을 하면!! 성공 2개 Cal3D 와 Cally 가 컴파일 성공이 되고 실행을 하면
콘솔창이 뜨고 로딩 상태가 뜨고 로딩 상태가 다 뜬뒤!!!
사용자 삽입 이미지
위와 같이 로딩 화면이 뜨고 로딩이 된 뒤
사용자 삽입 이미지
그리고 이렇게 컴파일 된뒤 실행 화면이 뜨게 된다. 그럼 이제 cal3D 의 공부를 시작할수 있게 된다.
자 cal3D에 대하여 공부를 해보자
신고
Posted by 우엉 여왕님!! ghostkyow

티스토리 툴바