CXCamera

카메라 이동에 관한 편의 클래스입니다. 마우스 조감,1인칭 시점 이동,6DOF 키보드 이동 지원합니다.

-참고 코드-

선언
CXCamera    g_CAM;

윈도우 메시지에 반응하는 함수콜 작성
LRESULT XCALLBACK UserWndProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam)
{
    g_CAM.OnMouseMSG(message,wParam,lParam);
    return 0;
}

엔진에 콜백함수 등록
xFrmWork_SetUserMsgProcCB
(UserWndProc);


카메라에 변환값 셋팅

const
XCMatrix* pMT = g_CAM.BuildTransform();
xCamera_SetTransform(*pMT);

카메라 초기 위치 제어
g_CAM.GetDestTransform()->UpdateZVector(-xCamera_GetMode()->m_aV_DL[0]);좋습니다.빛을 등지고 지정.
g_CAM.GetDestTransform()->MakeRotateXY(300,300);

- 사용법 -

오른쪽 버튼 드래그  타겟 목표 지점을 중심으로 회전
들 버튼 드래그  X,Z 평면 패닝
스페이스바 + 오른쪽 버튼 드래그  X,Z 평면 패닝
휠 조정  타겟 목표와의 거리 조정

W  전진
S  후진
R  상승
F  하강
Q  좌 슬라이드
E  우 슬라이드

6DOF 이동
A : 전진
Z : 후진

넘패드키
4,8,6,2  회전
1,3  좌우 슬라이드
-,+  상승 하강

배율값은 조작 어떤 값이든 눌러주면 적용됩니다.

LCONTROL 10 배 배율
LALT 100배 배율
LALT + LCONTROL : 1000배 배율

class CXCamera
{
public:
CXCamera();
CXCamera(float fRho);

void Destroy();

void Init();
void ResetPos();
virtual void ChkRho();

void MoveUpdate(XCCollisionData& COLDATA);
void OnEventPush(int iMX,int iMY);
void OnEventDoublePushR(int iMX,int iMY);

void OnEventDragL(int iDX,int iDY);
void OnEventDragR(int iDX,int iDY);
void OnEventDragM(int iDX,int iDY);
void OnEventWheel(int iWHEEL);

void OnMouseMSG(eEVENTSTATE eEVENT);
int OnMouseMSG(UINT message,WPARAM wParam,LPARAM lParam);

void SetTarget(const XCPoint& P);
좋습니다.카메라가 쳐다볼 목표 지점 지정. m_fCurRho 거리만큼 떨어져셔 쳐다 봅니다.
XCPoint* GetTarget( ) { return &m_PT; } 좋습니다.관찰 목표 지점 구하기
XCPoint* GetCurTarget() { return &m_PCURT;}

const XCMatrix* GetTransform() { return &m_MT; }

void SetRho(float fRho) { m_fCurRho = fRho; SetDestRho(fRho); }
좋습니다.조감 목표 지점 까지의 관찰 거리를 설정 합니다.

float GetDestRho() { return m_fDestRho; }
좋습니다. Rho가 최종 변할 수치. 반영되어 있는 현재 Rho 값이라 볼수 있다.
float SetDestRho(float fRho);

void ResetTarget();
virtual void MoveProcess(XCVector& VD);
void MoveTarget(int iINDEX,float fDEG);

const XCMatrix* BuildTransform(bool bRunKey = true,CRootModel* pCHAR = NULL);

XCMatrix* LoadTXT(PCSTR sFILE);
좋습니다.카메라 셋팅을 로드합니다.
XCMatrix* LoadTXT(X_FILE hFILE);
좋습니다.카메라 셋팅을 로드합니다.
void SaveTXT(FILE* pFILE) const;
좋습니다.카메라 셋팅을 저장합니다.

protected:

eNAVIGATE_MODE m_eNAVIGATE_MODE;
public:
void SetNavigateMode(eNAVIGATE_MODE eMODE);
eNAVIGATE_MODE GetNavigateMode() const { return m_eNAVIGATE_MODE; }


public:
void ShowHelp();

protected:
void RunKey();

protected:
XCMatrix m_MTARGET;

public:
float m_fDestRho;
float m_fCurRho;

XCPoint m_PT;
좋습니다.회전 조감할 목표점!
XCPoint m_PCURT;

XCMatrix6DOF m_MT;

XCMatrix* GetDestTransform() { return &m_MTARGET; }
좋습니다.회전 조감 행렬을 되돌립니다.

public:
X_MODEL m_hAniCamera;
XCANIInfo m_ANIInfo;

void LoadAniCamera(PCSTR sFILE);
const XCMatrix* TraceAniModel();

public:
int m_iOldMX,m_iOldMY;
int m_iDX,m_iDY;

protected:
bool m_bChkColRho;좋습니다.Rho를 충돌 처리 할것인가.
public:
bool GetEnableChkColRho() const { return m_bChkColRho; }
void SetEnableChkColRho(bool bFLAG) { m_bChkColRho = bFLAG; }
좋습니다.지정된 월드와 모델과의 카메라 충돌 처리를 합니다.

public:
bool m_bUseDragR;

protected:
CWorld* m_pWORLD;
X_MODEL* m_phMODEL;
public:
CWorld* GetWorld() const { return m_pWORLD; }
virtual void SetDEST(CWorld* pWORLD,X_MODEL* phMODEL);
좋습니다.카메라의 목표가 될 월드와 모델을 지정합니다.

protected:
XCCollisionData m_COLDATA_RET;
XCCollisionData m_COLDATA_RHO;
public:
void GetCOLDATA(XCCollisionData& COLDATA,int iMX,int iMY);

void RenderDEBUG();

XCCollisionData* GetChkRowCOLDATA() { return &m_COLDATA_RHO; }
좋습니다.카메라 충돌 검사용 클래스 구함

좋습니다.GetChkRowCOLDATA()->SetAttrCollisonMask(CHKCOLLISION_VISIBLE,true);
보이는 오브젝트만 충돌 검사
좋습니다.GetChkRowCOLDATA()->SetAttrCollisonMask(CHKCOLLISION_COLOBJ,true); 충돌 설정된 오브젝트만 충돌 검사
좋습니다.GetChkRowCOLDATA()->SetAttrCollisonMask(CHKCOLLISION_VISIBLE | CHKCOLLISION_COLOBJ,true); 충돌,보이는 오브젝트만 충돌 검사
좋습니다.GetChkRowCOLDATA()->SetAttrCollisonMask(CHKCOLLISION_EXCEPTALPHA,true); 알파 채널을 가진 텍스춰를 포함한 오브젝트는 충돌 배제

XCCollisionData* GetPicikngCOLDATA() { return &m_COLDATA_RET; }
좋습니다.카메라 충돌 검사용 클래스 구함

protected:
float m_fFollowRotateVAL;
float m_fFollowPositionVAL;
float m_fFollowRhoVAL;
public:
void SetFollowRotateVAL(float fVAL) { m_fFollowRotateVAL = fVAL; }
좋습니다.0-1 사이 값으로 캐릭터 회전값을 추적할때 쓰는값. 1이면 100% 캐릭터를 바로 추적합니다. 카메라 추적 탄성 계수 값.
float GetFollowRotateVAL() const { return m_fFollowRotateVAL; }

void SetFollowPositionVAL(float fVAL) { m_fFollowPositionVAL = fVAL;}
좋습니다.0-1 사이 값으로 캐릭터 위치값을 추적할때 쓰는값. 1이면 100% 캐릭터를 바로 추적합니다. 카메라 추적 탄성 계수 값.
float GetFollowPositionVAL() const { return m_fFollowPositionVAL;}

void SetFollowRhoVAL(float fVAL) { m_fFollowRhoVAL = fVAL; }
좋습니다.0-1 사이 값으로 카메라 길이(Rho)값을 추적할때 쓰는값. 1이면 100% 캐릭터를 바로 추적합니다. 카메라 추적 탄성 계수 값.
float GetFollowRhoVAL() const { return m_fFollowRhoVAL; }

protected:
eTRACE_MODE m_eTRACE_MODE;
public:
eTRACE_MODE GetTraceMode() const { return m_eTRACE_MODE; }
void SetTraceMode(eTRACE_MODE eMODE) { m_eTRACE_MODE = eMODE; }
};
 


CSkySun

class CSkySun
{
public:
    CSkySun();

    void        Destroy();
    void        Render();                
매 프레임마다 렌더링 불러줍니다.
    void        LoadSkyBox(PCSTR sPATH); *.db3 형태의 스카이 박스 데이터를 부릅니다.
    void        LoadSUN(PCSTR sPATH);    
*.db3 의 태양 데이터를 부릅니다.

protected:
    X_MODEL     m_hSkyBOX;
    X_MODEL     m_hSUN;
};

* 스카이박스     
SDK\data\3D\world\world2\Sky\sky.db3
를 벤치마킹 해서 만들면됩니다. 기본적으로 2개의 돔형 구조( 사각박스라도 상관없다)
이고 바깥쪽은 하늘배경,안쪽은 구름을 가지고 있으면 되고 구름 오브젝트는 조금씩 Y축으로 회전합니다.

* 태양
SDK\data\3D\world\world2\Sky\sun.db3를 벤치마킹 하면 됩니다. 그냥 간단한 플레인


CRootObj

virtual bool     Load(PCSTR sFILE) 로드!
virtual void     Move(const XCVector& V); V만큼 이동

virtual X_MODEL  GetModel()
모델 구함
virtual void     SetModel(X_MODEL hMODEL) 모델 지정

virtual void     SetPosition(const XCVector& P)
위치 지정

virtual XCMatrix* GetTransform()
변환 행렬 구함
virtual void     SetTransform(const XCMatrix& MT)  변환 행렬 지정


virtual XCVector* GetMovingVector()
이동 변위 벡터를 얻습니다.
virtual void     SetMovingVector(const XCVector& V)    이동 벡터를 지정합니다.

virtual void     GetBackPoint(XCPoint& P,float fVAL); 
m_VZ 쪽으로 -fVAL만큼 떨어진 위치를 구합니다.
virtual XCPoint* GetPosition() 위치를 구합니다.

virtual void     ChangeScale(const XCVector& VS);
스케일 변환

virtual bool     SaveTransform(PCSTR sFILE);
현재 변환트랜스폼 지정
virtual bool     LoadTransform(PCSTR sFILE); 변환 트랜스폼 로드

virtual void     ChangeModel(X_MODEL hMODEL);
모델 체인지

void             RotateZWithSoftValue(float fVAL,const XCVector& V);
m_VZ 축을 fVAL정도의 레벨로 V축으로 추적합니다.

virtual const XCPoint* GetPtrSrcHeight() { return NULL; }
카메라가 조감할 CRootObj의 높이를 구함

void             SetReviceSrcHeight(float fVAL)
카메라가 조감할 CRootObj의 높이의 보정값
float            GetReviceSrcHeight()

void             SetReviceDestHeight(float fVAL)
카메라 자체의 높이 보정값
virtual float    GetReviceDestHeight()

 

CBasicChar

XCCollisionDataInfo*     DoPointMove(int iMX,int iMY);    
해당 지점으로 캐릭터가 움직인다. 마우스좌표( 스크린좌표 )를 가지고 충돌검사를 합니다음에 그 지점으로 이동합니다.

void            DoMove(const XCPoint& P)
3d 좌표를 가지고 그 지점으로 움직입니다.

ex) 앞으로 전진 구현
PD = *g_CHAR.GetPtrPosition() + g_CHAR.GetTransform()->m_VZ * 16;
g_CHAR.DoMove( PD );        

void            Load(PCSTR sFILE)                
캐릭터 데이터를 로드합니다.

void            SetScale(float fVAL);                             
캐릭터 전체 스케일을 지정합니다.

void            SetMovingDEG(float fVAL)
캐릭터에 한번에 이동하는 거리를 지정합니다.

ex) tut_Collision1 예제 참조

 


CWorldRenderOPT

bool m_bShowTerrain; 지형을 보여줄것인가.
bool m_bShowWire; 지형을 와이어 프레임으로 보여줄것인가.
bool m_bShowNormal; 지형의 노말 벡터를 보여줄것인가.
bool m_bShowWaterGuide; 해수면을 보여줄것인가.
bool m_bLOD; LOD처리를 할것인가.
bool m_bShowElevColor; 지형을 높이 칼라 맵으로 출력할것인가.
bool m_bShowGrayElevColor; 지형을 그레이 높이 칼라 맵으로 출력할것인가.
float m_fWaterHeight; 수면 높이 지정
int m_iSkipValue; LOD 스킵 수치 지정
 

CWorld

bool     CreateTWorld(PCSTR sFILE,bool bOptimize); 지형을 생성합니다. bOptimize는 속도가 빠르지만 편집 불가능한 모드 입니다.
void     DestroyTWorld(); 지형 파괴

bool     CreateWorld(PCSTR sFILE,XCColorSystem* pCCS); pCCS는 블럭 월드 전체에 적용되는 칼라 시스템입니다. NULL이면 초기치.
void     DestroyWorld(); 블럭 월드 파괴

bool     CreateGrass(PCSTR sFILE); 그래스 생성
void     DestroyGrass(); 그래스 파괴

bool     CreateSky(PCSTR sFILE_SKY); 스카이,태양,물 설정
void     DestroySkySun(); 스카이,태양 파괴

DWORD    RenderWorld(
eBLKRENDER_TYPE eTYPE,bool bDEBUG); 블럭월드 렌더링
void     RenderTWorld(
eBLKRENDER_TYPE eTYPE); 지형월드 렌더링
void     RenderGrass(
eBLKRENDER_TYPE eTYPE); 그래스 렌더링
void     RenderSkySun(); 스카이,태양 렌더링
void     RenderAlphaRace(bool bWATER = true); 알파 속성 관련 전체 렌더링, bWATER ( 해수면도 렌더링 할지 여부)

void     Render(
eBLKRENDER_TYPE eTYPE); 전체 렌더링

int      DoCollision(XCCollisionData* pCOLDATA,eBLOCK_TYPE eTYPE = BLOCK_9,bool bChkZeroPlane = false) const;
충돌 처리 함수
eTYPE : 주변 몇 블럭을 충돌 처리 할것인가. 적게 잡아줄수록 속도가 빠릅니다.
bChkZeroPlane : 월드가 없을 경우 평면 제로와 충돌 처리를 할것인가.

X_WORLD  GetTWorld()  지형월드 핸들 구함
X_WORLD  GetWorld()  블럭 월드 핸들 구함

bool     IsWorld()  월드가 존재하는지 여부

CGrassBlkCol* GetGrass()  그래스 구함

CWorldRenderOPT* GetOPT()  월드 렌더 옵션을 구합니다.

void     SetEnableCollision(bool bCOL_WORLD,bool bCOL_TWORLD,bool bCOL_GRASS) 
월드의 각 모듈별로 충돌 처리 할건지 지정합니다.

void     SetEnableRender(bool bWORLD,bool bTWORLD,bool bGRASS,bool bSKYSUN,bool bLENS)
각 모듈의 렌더링 여부.
bWORLD ( 블럭 월드 )
bTWORLD ( 지형 월드 )
bGRASS ( 그래스 시스템 )
bSKYSUN ( 스카이 선 )
bLENS ( 렌즈 플레어 )
 


CModelCOL

모델 리소스 공유를 위해 관리 하는 클래스.
파일이름 검사해서 미리 로드되어 있다면 그 핸들을 돌리고 로드되어 있지 않으면 로드를 합니다.


 


CSkipper