'HiFramework'에 해당되는 글 7건

  1. 2010.08.08 HiFramework – cal3dViewer
  2. 2010.08.08 HiFramework-Object Tool
  3. 2009.03.24 HiFramework의 주 기능.
  4. 2009.03.24 HiFramework의 구조!
  5. 2009.03.23 HiFramework란?!
  6. 2008.09.24 엔진의 Kernel
  7. 2008.09.24 엔진의 Module
2010.08.08 03:14

(cal3dViewer화면)

Cal3dViewer
1) Cal3dViewer 소개

Cal3dViewer는 cal3d로 모델링 된 파일들이 제대로 모델링 됐는가를 볼 수 있게 하기 위하여 만든 Viewer이다. 캐릭터 로딩은 xml을 수정하여 로딩 할 수 있고, 위치 또한 수정이 가능하다.

 

2) Cal3DViewer의 개발 환경
● 하드웨어

- CPU : Intel Core Duo 2.42Ghz

- RAM : DDR3 2GB

- Graphic : Nvidia Geforce 9400M

● 소프트웨어

- OS : Window XP, Windows Vista

- Compiler : MSVC80

- SDK : Microsoft DirectX SDK(2007)

● 사용 프레임워크 및 엔진

- Framework : HiFramework – DirectXRenderer

- Engine : Cal3D, libxml2


 

3)Cal3DViewer의 개발 과정

-HiFramework 기반의 DirectX를 사용 하기 위해 HiFramework내에 HiRenderer클래스를 상속 받아 DXRenderer라는 DirectXRenderer를 구현

-cal3d 라는 캐릭터 엔진을 사용 하여 애니메이션 띄우기

-cal3dViewer에 띄운 캐릭터를 보여주기 위하여 mHiCamera라는 module을 구현하여 Field를 사용하여cal3dviewer-module과 라우트 연결 구현

-캐릭터를 컨트롤 하기 위하여 mHiInterpolator라는 module을 구현하여 Field를 사용하여 mHiCal3DViewer_module과 라우트 연결 구현

 

 

4)Cal3DViewer 의 클래스 구조

구조 설명
 mHiInterpolator
Camera를 조종하는 Module이다. mHiInterpolator내에 있는 HiField mHiCal3dViewer에 있는 HiField가 라우트로 연결이 되어있다. 그리고 Camera는 캐릭터를 따라가도록 카메라의 위치 값을 가지고 있는 HiField와 라우트 되어있다.
(mHiInterpolator->mHiCal3DViewer->mHiCamera)

 

mHiInterpolator_Module



mHiInterpolator

이 모듈은 하나의 클래스로 구성되어있다.

이 모듈의 클래스가 하는 역할은 키보드 입력 값에 따라 자신이 가지고 있는 HiField(Vec3f) 의 값을 변경 하는 역할을 한다. 그렇게 되면 이 Field랑 연결 되어있는 값은 값의 복사에 의해 똑같이 변경 된다.

 

-함수-

Realize, Update

 

Realize – Field SendEvent에 보내주어 Field에 연결된 Field들에게 라우트를 실행하는 함수

Update키보드 입력 값에 따라 Field의 값을 변경하는 함수




mHiCamera_Module

 

mHiCamera

이 모듈도 Interpolator와 같이 하나의 클래스로 구성되어있다.

이 모듈의 역할은 캐릭터의 위치에 따라 카메라의 좌표를 이동 한다.

이 모듈이 가지고 있는 Field mHiCal3DViewer에 있는 Field와 연결이 되어있기 때문에 mHiCal3DViewer에 있는 Field에 이벤트가 발생했을 때 Camera Field값도 변경 된다.

 

-함수-

PreConfig, PostConfig, Update

 

PreConfig카메라 타입 설정하는 함수

PostConfig카메라 초기값 설정하는 함수

Update카메라에 필요한 행동을 해주는 함수 (위치 이동)
























 

mHiCal3DViewer_Module

mHiCal3DViewer

이 모듈은 Cal3d 애니메이션 모델을 사용하기 위한 HiCal3DCoreModel이라는 클래스와 HiCal3DInstanceModel이라는 클래스 그리고 mHiCal3DViewer라는 Viewer클래스로 구성되어있다.

 

이 모듈에서는 XML파싱을 해서 모델을 불러온 뒤에 화면에 그려주는 역할을 담당 하고 있다. 그리고 특정 캐릭터의 위치는 mHiInterpolator모듈과 라우트로 이어져 있기 때문에 조종 할 수가 있다.

 

-함수-

Update, Render, ParseXml,PostConfig,Realize

 

ParseXml – Xml 에 있는 내용을 파싱 하여 정보 저장하는 함수

PostConfig – Cal3dViewer에 필요한 디바이스 셋팅 과 모델 로딩하는 함수

Realize –Field SendEvent에 보내주어 Field에 연결된 Field들에게 라우트를 실행하는 함수.

Update애니메이션들을 시간에 따라 업데이트 해주도록 하는 함수

Render – Cal3dAnimation을 화면에 그려주는 함수

 

신고
Posted by 우엉 여왕님!! ghostkyow
2010.08.08 03:09
현재 게임브리오 관련 dll 들이 있어야 하는데 파일이 소실된 관계로 실행이 불가능합니다 ㅠ_ㅠ_ㅠ_ㅠ_ㅠ_ㅠ_ㅠ

(HiObjectControl의 실행화면)

ObjectTool

1)툴 소개
ObjectTool은 레이싱 게임의 장애물 및 아이템 배치를 위해 제작된 툴이다. 디자이너가 아이템 배치를 좀 더 쉽고 눈으로 보며 배치를 할 수 있도록 만든 툴이다. 화면에 보는 것 과 같이 선택한 아이템의 이동 크기 회전 을 할 수 있으며, 삭제 또한 가능하다.
 

2)툴의 개발 환경
● 하드웨어

- CPU : Intel Core Duo 2.42Ghz

- RAM : DDR3 2GB

- Graphic : Nvidia Geforce 9400M

● 소프트웨어

- OS : Window XP, Windows Vista

- Compiler : MSVC80

- SDK : Microsoft DirectX SDK(2007)

● 사용 프레임워크 및 엔진

- Framework : HiFramework – GamebryoRenderer

- Engine : Gamebryo, libxml2


 

3) 툴의 개발 과정(기술 구현 과정 및 사용된 기술)

-HiFramework 기반의 Gamebryo를 사용하기 위해 HiFramework내에 HiRenderer클래스를 상속받아 GBRenderer라는 GamebryoRenderer를 구현

-Picking 기술로 맵의 자세한 위치 산출 구현

-산출한 위치로 아이템 배치 구현

-HiFramework 기반의 MFC프레임워크를 사용 하기 위하여 Client 구현

-Tool에 필요한 Object 추가

-디자이너가 배치를 한 뒤에 저장 할 수 있도록 저장 기능 구현

-디자이너가 배치 했던 맵을 수정 할 수 있도록 불러오기 기능 구현

 

4) 툴의 클래스(HiObjectControl)

 

mHiObjectControl

이 클래스는 툴에서 사용하는 핵심 모듈 dll이다.

HiModule이라는 클래스를 상속 받았다. 이 클래스는 아이템들의 정보를 STL list vector로 관리를 하도록 한다.

 

-시스템-

아이템은 쉽고 빠르게 지우고 추가 할 수 있도록 해야 하기 때문에 list를 사용했다.

툴에서 Picking을 하기 위해 POINT클래스를 사용 하였다. 르기로 MFC클라이언트와 HandleMessage로 상호 작용 하도록 해야 하기 때문에 HandleMessage를 상속받아 재정의 했다.

 

-함수-

PostConfig ,Update ,PrintSetText  ,MouseControl, HandleMessage, FindNearObject

 

PostConfig – GamebryoRenderer를 사용하기 위하여 Renderer 초기화, 툴에서 사용될 Object들의 nif 파일(gamebryo용 확장자) 로드, Picking하기 위한 작업 초기화를 한다.

Update – mHiObjectControl에서 사용되는 처리를 이 함수에서 한다. (Ex.아이템 선택 아이템 배치 아이템 삭제 등)

PrintSetTect – 툴 에서 오브젝트의 이동,회전,크기 값을 보여주는 다이얼로그에 오브젝트의 정보를 표기하는 함수

MouseContorl – 마우스를 이용해 카메라를 조종하는 함수

FindNearObject – Picking된 시점에서 가장 가까운 Object를 선택 하여 Object return한다.

HandleMessage – MFC_Client와 상호 작용을 위해 재정의 한 함수이다. 주로 필요한 자료를 MFC_Client에서 받아 오는데에 사용 된다.

 

신고
Posted by 우엉 여왕님!! ghostkyow
2009.03.24 02:05

HiFramework의 기능

1. 메시지 기능 ( 메시지 전송 )
- HiObject를 상속받은 모든 객체는 서로 메시지를 주고 받을 수 있다.
ex) Module에서 ModuleManager에 지금 현재 루프에 돌고 있는 모듈을 정지 시키고 다음 모듈 실행 등


2. 라우트 기능 ( 값의 복사 )
-HiField간 정보 복사.
-HiField는 Module들이 가지고 있다. 그래서 Module간의 정보 공유
ex) 카메라가 캐릭터를 따라다니게 할때. 캐릭터의 좌표를 카메라의 좌표로 복사.


3. Module 확장 기능
-게임에 필요한 기능 (예, 길찾기, 카메라, 캐릭터, 지형 등)은 Kernel의 Module이란 클래스를 상속 받아서 ModuleManager로 등록한 뒤. Module을 사용 한다.
-Module을 상속받은뒤 Update, Render, PreConfig, PostConfig등 을 재정의해 사용한다.


4. 동적 라이브러리(DLL) 을 이용한 확장
-Module을 DLL로 생성 하기 때문에 Module이 추가되어도 Client를 다시 컴파일 할 필요가 없다.
-Module이나 Route 등의 조정은 XML을 통하여 조절이 가능 하므로 다시 컴파일 할 필요가 없다.

신고
Posted by 우엉 여왕님!! ghostkyow
2009.03.24 01:38
사용자 삽입 이미지
HiFramework의 구조이다.
신고
Posted by 우엉 여왕님!! ghostkyow
2009.03.23 13:12

HiFramework란?

HiFramework는 보다 쉬운 게임 제작을 위해 개발한 프레임 워크다.

프레임워크의 구조는 크게 3가지로 나뉘어 진다.

Kernel, Module, Client 로 나뉘어 진다.



HiFramework의 특징

객체지향 프레임워크로 확장성과 융통성이 강하다.

새로운 기능은 모듈을 상속받아 쉽게 추가가 가능하다.

커널을 수정하지 않고 확장이 가능하다.

Xml스크립트를 이용하여 필요한 모듈을 서술 한 뒤 해당 모듈의 DLL을 동적으로 로딩 가능.

Xml을 수정하면 모듈을 수정하지 않아도 뷰어를 조절 가능하다.

신고
Posted by 우엉 여왕님!! ghostkyow
2008.09.24 23:39
현재 엔진을 제작중이다. 엔진의 분류는 크게 2가지로 나뉘어 진다. 그 외 부수적인 것들로 xml을 로드해서 파싱 하는 것들이 포함된다.
이전글에서 Module을 소개 했고, 이번엔 그 Module을 로드하고 사용 하는
Kernel을 소개하겠다.
일단 Kernel은 n개의 Module을 가지고 있다. 모든 Module은 위 글에서 나왔듯이 가상함수 5개가 있다. 이 5가지를 Kernel에서 호출 한다. 모든 Module은 그 5개로 어떠한 Module이든 Kernel에서 사용이 가능하다.
아래는 Kernel의 구조이다.

class kwKernel                      // 모든 Modul을 관리하는 클래스
{
protected:
    kwDirect3D       *m_pD3D;          
// Direct3D 디바이스, 창의 크기 등을 가지고 있는 객체
   
std::vector<kwModule *> m_pModule;         
// Modul의 집합체

public:
    kwKernel(const std::string filename);          
// 생성자
   
kwKernel(nvXmlNode* xml);                      
// 생성자

   
kwKernel(HWND hWnd, const std::string filename);    
// 생성자
   
~kwKernel();                   
// 소멸자
//  int setXmlAttrs(nvXmlNode*xmlRoot);


   
int parseXml( nvXmlNode* xml );
    int setXmlAttrs(nvXmlNode*xml);
    int setXmlModule(nvXmlNode*);
    int setXmlRoute(nvXmlNode*);

   
// 모듈 관련
   
int     AddModule(kwModule *M);
    void    Config();              
// Modul을 셋팅 해주는 함수
   
kwModule* GetModule(int i);
    kwModule* FindModule(kwModule *M);
    inline int GetModuleNum();         
// 모듈의 개수를 리턴

    // 모듈 외 함수
   
HRESULT Initialize(HWND hWnd); 
// 게임 초기화 함수
   
void    Sync();
    void    Run();

    kwModule* FindModule(const std::string& id);
};

Kernel의 구조는 위와 같다.


중요한 함수 설명 ->
Run             = 모든 Module의 Update(), Render()를 호출 해주는 함수
parseXml        = xml을 로드 해서 Module을 로드 하거나 그 외 xml
                  파서를 해주는 함수.
Config          = 모든 Module의 PreConfig와 PostConfig 함수를
                  호출해준다.
setXmlModule    = xml파일안에 써져있는 dll들을 로드해서 Module을 생성 
                  해주는 함수.

위 함수인 Config와 ParseXml 로 Module을 로드 하고, Module을 초기화 하는 함수들을 호출 해주고, Run에서 Module에 있는 update와 render를 호출 해준다. 그러므로 모든 Module은 5가지의 가상 함수를 재정의 하기만 해서 Module을 마음데로 확장 하여서 사용이 가능하다.

그리고 배포 할때는 exe와 dll들을 같이 배포해야된다.

위 Kernel은 DirectX 용이다. 하지만 이 구조는 OpenGL이나 상관없기때문에 OpenGL용으로도 한번 만들어볼까 한다.

이상 Kernel의 소개였다.
신고
Posted by 우엉 여왕님!! ghostkyow
2008.09.24 23:20

현재 엔진을 제작중이다. 엔진의 분류는 크게 2가지로 나뉘어 진다. 그 외 부수적인 것들로 xml을 로드해서 파싱 하는 것들이 포함된다.
한가지는 Module
Module은 각각 Module마다 dll 로 확장 하는 객체이다.
Module의 클래스는


// Modul 클래스 모든 Modul의 부모 클래스
class KW3D_DLL kwModule : public nvObject
{
protected:
    int m_iModuleID;                   
// 모듈이 어떤 모듈인지
   
LPDIRECT3DDEVICE9 m_pDev;      
// 디바이스
   
nvXmlNode *m_pXml;

    int m_nFrame;
public:
    kwModule();                
// 생성자
   
virtual ~kwModule() {}                     
// 소멸자

   
virtual void PreConfig() {} ;
    virtual void PostConfig() {} ;
    virtual void Sync() {} ;           
// 싱크 부분
   
virtual void Update() {};          
// 업데이트 어떠한 동작들
   
virtual void Render() {};          
// 최종적으로 할 작업들

   
void SetModuleID(int iID);     
// ModulID셋팅
   
void SetDev(const LPDIRECT3DDEVICE9 &pDev);    
// 디바이스 셋팅
   
inline int GetModuleID() { return m_iModuleID; }           
// ModulID를 얻어온다

   
static kwModule* load(  const std::string& className,
                            const std::string& dsoName="",
                             nvXmlNode*xml=NULL ); // Xml에서 모듈 로드

    virtual int setXmlAttrs(nvXmlNode*xml)          { return 1; }
   
//void construct();


   
virtual int parseXml(nvXmlNode*xml);


//  HINSTANCE m_instance ;  --> FreeLibrary(hInst2);


};

위와 같은 구조로 되어있고,
확장 하는 법은 kwModule클래스를 상속 받아 가상 함수들을 재정의 해서 사용 하는 식으로 사용 한다. 예를 들면 아래 클래스처럼 사용 한다.

class KW3D_DLL kwCharacterModule : public kwModule          
// 캐릭터를 관리 하는 모듈
{
protected:
    int m_nNum;                                
// Core의 갯수
   
std::vector<kwModel *> m_pModel;                   
// Model을 담아놓는 벡터
   
std::vector<kwCoreModel *>m_pCoreModel;        
// CoreModel을 담아 놓는 벡터
public:
    kwCharacterModule(nvXmlNode*xml);                           
// 생성자
   
kwCharacterModule(const LPDIRECT3DDEVICE9 &pDev,nvXmlNode*xml); 
// 디바이스를 받는 생성자
   
~kwCharacterModul();                       
// 소멸자

   
int parseXml(nvXmlNode* xmlRoot);
    int setXmlAttrs(nvXmlNode*xml);


    virtual void PreConfig();
    virtual void PostConfig();
   
    virtual void Update();                     
// 이 클래스에서 하는 처리를 해준다.(애니메이션 업데이트)
   
virtual void Render();                     
// 이 클래스에서 Update를 한뒤 최종적으로 할것들을 해준다.(애니메이션렌더링)
   
virtual void Render(int ModelIndex = -1);      
// modleindex로 모델을 그려준다

private:
    virtual void CreateModel(int CoreIndex);   
// 모델을 만드는 함수, Core의 인덱스 번호를 받아 그 코어를 가지고 있는 Instance모델을 만든다
   
virtual void CreateCoreModel(kwCoreModel *pCoreModel, std::string FileName, std::string PathName);     
// CoreModel을 로딩하는 함수
   
LPDIRECT3DTEXTURE9 LoadTexture(std::string FileName, std::string PathName, std::string SubPathName);   
// Texture을 로딩하는 함수

   
void loadingXmlModel(nvXmlNode*xmlRoot);

    virtual void SetNum(int &nNum);            
// Num을 셋팅
   
virtual LPDIRECT3DDEVICE9 GetDev() { return m_pDev; }  
// 디바이스를 리턴한다.
};

위 클래스에서 kwModule 클래스를 상속받은뒤 가상 함수들을 재정의 해준다.

가상 함수 설명 ->
PreConfig()    =  모든 Module은 초기화를 해야된다. 그럴때 맨 처음 해줘야 하는
                        초기화는 PreConfig에서 하게 된다.
PostConfig()   =  PreConfig가 된 후 그외 초기화를 해야 하는 것들을 초기화 하는
                        함수
Update()        =  모든 Module에서 매 프레임마다 처리,연산 등을 해주는 부분을
                        담당하게 된다.
Render()        =  Module중에서는 화면에 그림을 그려주는 Module도 존재 한다.
                         그런 Module에서 Render는 화면에 그림을 그려준다.
Sync()           =  모든 Module은 원하는 프레임이 실행 된 후, 남은 시간대에 처리
                         하거나 딜레이를 주는 역할을 하는 함수

함수 실행 순서 ->
초기화때  :  PreConfig() -> PostConfig()
매 프레임마다  :  Update() -> Sync() -> Render()


위 Module은 DirectX용 Module이다. OpenGL이랑 DirectX둘다 바뀌면서 가능 하게 하고 싶었지만, 아직 OpenGL은 만져본적이 없기에 보류 해뒀다.

신고
Posted by 우엉 여왕님!! ghostkyow

티스토리 툴바